成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

面向?qū)ο蠡驹瓌t(1)- 單一職責(zé)原則與接口隔離原則

lunaticf / 2486人閱讀

摘要:面向?qū)ο蠡驹瓌t單一職責(zé)原則與接口隔離原則面向?qū)ο蠡驹瓌t單一職責(zé)原則與接口隔離原則面向?qū)ο蠡驹瓌t里式代換原則與依賴倒置原則面向?qū)ο蠡驹瓌t最少知道原則與開閉原則一單一職責(zé)原則單一職責(zé)原則簡(jiǎn)介單一職責(zé)原則的英文名稱是,簡(jiǎn)稱。

面向?qū)ο蠡驹瓌t(1)- 單一職責(zé)原則與接口隔離原則

面向?qū)ο蠡驹瓌t(1)- 單一職責(zé)原則與接口隔離原則
面向?qū)ο蠡驹瓌t(2)- 里式代換原則與依賴倒置原則
面向?qū)ο蠡驹瓌t(3)- 最少知道原則與開閉原則


一、單一職責(zé)原則 1. 單一職責(zé)原則簡(jiǎn)介

單一職責(zé)原則的英文名稱是 Single Responsibility Principle,簡(jiǎn)稱SRP。
單一職責(zé)原則的原話解釋是:

There should never be more than one reason for a class to change.

意思是:應(yīng)該有且僅有一個(gè)原因引起類的變更。

2. 單一職責(zé)原則優(yōu)點(diǎn)

類的復(fù)雜性降低,實(shí)現(xiàn)什么職責(zé)都有清晰明確的定義。

可讀性提高,復(fù)雜性降低,那當(dāng)然可讀性提高了。

可維護(hù)性提高,可讀性提高,那當(dāng)然更容易維護(hù)了。

變更引起的風(fēng)險(xiǎn)降低,變更是必不可少的,如果接口的單一職責(zé)做得好,一個(gè)接口修改只對(duì)相應(yīng)的實(shí)現(xiàn)類有影響,對(duì)其他的接口無影響,這對(duì)系統(tǒng)的擴(kuò)展性、維護(hù)性都有非常大的幫助。

3. 最佳實(shí)踐

接口一定要做到單一職責(zé),類的設(shè)計(jì)盡量做到只有一個(gè)原因引起變化。

注意 單一職責(zé)原則提出了一個(gè)編寫程序的標(biāo)準(zhǔn),用“職責(zé)”或“變化原因”來衡量接口或類設(shè)計(jì)得是否優(yōu)良,但是“職責(zé)”和“變化原因”都是不可度量的,因項(xiàng)目而異,因環(huán)境而異。
4. Show me the code
代碼使用PHP7.2語法編寫
用戶業(yè)務(wù)場(chǎng)景

IUserBo 接口負(fù)責(zé)用戶屬性

interface IUserBo
{
    public function setUserID(string $userID);

    public function getUserID() : string ;

    public function setPassword(string $password);

    public function getPassword() : string ;

    public function setUserName(string $userName);

    public function getUserName() : string ;
}

IUserBiz 接口負(fù)責(zé)用戶行為

interface IUserBiz
{
    public function changePassword(string $password) : bool ;

    public function deleteUser(IUserBo $userBo) : bool ;

    public function mapUser(IUserBo $userBo);

    public function addOrg(IUserBo $userBo, int $orgID) : bool;

    /**
     * 給用戶添加角色
     * @param IUserBo $userBo
     * @param int $roleID
     * @return bool
     */
    public function addRole(IUserBo $userBo, int $roleID) : bool ;
}

UserInfo 類實(shí)現(xiàn) IUserBo, IUserBiz 兩個(gè)接口

class UserInfo implements IUserBo, IUserBiz
{
    public function setUserID(string $userID)
    {
        // TODO: Implement setUserID() method.
    }

    public function getUserID(): string
    {
        // TODO: Implement getUserID() method.
    }

    public function setPassword(string $password)
    {
        // TODO: Implement setPassword() method.
    }

    public function getPassword(): string
    {
        // TODO: Implement getPassword() method.
    }

    public function setUserName(string $userName)
    {
        // TODO: Implement setUserName() method.
    }

    public function getUserName(): string
    {
        // TODO: Implement getUserName() method.
    }

    public function changePassword(string $password): bool
    {
        // TODO: Implement changePassword() method.
    }

    public function deleteUser(IUserBo $userBo): bool
    {
        // TODO: Implement deleteUser() method.
    }

    public function mapUser(IUserBo $userBo)
    {
        // TODO: Implement mapUser() method.
    }

