這是今天早上剛一上班,一個網友請教問題帶出來的話題,個人感覺比較有普遍性,所以把QQ留言做了抄錄,整理成一篇文章。
話題不大,不過,我想這裡面體現出來的職業化程序員在進行Coding的時候所秉持的一些設計原則還是很有借鑒意義的,大家可以參考一下。
網友 9:39:17
class Memory: public NativeObject{
public:
Memory();
~Memory();
void* malloc(long size);
Block* getBlock(long size);
private:
Number* size;
Number* minisize;
Number* maxsize;
std::vector<Block*> blocks;
};
肖舸 9:39:55
?
網友 9:40:06
我定義了一個這樣的類,在構造函數階段沒有初始化blocks
我現在malloc函數裡面對blocks進行初始化
怎麼做啊
在構造函數上初始化,應該是Memory():blocks(){}
但是我不想讓他在構造階段初始化blocks
肖舸 9:45:03
你把block的初始化放在malloc就可以了
網友 9:46:43
void* Memory::malloc(long size) {
blocks = new blocks();
return NULL;
}
這樣?
肖舸 9:46:56
可能不行
得有個bool量
如果已經初始化過了,就不要初始化了
if(!blocks) blocks=new blocks()
網友 9:48:15
您這個地方的blocks應該是一個指針吧
我在定義的時候定義的是std::vector<Block*> blocks;
肖舸 9:49:04
建議啊
我們對於類嵌套的成員對象,一般都是用指針
然後顯式的在函數中去new
實做中幾乎不會聲明成員對象實體,因為會引發非常多的額外問題
我們習慣於自己控制一切,很少使用C++默認的構造和析構動作
網友 9:50:43
我也覺得我這樣做,在析構函數裡面的操作會比較糾結
謝謝肖老師了
肖舸 9:51:48
C++默認構造函數,其構造的時間點是不確定的
如果兩個對象有依賴關系,而你平行地寫出他們的對象聲明
比如A依賴B,你聲明:
A a;
B b;
則C++編譯器編譯後,哪個先執行是不確定的
如果A先執行,則由於B沒有初始化,會崩潰
這種崩潰一般都找不到原因,因為這是編譯器自己添加的代碼,你看不到
VC++就有這個問題
體現在你寫得好好的程序,可能某一次編譯過後就永遠崩潰,前面一直好好的。
而且找不到原因
網友 9:54:25
明白了
是我的用法有問題
那我再請教一個問題,我想給我自己定義的類標記一個唯一的字符串
希望能夠通過字符串將我定義的類找到
並實例化對象
這個需要怎麼做啊
肖舸 9:56:15
為什麼要這麼做?
網友 9:57:13
我嘗試做一個可以在程序外部,進行簡單配置來生成一些對象
肖舸 9:57:54
這是一個偽命題,雖然看起來很酷,你這涉及到運行期動態類查詢的一個高階應用,我年輕的時候也迷過一陣子,感覺很酷
但是,沒有實用性,根據現代分布式計算理論,這個問題在實際中會有很多辦法規避掉,起碼我在實做中一次都沒有用過
不需要這麼做
C++單獨解決這個問題有點麻煩,但是如果依賴dll或者so等操作系統資源來說,很容易,你去看看COM接口,那裡面的動態查詢和枚舉,就是干這個事情的。
建議不要鑽這個牛角尖,費力氣很大,對於賺錢沒幫助
網友 10:00:35
第四點也是我很糾結的問題
但是我技術力量不夠的話,又談何賺錢呢
所以我也不知道怎麼權衡
肖舸 10:01:11
起碼這點已經沒用了
根據雲計算、分布式服務器集群的理論,計算即服務,我們現在普遍的都在想辦法把計算做成一個個獨立的網絡服務,而不是基於單機模型下面
網友 10:01:53
其實我是先慢慢嘗試做一個OO
肖舸 10:02:00
想辦法動態實例化對象,實現內置式計算
OO在未來模型中,需要有限使用,不要太深入
C++目前實用度並不高,建議多學一點C
C才是根本
肖舸 10:03:21
STL不要再看了,有害,你就算學會了,一到多線程環境,全部完蛋
STL是單線程的,沒有多線程安全性
網友 10:03:54
我設計預期的OO也是單線程的
像js一樣
其中有一個很酷的語法是
devices.[has(child) ? this : void]?.[*.contains(module)? void : module];
肖舸 10:04:16
現在哪還有單線程程序?
別酷了,你要真這麼寫,得哭了
網友 10:04:40
這樣一句話就實現了兩次循環
肖舸 10:04:51
如果寫錯了,怎麼debug?
網友 10:04:51
節約了3到4個中間變量
肖舸 10:05:10
情願多浪費計算機資源,不要浪費程序員的腦力
你絞盡腦汁節約了3~4個中間變量
大約節約了12~16Bytes
現在的計算機,內存起步就是2G,有意義嗎?
反而,如果中間有一個隱蔽的bug,查錯誤可能要半個月
你半個月的工資能再買台計算機了
肖舸 10:06:47
做事情別太過於技術了,算算經濟賬,你就知道,多寫幾個變量,把程序多寫幾行,你好懂,別人也好懂,計算機也好懂,這個最值錢
就算別人來看你的代碼,起碼我看你這個代碼,得費點腦筋,嗯,要花一上午吧
我一上午工資是多少?
是不是比16Bytes的內存值錢?
網友 10:07:52
可能是我想多了
肖舸 10:08:09
你不是想多了,是思路還限制在學院派裡面
老想著寫酷的代碼,不想寫賺錢的代碼
酷代碼往往成本高,風險大,一旦多了,迭代起來,出了問題找都找不到
最後的結果就是,大家公認你寫的代碼可能太高深了,都讀不懂,質量也不咋地,無法合作
最後老板就只好請你走路了。
所以寫程序久了,一般說來,都是越寫越簡單,最後都是大白話
我情願寫兩個循環
甚至,我會拆分成兩個函數,每個函數只有一個循環
這樣看得明白啊
還有效率問題
你說到了循環,估計得循環查找是吧?
網友 10:10:46
嗯
肖舸 10:10:55
如果這個集合夠大,比如幾萬個
你這麼寫,你怎麼知道編譯器內部使用什麼算法來實現查找?
如果我來控制,我可以配搭兩個Hash
一步到位實現高速檢索
網友 10:11:27
這種循環方式肯定不是萬金油啊
肖舸 10:11:35
這總比鬼都不知道什麼算法的效率高吧
永遠不要相信編譯器
它不知道你的需求
把動作拆細,你就會發現很多優化要點
網友 10:12:46
你講的很在理,我好好消化消化
在技術上,在賺錢上,都好好琢磨琢磨
肖舸 10:13:55
嗯,做商用化程序員是個大話題,你好好琢磨一下吧
本文出自 “肖舸的blog” 博客,請務必保留此出處http://tonyxiaohome.blog.51cto.com/925273/969689