答网友问题:职业化代码设计原则讨论
?這是今天早上剛一上班,一個(gè)網(wǎng)友請(qǐng)教問(wèn)題帶出來(lái)的話題,個(gè)人感覺(jué)比較有普遍性,所以把QQ留言做了抄錄,整理成一篇文章。
話題不大,不過(guò),我想這里面體現(xiàn)出來(lái)的職業(yè)化程序員在進(jìn)行Coding的時(shí)候所秉持的一些設(shè)計(jì)原則還是很有借鑒意義的,大家可以參考一下。
網(wǎng)友? 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
?
網(wǎng)友? 9:40:06
我定義了一個(gè)這樣的類,在構(gòu)造函數(shù)階段沒(méi)有初始化blocks
我現(xiàn)在malloc函數(shù)里面對(duì)blocks進(jìn)行初始化
怎么做啊
在構(gòu)造函數(shù)上初始化,應(yīng)該是Memory():blocks(){}
但是我不想讓他在構(gòu)造階段初始化blocks
肖舸? 9:45:03
你把block的初始化放在malloc就可以了
網(wǎng)友? 9:46:43
void* Memory::malloc(long size) {
blocks = new blocks();
return NULL;
}
這樣?
肖舸? 9:46:56
可能不行
得有個(gè)bool量
如果已經(jīng)初始化過(guò)了,就不要初始化了
if(!blocks) blocks=new blocks()
網(wǎng)友? 9:48:15
您這個(gè)地方的blocks應(yīng)該是一個(gè)指針吧
我在定義的時(shí)候定義的是std::vector<Block*> blocks;
肖舸? 9:49:04
建議啊
我們對(duì)于類嵌套的成員對(duì)象,一般都是用指針
然后顯式的在函數(shù)中去new
實(shí)做中幾乎不會(huì)聲明成員對(duì)象實(shí)體,因?yàn)闀?huì)引發(fā)非常多的額外問(wèn)題
我們習(xí)慣于自己控制一切,很少使用C++默認(rèn)的構(gòu)造和析構(gòu)動(dòng)作
網(wǎng)友? 9:50:43
我也覺(jué)得我這樣做,在析構(gòu)函數(shù)里面的操作會(huì)比較糾結(jié)
謝謝肖老師了
肖舸? 9:51:48
C++默認(rèn)構(gòu)造函數(shù),其構(gòu)造的時(shí)間點(diǎn)是不確定的
如果兩個(gè)對(duì)象有依賴關(guān)系,而你平行地寫(xiě)出他們的對(duì)象聲明
比如A依賴B,你聲明:
??? A a;
??? B b;
則C++編譯器編譯后,哪個(gè)先執(zhí)行是不確定的
如果A先執(zhí)行,則由于B沒(méi)有初始化,會(huì)崩潰
這種崩潰一般都找不到原因,因?yàn)檫@是編譯器自己添加的代碼,你看不到
VC++就有這個(gè)問(wèn)題
體現(xiàn)在你寫(xiě)得好好的程序,可能某一次編譯過(guò)后就永遠(yuǎn)崩潰,前面一直好好的。
而且找不到原因
網(wǎng)友? 9:54:25
明白了
是我的用法有問(wèn)題
那我再請(qǐng)教一個(gè)問(wèn)題,我想給我自己定義的類標(biāo)記一個(gè)唯一的字符串
希望能夠通過(guò)字符串將我定義的類找到
并實(shí)例化對(duì)象
這個(gè)需要怎么做啊
肖舸? 9:56:15
為什么要這么做?
網(wǎng)友? 9:57:13
我嘗試做一個(gè)可以在程序外部,進(jìn)行簡(jiǎn)單配置來(lái)生成一些對(duì)象
肖舸? 9:57:54
這是一個(gè)偽命題,雖然看起來(lái)很酷,你這涉及到運(yùn)行期動(dòng)態(tài)類查詢的一個(gè)高階應(yīng)用,我年輕的時(shí)候也迷過(guò)一陣子,感覺(jué)很酷
但是,沒(méi)有實(shí)用性,根據(jù)現(xiàn)代分布式計(jì)算理論,這個(gè)問(wèn)題在實(shí)際中會(huì)有很多辦法規(guī)避掉,起碼我在實(shí)做中一次都沒(méi)有用過(guò)
不需要這么做
C++單獨(dú)解決這個(gè)問(wèn)題有點(diǎn)麻煩,但是如果依賴dll或者so等操作系統(tǒng)資源來(lái)說(shuō),很容易,你去看看COM接口,那里面的動(dòng)態(tài)查詢和枚舉,就是干這個(gè)事情的。
建議不要鉆這個(gè)牛角尖,費(fèi)力氣很大,對(duì)于賺錢沒(méi)幫助
網(wǎng)友? 10:00:35
第四點(diǎn)也是我很糾結(jié)的問(wèn)題
但是我技術(shù)力量不夠的話,又談何賺錢呢
所以我也不知道怎么權(quán)衡
肖舸? 10:01:11
起碼這點(diǎn)已經(jīng)沒(méi)用了
根據(jù)云計(jì)算、分布式服務(wù)器集群的理論,計(jì)算即服務(wù),我們現(xiàn)在普遍的都在想辦法把計(jì)算做成一個(gè)個(gè)獨(dú)立的網(wǎng)絡(luò)服務(wù),而不是基于單機(jī)模型下面
網(wǎng)友? 10:01:53
其實(shí)我是先慢慢嘗試做一個(gè)OO
肖舸? 10:02:00
想辦法動(dòng)態(tài)實(shí)例化對(duì)象,實(shí)現(xiàn)內(nèi)置式計(jì)算
OO在未來(lái)模型中,需要有限使用,不要太深入
C++目前實(shí)用度并不高,建議多學(xué)一點(diǎn)C
C才是根本
肖舸? 10:03:21
STL不要再看了,有害,你就算學(xué)會(huì)了,一到多線程環(huán)境,全部完蛋
STL是單線程的,沒(méi)有多線程安全性
網(wǎng)友? 10:03:54
我設(shè)計(jì)預(yù)期的OO也是單線程的
像js一樣
其中有一個(gè)很酷的語(yǔ)法是
devices.[has(child) ? this : void]?.[*.contains(module)? void : module];
肖舸? 10:04:16
現(xiàn)在哪還有單線程程序?
別酷了,你要真這么寫(xiě),得哭了
網(wǎng)友? 10:04:40
這樣一句話就實(shí)現(xiàn)了兩次循環(huán)
肖舸? 10:04:51
如果寫(xiě)錯(cuò)了,怎么debug?
網(wǎng)友? 10:04:51
節(jié)約了3到4個(gè)中間變量
肖舸? 10:05:10
情愿多浪費(fèi)計(jì)算機(jī)資源,不要浪費(fèi)程序員的腦力
你絞盡腦汁節(jié)約了3~4個(gè)中間變量
大約節(jié)約了12~16Bytes
現(xiàn)在的計(jì)算機(jī),內(nèi)存起步就是2G,有意義嗎?
反而,如果中間有一個(gè)隱蔽的bug,查錯(cuò)誤可能要半個(gè)月
你半個(gè)月的工資能再買臺(tái)計(jì)算機(jī)了
肖舸? 10:06:47
做事情別太過(guò)于技術(shù)了,算算經(jīng)濟(jì)賬,你就知道,多寫(xiě)幾個(gè)變量,把程序多寫(xiě)幾行,你好懂,別人也好懂,計(jì)算機(jī)也好懂,這個(gè)最值錢
就算別人來(lái)看你的代碼,起碼我看你這個(gè)代碼,得費(fèi)點(diǎn)腦筋,嗯,要花一上午吧
我一上午工資是多少?
是不是比16Bytes的內(nèi)存值錢?
網(wǎng)友? 10:07:52
可能是我想多了
肖舸? 10:08:09
你不是想多了,是思路還限制在學(xué)院派里面
老想著寫(xiě)酷的代碼,不想寫(xiě)賺錢的代碼
酷代碼往往成本高,風(fēng)險(xiǎn)大,一旦多了,迭代起來(lái),出了問(wèn)題找都找不到
最后的結(jié)果就是,大家公認(rèn)你寫(xiě)的代碼可能太高深了,都讀不懂,質(zhì)量也不咋地,無(wú)法合作
最后老板就只好請(qǐng)你走路了。
所以寫(xiě)程序久了,一般說(shuō)來(lái),都是越寫(xiě)越簡(jiǎn)單,最后都是大白話
我情愿寫(xiě)兩個(gè)循環(huán)
甚至,我會(huì)拆分成兩個(gè)函數(shù),每個(gè)函數(shù)只有一個(gè)循環(huán)
這樣看得明白啊
還有效率問(wèn)題
你說(shuō)到了循環(huán),估計(jì)得循環(huán)查找是吧?
網(wǎng)友? 10:10:46
嗯
肖舸? 10:10:55
如果這個(gè)集合夠大,比如幾萬(wàn)個(gè)
你這么寫(xiě),你怎么知道編譯器內(nèi)部使用什么算法來(lái)實(shí)現(xiàn)查找?
如果我來(lái)控制,我可以配搭兩個(gè)Hash
一步到位實(shí)現(xiàn)高速檢索
網(wǎng)友? 10:11:27
這種循環(huán)方式肯定不是萬(wàn)金油啊
肖舸? 10:11:35
這總比鬼都不知道什么算法的效率高吧
永遠(yuǎn)不要相信編譯器
它不知道你的需求
把動(dòng)作拆細(xì),你就會(huì)發(fā)現(xiàn)很多優(yōu)化要點(diǎn)
網(wǎng)友? 10:12:46
你講的很在理,我好好消化消化
在技術(shù)上,在賺錢上,都好好琢磨琢磨
肖舸? 10:13:55
嗯,做商用化程序員是個(gè)大話題,你好好琢磨一下吧
?
總結(jié)
以上是生活随笔為你收集整理的答网友问题:职业化代码设计原则讨论的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 促销活动语(宣传文案)30句
- 下一篇: 20佳精美404错误页面设计欣赏