小(xiǎo)函數(shù)越小(xiǎo)越有(yǒ"♥≥u)優勢力
日(rì)期:2013-05-09發布:首創網絡浏覽:794次
小(xiǎo)函數(shù)越小(xiǎo)越有(yǒu)優勢力。設計(jβ&•ì)良好(hǎo)的(de)函數(shù)往↕↔往比較小(xiǎo),而過大(dà)函數(shù≥≈•&)的(de)設計(jì)往往一(yī)塌糊塗•Ω×,或者存在很(hěn)大(dà)的(de)優化(huà)空(kō ×¶βng)間(jiān)。 也(yě)許你(nǐ)認為(wèi)討(tǎo)論函數 σ(shù)的(de)大(dà)小(xiǎo)沒有("βyǒu)必要(yào),原因是(shì)函數(sh>σσù)設計(jì)的(de)本質是(shì)內(nèi)聚,它的(de↕≈±)大(dà)小(xiǎo)隻是(shì)φ它的(de)表現(xiàn)形式。而上(shàng)面的(d→☆φ♥e)原因有(yǒu)必要(yào)讓我們討(tǎΩ÷o)論一(yī)下(xià)函數(shù)的(≠Ωde)大(dà)小(xiǎo)問(wèn)題。
本文(wén)關鍵字:小(xiǎo),函數(±×shù),越小(xiǎo),越有(yǒu),優,勢力,小(xiǎo),££<函數(shù),越小(xiǎo),
小(xiǎo)函數(shù)越小(xiǎo)越有(yǒu)優勢β¶力。“設計(jì)良好(hǎo)的(de)函數(shù)φ$♠往往比較小(xiǎo),而過大(dà)函數(shù£ )的(de)設計(jì)往往一(yī)塌糊塗,或者存在很(hěn)大( dà)的(de)優化(huà)空(kōng)間(jiā←₽φn)。”
也(yě)許你(nǐ)認為(wèi)討(←↓tǎo)論函數(shù)的(de)大(dà¶↑∏ )小(xiǎo)沒有(yǒu)必要(yào≈©™λ),原因是(shì)函數(shù)設計(jì)的(d∞∑↓©e)本質是(shì)內(nèi)聚,它的(de)大(dà)小(xiǎo)隻αα是(shì)它的(de)表現(xiàn)形式。而上&₹(shàng)面的(de)原因有(yǒu)必₹¶<要(yào)讓我們討(tǎo)論一(yī)下(xià)函數( shù)的(de)大(dà)小(xiǎo)問(w↓±èn)題。
我對(duì)函數(shù)的(de)∞ "∑核心思路(lù):我提出代碼最小(xiǎo)處理(lΩ☆>ǐ)單元的(de)概念:一(yī)個(gè)基本操♣₹₽作(zuò)(賦值,比較等),一(yī)個(gè)函數(shù)調用(yòng 'δ)(包括調用(yòng)後判斷返回值進行(xíng)判'∏α斷)都(dōu)看(kàn)成一(yī)個($×♦gè)最小(xiǎo)處理(lǐ)單元。那(nà)麽,一(yī)個©β¶©(gè)函數(shù),最小(xiǎo)處理"€≠(lǐ)單元合理(lǐ)的(de)個(gè)♥數(shù)範圍在7以內(nèi)。如(rú)果超過了(le)7,Ωπ你(nǐ)就(jiù)要(yào)考慮把他( 'tā)們拆分(fēn)成多(duō)個(gè)函數(s ®÷hù)了(le)(為(wèi)什(shén)麽是(shì)7?人(rén) ≥同時(shí)能(néng)夠處理(lǐ)的(de)信息不(bù)超過7₹∞ 個(gè))。
最小(xiǎo)數(shù)目沒有(yǒu)限 ¶δ制(zhì),即便是(shì)隻有(yǒu)1個(®€gè),也(yě)有(yǒu)存在的(dβ≤♥e)必要(yào)。
在下(xià)面的(de)情況下(xià)我會(huì)将函™♣♥↔數(shù)拆分(fēn)為(wèi)更小(xiǎo)的(de™♠€)函數(shù):
1、一(yī)眼不(bù)能(néng)夠看(kàn)到(dà&↓≠o)函數(shù)所有(yǒu)的(de)代碼。
如(rú)果函數(shù)過長(cháng),無法一(yī)眼看(€'kàn)到(dào)一(yī)個(gè)函數(sh&§ù)所有(yǒu)的(de)代碼,我會(huì)毫不(bù)猶豫的(de)≠<拆分(fēn)。我不(bù)想讓讀(dú)者去(qù)翻屏,♠✘∑©也(yě)不(bù)想讓讀(dú)者前顧後盼,顧此 ↑失彼。漂亮(liàng)的(de)函數(shù)應該讓讀(dú)&ε≥者一(yī)眼就(jiù)知(zhī)道(dào)他(tā)在做✘'>(zuò)什(shén)麽以及怎麽做(z₹€uò)的(de)。
2、局部變量過多(duō)。
如(rú)果局部變量超過七個(gè),我會(huì)考慮拆分(fē≥α∏↓n)函數(shù)。變量過多(duō)意味著(zhe)我要(yào)記錄太多₹↑φφ(duō)的(de)狀态,這(zhè)會(huì)加重我大(dà)腦(nǎo™© )的(de)負擔,同時(shí)要(yào)考慮太多(duō)的(deγ¥÷)東(dōng)西(xī)。這(zhè)也(yě)同時(sh₩₩í)意味著(zhe)我可(kě)能(néng)沒有(yǒu)對(duì)函數(π∑∞shù)功能(néng)進行(xíng)深入的(de)思考。
3、太多(duō)的(de)縮進。
太多(duō)的(de)縮進意味著(zhe)太多(↓☆βduō)的(de)嵌套,要(yào)麽是(shì)循環,要(yào)麽是(sh ₹✘ì)判斷,都(dōu)會(huì)導緻複雜(zá)的(de)邏輯。
4、如(rú)果你(nǐ)在使用(yòng)ctrl+c和(héα★☆♠)ctrl+v
那(nà)你(nǐ)寫的(de)代碼不(bù)夠拽(DRY∞≠≈♦,Don’tRepeatYourself)。★這(zhè)個(gè)時(shí)候,你(nǐ)要'☆(yào)把你(nǐ)複制(zhì)的(de)部分(fēn)拆分(δ±>fēn)為(wèi)新的(de)函數(shù)。
5、不(bù)處于同一(yī)抽象層次。
舉例,有(yǒu)一(yī)個(g∏ε≈₽è)初始化(huà)函數(shù),需要(yào)初始化(huà)∏Ω配置數(shù)據,套接字,數(shù)據庫連接,通(tōng)道(dào)&β♣✔狀态。
voidinit()
{
Config_init();
Socket_init();
Db_init();
inti=0;
For(i=0;i
G_user_chn[i].status=statu$γ¶≠s_init;
……
}
}
上(shàng)個(gè)函數(shù)中對(duì☆ ♠)所有(yǒu)通(tōng)道(dào)的(de)初始化(huà)一φ↔β(yī)塊代碼就(jiù)和(hé)其他(t★♠ā)的(de)不(bù)處于一(yī)個ελ≤>(gè)抽象層次,我們應該将它封裝起來(lái):
voidchn_init()
{
inti=0;
for(i=0;i
G_user_chn[i].status=status_in♣★it;
……
}
}
函數(shù)最小(xiǎo)可(kě)以有(y±♠ǒu)多(duō)小(xiǎo),它存在的(de)意義
我見(jiàn)過的(de)最優秀的(de)函數(shù§α$©):
intmax(inta,intb)
{
returna>b?a:b;
}
這(zhè)個(gè)函數(shù)很(hě✘"σ✔n)小(xiǎo),隻有(yǒu)一(yī)行(xíng•♣),但(dàn)是(shì)他(tā)存在的(de)意義在于:在☆∏≤函數(shù)的(de)調用(yòng)點,我們一(yī)眼就(jiù≤γ)知(zhī)道(dào)是(shì)獲取a和(hé)b中的(€ γ★de)最大(dà)值,而不(bù)是(sh"'®γì)分(fēn)析a>b?a:b的(de)邏輯。這(zhè)樣可(k↑₹ě)以節省程序員(yuán)的(de)腦(nǎo)力≤成本,從(cóng)而達到(dào)一(yī)個(gè)目的(de):ε≠漂亮(liàng)的(de)函數(shù)應該讓讀≥λ(dú)者一(yī)眼就(jiù)知(zhī)道(dào)他(tā)★★₽在做(zuò)什(shén)麽以及怎麽做(zuò)的(de)。
小(xiǎo)函數(shù)的(de)最₹↓€大(dà)障礙:性能(néng)
對(duì)于程序員(yuán)新手,小(xiǎo)函數(shù)$©φ≥的(de)最大(dà)障礙在于沒有(yǒu)經驗體(tǐ)會(huì)不(b ù)到(dào)小(xiǎo)函數(shù)的(de)優勢♦♣≈•,沒有(yǒu)經驗拆分(fēn)大(dà)函數(shù)為(wèi)更小←₹♦(xiǎo)的(de)函數(shù)。
對(duì)于有(yǒu)一(yī)定經€®驗的(de)程序員(yuán),小(xi&↓ǎo)函數(shù)的(de)最大(dà)障礙也(yě)許是(shì)對(duα"δì)性能(néng)的(de)憂慮。
對(duì)于性能(néng),切記,不(bù)要(yào ™≈∞)過早優化(huà)。我們一(yī)般認為(wèi)的☆₽↔(de)程序的(de)瓶頸,一(yī)般并不(bù)是(shì)程≥α序的(de)瓶頸:我們需要(yào)工(gōng)具來(lái)确定∞αφ真正的(de)瓶頸所在,20%的(de)代碼耗費(fèi)了(le)80%的 λ₹(de)性能(néng),優化(huà)之前首先要(yào)找到(dào)那(∞≤nà)20%的(de)代碼。函數(shù)調用(yòng)會(h★δuì)産生(shēng)資源和(hé)性能(néng)的(d ₹e)損耗,但(dàn)是(shì)這(zhè)是(×®δshì)不(bù)是(shì)程序的(de)性能(néng)瓶頸?消耗的(d£§≠e)性能(néng)占總體(tǐ)的(de)性能(néng)百分(fēn)比為π¶(wèi)多(duō)少(shǎo)?這(zhè)一(ε♦∑±yī)切在代碼編寫時(shí)并不(bù)清楚,所以,我的(de)觀£π☆點是(shì)甯可(kě)選擇簡短(duǎn)的(δ☆de)函數(shù)來(lái)獲得(de)清晰簡單的(de)設≈¥計(jì),以便在項目後期能(néng)夠更快(kβ¶£uài),更好(hǎo)的(de)進行(xíng)&φβ性能(néng)優化(huà)。
很(hěn)多(duō)人(rén)都(dō§∞φγu)在質疑我上(shàng)面列舉的(de)ma♣≈x函數(shù)的(de)實例,如(rú)φ♦果說(shuō)他(tā)在運行(xíng)期間(jiān)調用(yòn±≈¶÷g)次數(shù)不(bù)大(dà),則對(duì)性能(néng)的(₹© de)影(yǐng)響基本可(kě)以忽略,而獲得(de)的(d©γe)可(kě)讀(dú)性,清晰性這(zhè)極具價值;反過來(l ↑÷ái),如(rú)果他(tā)的(de)調用(yòng)次數(shù)是(sh©★ì)否龐大(dà),以緻成為(wèi)了(₩ε≠¶le)性能(néng)的(de)瓶頸,則完全可(kě)以£÷在程序編寫完成後,很(hěn)快(kuài)的(de)用(yòng¥∞™)其他(tā)的(de)方法優化(huà)。程序的(dδ×e)瓶頸不(bù)會(huì)很(hěn)多(duō)。
關于函數(shù)調用(yòng)産生¥Ωε(shēng)的(de)性能(néng)消耗,我會(huì)抽時' ≤(shí)間(jiān)測試一(yī)下(xià),看(kàn)到(dà¥∏"o)底占用(yòng)多(duō)少(shǎo)。
最後的(de)建議(yì):
在對(duì)新員(yuán)工(gōng)培訓的(de)過程♠ε中,發現(xiàn)程序員(yuán)新手一(yī)般對(duì)函數(¶$©shù)的(de)大(dà)小(xiǎo)¶ 不(bù)夠敏感。所以,我建議(yì)你(nǐ)可(kě)以多(duōλ≤≤)嘗試編寫10行(xíng)左右(甚至更小(xiǎo))的(Ωαde)函數(shù),慢(màn)慢(màn)你(nΩ←ǐ)會(huì)發現(xiàn)小(xiǎo)δ≠函數(shù)原來(lái)具有(yǒu)大(dà)威力。
- 歡迎大(dà)家(jiā)閱讀(dú)浏覽,部分(fēn)內(nèi)容來Ω≤Ω(lái)源于網絡,如(rú)有(yǒu)侵權,請(qǐng)聯系我們删除≤₽!
- 上(shàng)一(yī)條:響應式成Web設計(jì)新看(kàn)點
- 下(xià)一(yī)條:不(bù)能(néng)不(bù)明(míng)白(bái)的(de)Jav↓β✘aScript設計(jì)模式
服務項目
熱(rè)門(mén)信息
- 邯鄲網絡公司:模闆建站(zhàn)的(de)好(hǎo)處有(yǒu ×)哪些(xiē)?
- 3642024-04-25

- 4.9日(rì)訊,企業(yè)網站(zhàn)建設如(rú)何發揮網絡營σ₽β銷功能(néng)?
- 4092024-04-09

- 邯鄲網絡公司:網站(zhàn)建設開(kāi☆π←)發有(yǒu)哪些(xiē)細節需要(yào)注意?
- 5402024-03-07

- 邯鄲網絡公司:外(wài)貿網站(zhàn)制(zhì)作≤♠ (zuò)的(de)8個(gè)步驟
- 3772024-03-05

- 簡單3步,輕松做(zuò)企業(yè)官網₩"÷
- 6822024-02-18
