技术开发 频道

C/C++项目中的代码复用和管理


    最直觉的做法,就是这样来实现:

bool check( const vector< condition * > &conditions)
{
unsigned int i;
bool result = true;
for(i=0;i<conditions.size();++i)
{
if(conditions[i]->check_type == “Hardware”)
resulte &&= HardwareCheck(condition->param1,condition->param2);
else if(conditions[i]->check_type == “Registry”)
resulte &&= RegistryCheck(condition->param1,condition->param2);
else if(conditions[i]->check_type == “OS”)
resulte &&= OSCheck(condition->param1,condition->param2);
else if(conditions[i]->check_type == “Process”)
resulte &&= ProcessCheck(condition->param1,condition->param2);
… …
}
}
    以上的if … else if不但难看而且长。更重要的是,这非常的没有可扩展性。这个check组件,必须依赖于一系列的实现非常复杂的模块,比如HardwareCheck, RegisterCheck, OsCheck, ProcessCheck,没有其中任何一个的实现就无法操作。实施上,这个check是没有任何可复用性的。

    原则5 当我要创建我并不关心其实现的类的时候,我使用工厂类创建他们。

六 如何复用代码

   上面讲了很多,都是说如何让代码具有可复用性。但是如果我们不知道如何复用代码,那么再有可复用性的代码,也是浪费。

    在我们的实际开发中,常常以拷贝代码的方式来复用代码。这包括某段代码的拷贝,或者是几个文件的拷贝。我倒是要提出一个我认为最基本的编码原则:

    原则6 除非万不得已,永远也不要拷贝代码。

    如果我们把代码在一个工程内部进行拷贝,说明这个工程内部有部分代码必然是重复的。作为高效率的开发者,为何要编写重复的代码,而不直接复用他们呢?这说明代码的设计有问题,或者是开发人员出于一时的方便起见,做出了敷衍的操作。

    如果我们把代码在一个工程拷贝到另外一个工程。说明我们实际上已经写出了可以在工程之间通用的代码。这样的代码,是经过至少一个工程的考验的,我们为何不直接使用它们,而要另外拷贝一份呢?代码的拷贝,至少有以下几个缺点:

1. 如果这份代码是没有bug的。那么在拷贝过程中,可能出现bug。

2. 如果这份代码是有bug的,那么在拷贝过程中,bug也被复制了。bug会传染到其他的工程组件,甚至其他的工程项目中。

所谓的代码复用,我打算给出一个定义如下:

定义1. 所谓代码的复用,是指不拷贝的使用同一份代码。
0
相关文章