淺談C與C++的設計與編程風格(一)

一直想寫一些比較C和C++設計與編程風格的文字,正好近來工作任務不多,能夠有時間重新整理一下自己所學的東東,於是便決定開始寫這個題目,而目的僅僅只是打算能就這個話題和大家討論討論,拋磚引玉、增長個人的見識。
首先想說明一下,個人是C++設計、編程風格的堅定擁護者,所以我的觀點難免帶有個人的偏好,如果您不贊同,也請批評指正。好了,言歸正傳,個人覺得C與C++設計與編程風格最本質的不同是:C以函數間的調用關係爲核心(所以C語言被稱爲面向過程式語言),而C++以程序元素(對象)間的關係和結構爲核心(所以C++被稱爲面向對象的語言)——PS:如果您拿到一堆代碼後首先去看各個函數的實現,並試圖弄懂它們是如何相互調用的,那證明您是一位典型的C程序員;而如果您首先是去查看所有頭文件,並試圖搞懂每個類之間的關係,那證明您是一位典型的C++程序員。
舉個簡單的例子,對於一名C程序員,當他需要實現某種狀態機時,通常是使用下面這樣的代碼:
if (0 == CheckState(...) ) // 判斷某個函數的返回值是否爲0
    DoSomething(...); // 調用某個函數
else
    DoSomethingElse(...); // 調用處理其它情況的另一個函數
或是這樣:
switch( CheckState(...) ) // 根據某個函數的返回值做不同的動作
{
case 0:
    DoSomething1(...);
    break;
case 1:
    DoSomething2(...);
    break;
case -1:
    DoSomething3(...);
    break;
default:
    DoSomethingElse(...);
}
(PS:以上這些代碼必然是在源文件的某個函數中出現的,這也解釋了爲什麼C程序員總是先看源文件。)而一個C++程序員則可能不這麼做,這裏C++程序員多了一種選擇——使用虛函數:
//申明一個接口
struct IStateMachine
{
virtual void DoSomething(...) = 0;
};
// 針對狀態0提供一個實現類
struct CDoSomethingForState0: IStateMachine
{
virtual void DoSomething(...);
}
// 針對狀態1提供一個實現類
struct CDoSomethingForState1: IStateMachine
{
virtual void DoSomething(...);
};
// 針對其它狀態提供一個實現類
struct CDoSomethingForOhterStates: IStateMachine
{
virtual void DoSomething(...);
};
// 使用一個工廠函數來返回特定的實現對象
IStateMachine * CheckState(...);
//調用的代碼
CheckState(...)->DoSomething(...);
(PS:以上代碼除了最後一句調用外,其它都是在頭文件中,這也解釋了爲什麼C++程序員更重視頭文件而不是源代碼)比較一下可以看出,調用部分的C++代碼比C代碼精簡了許多(而且效率上也可能更高)!在這個例子中可能您會說,C++代碼還增加了大量的頭文件中的代碼,用以描述各個類之間的關係!的確是這樣,這正是C++風格的特點:試圖將一個邏輯複雜的控制流映射爲一組對象間的關係以及數據流。在一些更加複雜的情況中,這個機制能夠發揮出強大的威力(因爲數據流比控制流更容易把握)!
(未完待續……)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章