C++技巧“概念的完整性”角度對復(fù)雜類進(jìn)行分拆

字號:

“人月神化”這本書最早提出了“概念的完整性”這個重要的概念。下面的例子是利用這個原理來分拆一個復(fù)雜類。下面是 CSample 的頭文件:
    class CSample
    {
    ...
    private:
    int a;
    int b;
    int c; // 必須在任何時候都保證 c 等于 a+b
    int d;
    int e;
    int f; // 必須在任何時候都保證 f = d*e
    ...
    };
    顯然,這個類承擔(dān)了兩條規(guī)則的保證。而且,兩條規(guī)則之間沒有任何關(guān)系。因而,我們可以重構(gòu)為如下代碼的形式。
    class CSample_1
    {
    ...
    private:
    int a;
    int b;
    int c; // 必須在任何時候都保證 c 等于 a+b
    };
    class CSample_2
    {
    ...
    private:
    int d;
    int e;
    int f; // 必須在任何時候都保證 f = d*f
    };
    class CSample
    {
    ...
    private:
    CSample_1 m_1;
    CSample_2 m_2;
    };
    顯然,重構(gòu)后的CSample的代碼少了很多。更容易保持內(nèi)部的規(guī)則的一致性。因為它把部分規(guī)則委托給其他類來保證。總結(jié)一下,在“按契約設(shè)計”(design by contract)理論中的不變式講的就是一個類在任何操作完成后,都有一些不變的規(guī)則。這些規(guī)則的完整統(tǒng)一的維護(hù)是類的主要職責(zé),這些不變規(guī)則的全部構(gòu)成了這個類的概念完整性。