从“概念的完整性”角度对复杂类进行分拆
黄国强 2008-9-26
“人月神化”这本书最早提出了“概念的完整性”这个重要的概念。下面的例子是利用这个原理来分拆一个复杂类。下面是 CSample 的头文件:
class CSample
{
...
private:
int a;
int b;
int c; // 必须在任何时候都保证 c 等于 a+b
int d;
int e;
int f; // 必须在任何时候都保证 f = d*e
...
};
显然,这个类承担了两条规则的保证。而且,两条规则之间没有任何关系。因而,我们可以重构为如下代码的形式。
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;
};
显然,重构后的CSample的代码少了很多。更容易保持内部的规则的一致性。因为它把部分规则委托给其他类来保证。总结一下,在“按契约设计”(design by contract)理论中的不变式讲的就是一个类在任何操作完成后,都有一些不变的规则。这些规则的完整统一的维护是类的主要职责,这些不变规则的全部构成了这个类的概念完整性。
黄国强 2008-9-26
“人月神化”这本书最早提出了“概念的完整性”这个重要的概念。下面的例子是利用这个原理来分拆一个复杂类。下面是 CSample 的头文件:
class CSample
{
...
private:
int a;
int b;
int c; // 必须在任何时候都保证 c 等于 a+b
int d;
int e;
int f; // 必须在任何时候都保证 f = d*e
...
};
显然,这个类承担了两条规则的保证。而且,两条规则之间没有任何关系。因而,我们可以重构为如下代码的形式。
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;
};
显然,重构后的CSample的代码少了很多。更容易保持内部的规则的一致性。因为它把部分规则委托给其他类来保证。总结一下,在“按契约设计”(design by contract)理论中的不变式讲的就是一个类在任何操作完成后,都有一些不变的规则。这些规则的完整统一的维护是类的主要职责,这些不变规则的全部构成了这个类的概念完整性。