函數(shù)參數(shù)設計(CSEN-e小白管理員Half_word編寫)
函數(shù)參數(shù)設計
說起這個話題,可能會被DaLao一笑劃過;函數(shù)設計有什么難的?無外乎實現(xiàn)傳入某些參數(shù),內部實現(xiàn)某種算法,再反饋一個結果給調用者。
的卻如此,對于函數(shù);返回值我們只有一個,內化的算法之類諸君自行探尋;所以本文目的主要是探尋函數(shù)參數(shù)的設計。如果知曉其中奧妙的讀者不妨移步其它文章。
正文:
1.你的的函數(shù)參數(shù)長啥樣?
以C語言為例,相信大家學完函數(shù)設計之后肯定對于參數(shù)設計有許多自己的體會。無論是整形,字符型,甚至是各類指針參數(shù)都了然于心。
巴特,大家會對于參數(shù)的排列有要求嗎?如果要你設計一個有10個以上類型各異的函數(shù);你會如何設計?
如果讀者給出的答案是下面這種:
void Func(int count, long Lenth, char* List, unsigned int Source, 等等等等);
?? 上述的傳統(tǒng)設計方案,固然沒有任何錯誤,大部分語言設計教材教給我們的都是這種案。但是,這就不得不面對一個致命問題----函數(shù)可讀性差,且顯得臃腫(一般這種方案設計,必須采取多次續(xù)行才能將參數(shù)一一放下)。有讀者可能會反駁可讀性,但是事實就是如此,一大片的函數(shù)頭看著就是十分不舒服。
2. 如何設計參數(shù)才能讓上述問題得到解決?
筆者給出一種方案:結構體化設計你的一堆參數(shù)。
相信一提到在,有過Win32API使用的同學會恍然大悟;這種手法對于成熟的工程庫很常見。
即將相關性較大的參數(shù)盡量放入一個結構體中,使得函數(shù)參數(shù)數(shù)量控制在3~4個之際。最終得到簡化函數(shù)的使用的目的。
但是這種設計也還是需要面對一個問題:參數(shù)值初始化。所以也就引出下面的話題。
3. 設計這種參數(shù)的初始化函數(shù),給一種默認處理方案。
對于一個包含眾多參數(shù)的結構體,其初始化盡量遵循:“變量填0,指針指NULL“
為何?強迫使用者規(guī)范變量的初始化。給需要用到結構體的函數(shù)設定一種簡易的默認運行動作。下方給出初始化函數(shù)設計具體實例。
bool InitFunc(struct FuncStruct*? Default)
{
???? Default->Count = 0;
?????? ?? Default->Lenth = 0;
?????? ?? Default->List = NULL;
?????? Default->Source = 0;
?????? //……其它參數(shù)盡量按照原則
?
?????? return 1;
}
4.參數(shù)中的特例 ---- 回調函數(shù)。
在此處插入這個話題有些突兀,但是也是需要警惕的。對于回調函數(shù),盡量將其函數(shù)地址以及參數(shù)整合在一個結構體內;所以上述初始化操作顯得格外重要,一旦回調函數(shù)參數(shù)傳遞不正確,程序多半崩潰,而且查驗極為困難。
5. 設計禁忌?goto語句的使用
?????? 最后聊一點老師不讓干的活----goto語句,相信第一次學習某種高級語言,老師都會對你說:goto和標簽一起使用,但是現(xiàn)在不用了,容易帶出BUG?;蛘咧苯踊乇?。
?????? 但是,goto的前身可是匯編的專用:跳轉指令。如果其真的如講述的那般不堪,那為何還有這么多語言仍然保留?可見,goto仍有其值得學習的點。
?
引入下列問題:
多層循環(huán)嵌套中,如何從最內層直接跳出所有循環(huán)?
解決方案最經典的是:修改最外層循環(huán)成立條件,使得循環(huán)終止。但是最外層循環(huán)如果是while(1)呢?
這時候只有使用goto,(也許有小伙伴會說用longjump(),但是本質還是此類跳轉,僅僅距離不同).
代碼如下:

可見,某些異常處理有goto這類跳轉指令顯然解決更加輕松了。
但是務必記?。?span id="s0sssss00s" class="color-pink-03">goto被人詬病最多的就是濫用,每次的跳轉都應當是迫不得已的終止;往前跳一般會讓你的代碼產生BUG.
(Ps:setjump與longjump()請讀者自行查閱使用,并且比較與goto的差別。)