兩個原則解釋高內聚和低耦合

高內聚、低耦合是軟件設計中很是關鍵的概念,但解釋起來並不那麼容易。
個人解釋,能夠歸納爲兩個基本原則:層次一致的抽象,以及相互獨立的封裝。算法

層次一致的抽象

在Web工程中,咱們很是熟悉的是三層架構:展現層、業務層和持久層。
層次一致和不一致的抽象就像這樣:

若是業務層包含了持久層的代碼,或者持久的的代碼放到了展現層,這即是破壞了代碼的抽象層次。
一樣的:
若是工具類包含了業務方法成員或字段,這就破壞了類的抽象;
若是查詢方法包含了排序算法,這就破壞了方法的抽象;
...
抽象層次也能夠更加的往上:
若是在業務服務裏,部署了分佈式緩存服務,這就破壞了服務的抽象。
若是負載集羣裏包含的業務集羣,這就破壞了集羣的抽象。
也就是,系統應該體現出良好的層次性,儘量不出現跨層次調用,並保證同一層的元素是同一抽象層次。
這裏舉個方法的抽象層次的例子:緩存

public Foo(){
        initServer();
    }
    private void initServer() {
        // do something
         initClient();
    }
    private void initClient() {
        // do something
    }

其中,initServer,initClient兩方法從邏輯上講應該是同一抽象層次,因此讓initServer去執行initClient是不恰當的。
恰當的抽象以下,讓更上層的構造函數執行initClient。架構

public Foo(){
        initServer();
        initClient();
    }
    private void initServer() {
        // do something
      }
    private void initClient() {
        // do something
    }

相互獨立的封裝

那麼如何更好的實現抽象,以保證高內聚、低耦合呢?
第二個原則是相互獨立的封裝。
相互獨立的封裝和相互不獨立的封裝就像這樣:

相互獨立,更通俗的點講就是一個類、一個方法只作一件事情。
它有兩層含義。
首先是與外部的相互獨立,好比,類與類之間要邏輯獨立,僅經過少許接口實現交互。若是類自己的字段使用得很少,反而過多的使用了另外一個類的字段,那麼就要考慮是否是要從新封裝兩個類。
其次是內部的獨立性,類應該是一個對象的抽象,貓類不能帶上狗尾巴;一個方法最好只包含一份職責,不要即控制流程,又處理業務。分佈式

層次一致的抽象,相互獨立的封裝,作到這兩點,讓程序在垂直方向上井井有條,在水平方向上相互獨立,這就是理想中高內聚、低耦合的軟件架構。函數

做者

相關文章
相關標籤/搜索