    public function addOrg(IUserBo $userBo, int $orgID): bool
    {
        // TODO: Implement addOrg() method.
    }

    public function addRole(IUserBo $userBo, int $roleID): bool
    {
        // TODO: Implement addRole() method.
    }
}
$userInfo = new UserInfo();
// 賦值,就認(rèn)為它是一個(gè)純粹的屬性
$userInfo->setPassword("abc");
// 執(zhí)行動(dòng)作,就認(rèn)為是一個(gè)業(yè)務(wù)邏輯類
$userInfo->deleteUser($userInfo);
二、接口隔離原則 1. 接口隔離原則簡(jiǎn)介

接口隔離原則的英文名稱是 Interface Segregation Principle,簡(jiǎn)稱ISP。
接口隔離原則的英文定義有兩種:

Clients should not be forced to depend upon interfaces that they don"t use.
客戶端不應(yīng)該被迫依賴于他們不使用的接口。

The dependency of one class to another one should depend on the smallest possible interface.
類間的依賴關(guān)系應(yīng)該建立在盡可能小的接口上。

我們可以把這兩個(gè)定義概括為一句話:建立單一接口,不要建立臃腫龐大的接口。
再通俗一點(diǎn)講:接口盡量細(xì)化,同時(shí)接口中的方法盡量少。

接口隔離原則與單一職責(zé)的區(qū)別

接口隔離原則與單一職責(zé)的審視角度是不相同的。
單一職責(zé)要求的是類和接口職責(zé)單一,注重的是職責(zé),這是業(yè)務(wù)邏輯上的劃分,而接口隔離原則要求接口的方法盡量少。
例如一個(gè)接口的職責(zé)可能包含10個(gè)方法,這10個(gè)方法都放在一個(gè)接口中,并且提供給多個(gè)模塊訪問,各個(gè)模塊按照規(guī)定的權(quán)限來訪問,在系統(tǒng)外通過文檔約束“不使用的方法不要訪問”,按照單一職責(zé)原則是允許的,按照接口隔離原則是不允許的,因?yàn)樗蟆氨M量使用多個(gè)專門的接口”。專門的接口就是指提供給每個(gè)模塊的都應(yīng)該是單一接口,而不是建立一個(gè)龐大的臃腫的接口,容納所有的客戶端訪問。

2. 接口隔離原則的規(guī)范 接口要盡量小

這是接口隔離原則的核心定義,不出現(xiàn)臃腫的接口(Fat Interface)。
但是“小”是有限度的,根據(jù)接口隔離原則拆分接口時(shí),首先必須滿足單一職責(zé)原則。

接口要高內(nèi)聚

高內(nèi)聚就是提高接口、類、模塊的處理能力,減少對(duì)外的交互。
具體到接口隔離原則就是,要求在接口中盡量少使用public方法,接口是對(duì)外的承諾,承諾越少對(duì)系統(tǒng)的開發(fā)越有利,變更的風(fēng)險(xiǎn)也就越少,同時(shí)也有利于降低成本。

接口只提供訪問者需要的方法 接口設(shè)計(jì)要適度

接口的設(shè)計(jì)粒度越小,系統(tǒng)越靈活,這是不爭(zhēng)的事實(shí)。但是,靈活的同時(shí)也帶來了結(jié)構(gòu)的復(fù)雜化,開發(fā)難度增加,可維護(hù)性降低,這不是一個(gè)項(xiàng)目或產(chǎn)品所期望看到的,所以接口設(shè)計(jì)一定要注意適度。

3. 最佳實(shí)踐

接口隔離原則是對(duì)接口的定義,同時(shí)也是對(duì)類的定義,接口和類盡量使用原子接口或原子類來組裝。關(guān)于原子該怎么劃分,在實(shí)踐中可以根據(jù)以下幾個(gè)規(guī)則來衡量:

一個(gè)接口只服務(wù)于一個(gè)子模塊或業(yè)務(wù)邏輯;

通過業(yè)務(wù)邏輯壓縮接口中的public方法,接口時(shí)常去回顧,盡量讓接口達(dá)到“滿身筋骨肉”,而不是“肥嘟嘟”的一大堆方法;

已經(jīng)被污染了的接口,盡量去修改,若變更的風(fēng)險(xiǎn)較大,則采用適配器模式進(jìn)行轉(zhuǎn)化處理;

