中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

函數(shù)要多小才夠好——談小函數(shù)之道

2023-08-24    分類: 網(wǎng)站建設(shè)

百度權(quán)重查詢 站長(zhǎng)交易 友情鏈接交換 網(wǎng)站監(jiān)控 服務(wù)器監(jiān)控 seo監(jiān)控

“設(shè)計(jì)的函數(shù)往往比較小,而過大函數(shù)的設(shè)計(jì)往往烏煙瘴氣,或者存在很大的優(yōu)化空間。”

也許你認(rèn)為討論函數(shù)的大小沒有需要,原因是函數(shù)設(shè)計(jì)的本質(zhì)是內(nèi)聚,它的大小只是它的體現(xiàn)形式。而上面的原因有需要讓我們討論一下函數(shù)的大小問題。

我對(duì)函數(shù)的核心思路:我提出代碼好小處理單元的概念:一個(gè)基本操作(賦值,比較等),一個(gè)函數(shù)調(diào)用(包括調(diào)用后判斷返回值進(jìn)行判斷)都看成一個(gè)好小處理單元。那么,一個(gè)函數(shù),好小處理單元合理的個(gè)數(shù)范圍在7以內(nèi)。假如超過了7,你就要考慮把他們拆分成多個(gè)函數(shù)了(為什么是7?人同時(shí)能夠處理的信息不超過7個(gè))。

好小數(shù)目沒有限制,即便是只有1個(gè),也有存在的需要。

在下面的情況下我會(huì)將函數(shù)拆分為更小的函數(shù):

1、一眼不能夠看到函數(shù)所有的代碼。

假如函數(shù)過長(zhǎng),無(wú)法一眼看到一個(gè)函數(shù)所有的代碼,我會(huì)毫不猶豫的拆分。我不想讓讀者去翻屏,也不想讓讀者前顧后盼,顧此失彼。漂亮的函數(shù)應(yīng)該讓讀者一眼就知道他在做什么以及怎么做的。

2、局部變量過多。

假如局部變量超過七個(gè),我會(huì)考慮拆分函數(shù)。變量過多意味著我要記錄太多的狀況,這會(huì)加重我大腦的負(fù)擔(dān),同時(shí)要考慮太多的東西。這也同時(shí)意味著我可能沒有對(duì)函數(shù)功能進(jìn)行深入的思考。

3、太多的縮進(jìn)。

太多的縮進(jìn)意味著太多的嵌套,要么是循環(huán),要么是判斷,都會(huì)導(dǎo)致復(fù)雜的邏輯。

4、假如你在使用ctrl+c和ctrl+v

那你寫的代碼不夠拽(DRY,Don’t Repeat Yourself)。這個(gè)時(shí)候,你要把你復(fù)制的部分拆分為新的函數(shù)。

5、不處于統(tǒng)一抽象條理。

舉例,有一個(gè)初始化函數(shù),需要初始化配置數(shù)據(jù),套接字,數(shù)據(jù)庫(kù)連接,通道狀況。

void init()

{

Config_init();

Socket_init();

Db_init();

int i = 0;

For (i = 0;i < max_chn_num;i++)//初始化所有通道 {

G_user_chn[i].status = status_init;

……

}

}

上個(gè)函數(shù)中對(duì)所有通道的初始化一塊代碼就和其他的不處于一個(gè)抽象條理,我們應(yīng)該將它封裝起來:

void chn_init()

{

int i = 0;

for (i = 0;i < max_chn_num;i++)//初始化所有通道 {

G_user_chn[i].status =status_init;

……

}

}

函數(shù)好小可以有多小,它存在的意義

我見過的好優(yōu)異的函數(shù):

int max(int a, intb)

{

return a> b?a:b;

}

這個(gè)函數(shù)很小,只有一行,但是他存在的意義在于:在函數(shù)的調(diào)用點(diǎn),我們一眼就知道是獲取a和b中的好大值,而不是分析a > b?a:b的邏輯。這樣可以節(jié)省程序員的腦力成本,從而達(dá)到一個(gè)目的:漂亮的函數(shù)應(yīng)該讓讀者一眼就知道他在做什么以及怎么做的。

小函數(shù)的好大障礙:性能

對(duì)于程序員新手,小函數(shù)的好大障礙在于沒有經(jīng)驗(yàn)體味不到小函數(shù)的優(yōu)勢(shì),沒有經(jīng)驗(yàn)拆分大函數(shù)為更小的函數(shù)。

對(duì)于有一定經(jīng)驗(yàn)的程序員,小函數(shù)的好大障礙也許是對(duì)性能的憂慮。

對(duì)于性能,切記,不要過早優(yōu)化。我們一般認(rèn)為的程序的,一般并不是程序的:我們需要工具來確定真正的所在,20%的代碼耗費(fèi)了80%的性能,優(yōu)化之前首先要找到那20%的代碼。函數(shù)調(diào)用會(huì)產(chǎn)生資源和性能的損耗,但是這是不是程序的性能?消費(fèi)的性能占總體的性能百分比為多少?這一切在代碼編寫時(shí)并不清楚,所以,我的觀點(diǎn)是寧可選擇簡(jiǎn)短的函數(shù)來獲得清晰簡(jiǎn)單的設(shè)計(jì),以便在項(xiàng)目后期能夠更快,更好的進(jìn)行性能優(yōu)化。

許多人都在質(zhì)疑我上面列舉的max函數(shù)的實(shí)例,假如說他在運(yùn)行期間調(diào)用次數(shù)不大,則對(duì)性能的影響基本可以忽略,而獲得的可讀性,清晰性這極具價(jià)值;反過來,假如他的調(diào)用次數(shù)是否重大,以致成為了性能的,則完全可以在程序編寫完成后,很快的用其他的方法優(yōu)化。程序的不會(huì)許多。

關(guān)于函數(shù)調(diào)用產(chǎn)生的性能消費(fèi),我會(huì)抽時(shí)間測(cè)試一下,看到底占用多少。

好后的建議:

在對(duì)新員工培訓(xùn)的過程中,發(fā)現(xiàn)程序員新手一般對(duì)函數(shù)的大小不夠敏感。所以,我建議你可以多嘗試編寫10行左右(甚至更?。┑暮瘮?shù),慢慢你會(huì)發(fā)現(xiàn)小函數(shù)原來具有大威力。

文章來源:常高偉的博客

名稱欄目:函數(shù)要多小才夠好——談小函數(shù)之道
URL鏈接:http://www.rwnh.cn/news18/278218.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、網(wǎng)站設(shè)計(jì)公司、云服務(wù)器、微信小程序、域名注冊(cè)、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
洛川县| 承德县| 广宗县| 泾阳县| 台前县| 海兴县| 隆尧县| 闵行区| 沙河市| 库伦旗| 寿光市| 玉屏| 若羌县| 舞阳县| 同心县| 梅河口市| 新蔡县| 泰宁县| 宝应县| 章丘市| 井陉县| 三台县| 张家口市| 陈巴尔虎旗| 鄂伦春自治旗| 太原市| 滨州市| 吕梁市| 黎城县| 应城市| 伽师县| 大洼县| 岳池县| 太仓市| 宣威市| 太仆寺旗| 兰考县| 长泰县| 淄博市| 育儿| 城固县|