转:函数要多小才够好——谈小函数之道
轉載自:?http://justjavac.com/other/2012/05/29/to-use-little-function.html
“設計良好的函數往往比較小,而過大函數的設計往往一塌糊涂,或者存在很大的優化空間。”
兼聽則明,參考評論:http://www.cnblogs.com/chgaowei/archive/2011/09/07/2170265.html
假面佛:
支持函數功能 按照功能單元來劃分
但粒度太小 你會發現調試 閱讀代碼也很蛋疼,為什么呢?
因為你的邏輯長度是必須的,如果拆分太多,函數太多,函數掉函數反而不利于閱讀和維護。
這個要適度來拆分。
?
也許你認為討論函數的大小沒有必要,原因是函數設計的本質是內聚,它的大小只是它的表現形式。 而上面的原因有必要讓我們討論一下函數的大小問題。
我對函數的核心思路:我提出代碼最小處理單元的概念:一個基本操作(賦值,比較等),一個函數調用(包括調用后判斷返回值進行判斷)都看成一個最小處理單元。 那么,一個函數,最小處理單元合理的個數范圍在7以內。 如果超過了7,你就要考慮把他們拆分成多個函數了(為什么是7?人同時能夠處理的信息不超過7個)。
最小數目沒有限制,即便是只有1個,也有存在的必要。
在下面的情況下我會將函數拆分為更小的函數:
1、一眼不能夠看到函數所有的代碼。
如果函數過長,無法一眼看到一個函數所有的代碼,我會毫不猶豫的拆分。 我不想讓讀者去翻屏,也不想讓讀者前顧后盼,顧此失彼。?漂亮的函數應該讓讀者一眼就知道他在做什么以及怎么做的。
2、局部變量過多。
如果局部變量超過七個,我會考慮拆分函數。 變量過多意味著我要記錄太多的狀態,這會加重我大腦的負擔,同時要考慮太多的東西。 這也同時意味著我可能沒有對函數功能進行深入的思考。
3、太多的縮進。
太多的縮進意味著太多的嵌套,要么是循環,要么是判斷,都會導致復雜的邏輯。
4、不處于同一抽象層次。
舉例,有一個初始化函數,需要初始化配置數據,套接字,數據庫連接,通道狀態。
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;……} }上個函數中對所有通道的初始化一塊代碼就和其他的不處于一個抽象層次,我們應該將它封裝起來:
void chn_init() {Int I = 0;For (I = 0;I < max_chn_num;i++)//初始化所有通道{G_user_chn[i].status =status_init;……} }函數最小可以有多小,它存在的意義
我見過的最優秀的函數:
int max(int a, intb) {return a > b?a:b; }這個函數很小,只有一行,但是他存在的意義在于:在函數的調用點,我們一眼就知道是獲取a和b中的最大值,而不是分析?a > b?a:b?的邏輯。 這樣可以節省程序員的腦力成本,從而達到一個目的:漂亮的函數應該讓讀者一眼就知道他在做什么以及怎么做的。
最后的建議:
在對新員工培訓的過程中,發現程序員新手一般對函數的大小不夠敏感。 所以,我建議你可以多嘗試編寫10行左右(甚至更小)的函數,慢慢你會發現小函數原來具有大威力。
轉載于:https://www.cnblogs.com/kira2will/p/3550649.html
總結
以上是生活随笔為你收集整理的转:函数要多小才够好——谈小函数之道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: outlook邮件中图片无显示解决方法
- 下一篇: 【转载】应广大群众的要求,今天开始连载《