每個(gè)項(xiàng)目或產(chǎn)品都有特定的環(huán)境因素,環(huán)境不同,接口拆分的標(biāo)準(zhǔn)就不同。深入了解業(yè)務(wù)邏輯,根據(jù)經(jīng)驗(yàn)和常識(shí)決定接口的粒度大小。接口粒度太小,導(dǎo)致接口數(shù)據(jù)劇增,開發(fā)人員嗆死在接口的海洋里;接口粒度太大,靈活性降低,無法提供定制服務(wù),給整體項(xiàng)目帶來無法預(yù)料的風(fēng)險(xiǎn)


參考文獻(xiàn):《設(shè)計(jì)模式之禪》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31574.html

相關(guān)文章

  • Java-001-面向對(duì)象

    摘要:?jiǎn)我宦氊?zé)原則可以看做是低耦合高內(nèi)聚在面向?qū)ο笤瓌t上的引申,將職責(zé)定義為引起變化的原因,以提高內(nèi)聚性來減少引起變化的原因。抽象的穩(wěn)定性決定了系統(tǒng)的穩(wěn)定性,因?yàn)槌橄笫遣蛔兊?,依賴于抽象是面向?qū)ο笤O(shè)計(jì)的精髓,也是依賴倒置原則的核心。 Java-面向?qū)ο?什么是面過程 把題分解成一個(gè)一個(gè)步驟,每個(gè)步驟用函數(shù)實(shí)現(xiàn),依次調(diào)用即可。就是說,在進(jìn)行面向過程 編程的時(shí)候,不需要考慮那么多,上來先定義一個(gè)...

    gekylin 評(píng)論0 收藏0
  • PHP面向對(duì)象設(shè)計(jì)五大原則(SOLID)梳理總結(jié)

    摘要:設(shè)計(jì)原則梳理,參考核心技術(shù)與最佳實(shí)踐敏捷開發(fā)原則模式與實(shí)踐,文章面向?qū)ο笤O(shè)計(jì)的五大原則設(shè)計(jì)模式原則單一職責(zé)原則定義特性僅有一個(gè)引起類變化的原因一個(gè)類只承擔(dān)一項(xiàng)職責(zé)職責(zé)變化的原因避免相同的職責(zé)分散到不同的類,功能重復(fù)問題一個(gè)類承擔(dān)的職責(zé)過多, PHP設(shè)計(jì)原則梳理,參考《PHP核心技術(shù)與最佳實(shí)踐》、《敏捷開發(fā)原則、模式與實(shí)踐》,文章PHP面向?qū)ο笤O(shè)計(jì)的五大原則、設(shè)計(jì)模式原則SOLID 單一...

    王晗 評(píng)論0 收藏0
  • 設(shè)計(jì)模式六大原則(PHP)

    摘要:常用的六大設(shè)計(jì)模式有單一職責(zé)原則,里氏替換原則,依賴倒轉(zhuǎn)原則,接口隔離原則,迪米特法則,開閉原則。這六大原則是最虛,最抽象的,很難理解。這就是接口隔離原則。當(dāng)我們遵循前面介紹的五大原則,以及使用種設(shè)計(jì)模式的目的就是遵循開閉原則。   設(shè)計(jì)模式的目的是為了更好的代碼重用性,可讀性,可靠性和可維護(hù)性。常用的六大設(shè)計(jì)模式有:?jiǎn)我宦氊?zé)原則(SRP),里氏替換原則(LSP),依賴倒轉(zhuǎn)原則(DIP...

    bluesky 評(píng)論0 收藏0
  • PHP面向對(duì)象設(shè)計(jì)的五大原則

    摘要:面向?qū)ο笤O(shè)計(jì)的五大原則單一職責(zé)原則接口隔離原則開放封閉原則替換原則依賴倒置原則。主要是針對(duì)繼承的設(shè)計(jì)原則,繼承與派生多態(tài)是的主要特性。 面向?qū)ο笤O(shè)計(jì)的五大原則:?jiǎn)我宦氊?zé)原則、接口隔離原則、開放-封閉原則、替換原則、依賴倒置原則。這些原則主要是由Robert C.Martin在《敏捷軟件開發(fā)——原則、方法、與實(shí)踐》一書中總結(jié)出來,這五大原則也是23種設(shè)計(jì)模式的基礎(chǔ)。 單一職責(zé)原則 Sin...

    adam1q84 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式-六大原則

    摘要:依賴倒置原則是個(gè)設(shè)計(jì)原則中最難以實(shí)現(xiàn)的原則,它是實(shí)現(xiàn)開閉原則的重要途徑,依賴倒置原則沒有實(shí)現(xiàn),就別想實(shí)現(xiàn)對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉。 1、單一職能原則(Single Responsibility Principle, SRP) 定義 There should never be more than one reason for a class to change.應(yīng)該有且僅有一個(gè)原因引起類的...

    molyzzx 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<