天天看點

c++的詭異與藝術一例

c++到底是詭異的還是藝術的,可能都是吧,說它詭異是因為沒有了解它的精髓,說它藝術那是因為了解了它的精髓,我這裡僅以一個實際的例子說明,在工作過程中,我的項目經理讓我看一段程式,可能程式的作者根本不懂怎麼進行互斥,這足以說明他不是一個合格的程式員,為何說他不懂基本的互斥呢?以下是一個函數:

int in_use = 0;

XXX XXX(XXX yyy)

{

while(in_use == 1)

Sleep(1);

}

SyncClass instance(&in_use);

//do_something;

很顯然,這個in_use的意義就是為了防止這個XXX函數被重入,我說作者不合格的原因是完全可以用WaitForSingeleObject之類的函數來完成,用這種方式就顯得太“低級”了,我的項目經理還迷惑于沒有發現在什麼地方将in_use這個變量設定為1,他在我們的項目出了大問題而又面對這種詭異的代碼的時候顯得十分氣憤,删去吧,萬一作者有很什麼隐藏的很深的意圖呢?不删吧,實在對這種互斥方式不解,然而當我看到這段代碼的頭檔案的時候,一切豁然開朗了,SyncClass的定義如下:

class SyncClass

public:

SyncClass(int* _use):m_use(_use)

*m_use=1;

~SyncClass()

*m_use=0;

private:

int* m_use;

};

很簡單的一個類,在調用構造函數的時候将參數作為一個位址,然後将該位址指向的值設定為1,然後在析構的時候将其設定為0,而函數XXX中隻是簡單的建立了一個SyncClass對象,調用了其唯一的顯式的構造函數,可以看到并沒有用這個對象做任何事情,這個對象的意義就在于互斥,c/c++的特性決定了變量的作用域,該對象是一個局部變量,在出去它所在的大括号之外,它就離開了它的作用域,c++中,一個對象離開了作用域就要調用其析構函數,而虛構函數中将互斥變量的值設定為了0。這個方式的好處在于你幾乎不用時刻操心在離開函數的時候忘記了釋放互斥量。

這個方案是美妙還是詭異,起初,我的項目經理說這種摸不着頭腦的代碼肯定是一個大學生寫的,然而我不贊同他的觀點,這個代碼恰恰表現了作者堅實的基本功,他可能不懂api,但是他卻深刻的了解了c++的精髓,這二者哪一點更重要呢?現在很多程式員api玩得不亦樂乎,但是基本的知識卻一問三不知,不知道記憶體怎麼讀,不知道int類型的資料在記憶體的布局,這到底說明這個程式員效率高還是根基不牢?...我其實根本不喜歡那些隻會調用API的人,他們可能會是很好的執行者,但是他們很難設計出良好的系統,你難道指望一個根本不懂原理的人去充分挖掘原理性的潛力嗎?個版本不可能的。

有人認為搞作業系統的人水準就一定很高,其實不是,搞應用的人水準更高,我這裡說的不是編碼的人,而是搞設計搞架構的人,大多數的應用要比作業系統複雜的多,要考慮的問題要多得多,随便看一個訂單系統的邏輯設計圖就會發現它的複雜,特别是高複雜度的面向對象的系統更是如此,設計模式就像是一堵牆,時刻在權衡着設計的優劣。

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1273968