答網友問題:職業化代碼設計原則討論

 這是今天早上剛一上班,一個網友請教問題帶出來的話題,我的感受比較有廣泛性,因此把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()ide

網友  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 嗯,作商用化程序員是個大話題,你好好琢磨一下吧  

相關文章
相關標籤/搜索