對第一次接觸到C++代碼編制的用戶和學者來說,了解C++語言的概念是非常重要的,那麼就先說一下什麼是C++語言,所謂C++語言:是一種使用非常廣泛的計算機編程語言。
在我們的實際開發中,常常以拷貝C++代碼的方式來復用代碼。這包括某段代碼的拷貝,或者是幾個文件的拷貝。我倒是要提出一個我認為最基本的編碼原則:原則6 除非萬不得已,永遠也不要拷貝代碼。
如果我們把代碼在一個工程內部進行拷貝,說明這個工程內部有部分代碼必然是重復的。作為高效率的開發者,為何要編寫重復的代碼,而不直接復用他們呢?這說明代碼的設計有問題,或者是開發人員出於一時的方便起見,做出了敷衍的操作。
如果我們把C++代碼在一個工程拷貝到另外一個工程。說明我們實際上已經寫出了可以在工程之間通用的代碼。這樣的代碼,是經過至少一個工程的考驗的,我們為何不直接使用它們,而要另外拷貝一份呢?代碼的拷貝,至少有以下幾個缺點:
1. 如果這份代碼是沒有bug的。那麼在拷貝過程中,可能出現bug。
2. 如果這份代碼是有bug的,那麼在拷貝過程中,bug也被復制了。bug會傳染到其他的工程組件,甚至其他的工程項目中。
所謂的代碼復用,我打算給出一個定義如下:
- 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是沒有任何可復用性的。
此外,如果Log.c中還#include了def.h,那注定不能被輕易的“拷貝”。這處於工程開發階段的一個方便的考慮:假設我把所有的頭文件、宏定義、或者函數聲明都包含在一個叫做 def.h的頭文件中。那麼,我編寫C++代碼的時候會非常方便,一般只要#include “def.h”就可以了,不用擔心任何缺少頭文件之類的問題。