亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 編程規范與范例(3).htm

?? 編程規范大全
?? HTM
?? 第 1 頁 / 共 5 頁
字號:
<P align=center><FONT size=3><A href="http://cxjr.21ic.org/" target=_blank><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blog.21ic.org/uploadfile-/20051217161245384.gif" border=0></A></FONT></P></TD></TR></TBODY></TABLE></P>
<TD vAlign=top align=middle width=660>
<P align=left>
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=1 cellPadding=3 width="100%" bgColor=#cccccc border=0>
<TBODY>
<TR bgColor=#f8f8f8>
<TD><STRONG><FONT color=#ff0000>廣告(2號位)</FONT></STRONG></TD></TR>
<TR bgColor=#ffffff>
<TD>
<DIV align=center>
<ADDRESS>&nbsp;<A href="http://www.3gmcu.com/" target=_blank><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" src="http://blog.21ic.org/uploadfile-/2005122820932375.gif" border=0></A></ADDRESS></DIV></TD></TR></TBODY></TABLE></P>
<P align=left>
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=1 cellPadding=3 width="100%" bgColor=#cccccc border=0>
<TBODY>
<TR bgColor=#f8f8f8>
<TD><STRONG><FONT color=#ff0000>酷貼推薦 <FONT color=#ff0000>[</FONT><A href="http://blog.21ic.org/more.asp?name=cxjr&amp;id=7437" target=_blank><U><FONT color=#ff0000>更多…… </FONT></U></A><FONT color=#ff0000>]</FONT></FONT></STRONG></TD></TR>
<TR bgColor=#ffffff>
<TD>
<P align=left>
<TABLE borderColor=#cccccc cellSpacing=2 cellPadding=3 width="100%" bgColor=#ffffff border=1>
<TBODY>
<TR>
<TD>
<P align=center>&nbsp;[<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=16591"><U><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000>歲月如歌——記匠人的百寶箱博客開通一周年</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=17379"><U><FONT color=#0000ff>事件驅動觀念</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=17377"><U><FONT color=#0000ff>單片機程序設計中運用事件驅動機制</FONT></U></A>]</P></TD>
<TR>
<TD>
<P align=center>[<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=18941"><U><FONT color=#0000ff>計算機族必喝的健康飲料</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=18714"><U><FONT color=#0000ff>男人·女人·電腦</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=18713"><U><FONT color=#0000ff>學編程的人不能不看的好文章</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=18742"><U><FONT color=#0000ff>PIC機與MCS-51的區別</FONT></U></A>]</P></TD>
<TR>
<TD>
<P align=center>[<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=19794"><U><FONT color=#0000ff>一種軟件去除鍵抖動的方法</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=19752"><U><FONT color=#0000ff>司馬光,你干嘛砸缸?</FONT></U></A>] [<A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=19748"><U><FONT color=#0000ff>編碼規范</FONT></U></A>]&nbsp;</P></TD>
<TR>
<TD>
<P align=center><FONT color=#ff0000>調查:[</FONT><A href="http://21icbbs.com/club/vote/showvote.asp?id=98" target=_blank><U><FONT color=#ff0000>您認為《匠人的百寶箱》如何?</FONT></U></A><FONT color=#ff0000>] [</FONT><A href="http://21icbbs.com/club/vote/showvote.asp?id=129" target=_blank><U><FONT color=#ff0000>您最喜歡《匠人的百寶箱》中哪個欄目?</FONT></U></A><FONT color=#ff0000>] [</FONT><A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=18993"><U><FONT color=#ff0000>請網友來評選最佳隊員專欄</FONT></U></A><FONT color=#ff0000>]</FONT>&nbsp;</P></TD></TR></TBODY></TABLE></P></TD></TR></TBODY></TABLE></P>
<P align=left>
<TABLE style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" cellSpacing=1 cellPadding=3 width="100%" bgColor=#cccccc border=0>
<TBODY>
<TR bgColor=#f8f8f8>
<TD>
<P align=left><FONT color=#ff0000 size=4><STRONG><img src=images/face/5.gif ><a href=blog.asp?name=cxjr&subjectid=66>[編程技巧]<a href=more.asp?name=cxjr&id=2756>編程規范與范例(3)</a></STRONG></FONT><BR>程序匠人&nbsp;&nbsp;&nbsp; 2005-8-27 20:16:00&nbsp;&nbsp;&nbsp;&nbsp; <a href=more.asp?name=cxjr&id=2756>閱讀全文(732)</a> | <a href=more.asp?name=cxjr&id=2756#comment>回復(0)</a> | <a href=showtb.asp?id=2756 target=_blank>引用(0)</a><BR><FONT face=宋體 size=4><STRONG>[</STRONG></FONT><A href="http://blog.21ic.org/more.asp?name=cxjr&amp;id=6250" target=_blank><FONT face=宋體 color=#ff0000 size=4><STRONG>廣告8號位</STRONG></FONT></A><FONT face=宋體 size=4><STRONG>]&nbsp;[</STRONG></FONT><A href="http://blog.21ic.org/more.asp?name=cxjr&amp;id=7705"><U><FONT style="BACKGROUND-COLOR: #000000" face=宋體 color=#ffffff size=4><STRONG>免責聲明</STRONG></FONT></U></A><FONT face=宋體 size=4><STRONG>] [</STRONG><A href="http://blog.21ic.com/more.asp?name=cxjr&amp;id=18993"><U><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000 size=3><STRONG>請網友來評選最佳隊員專欄!</STRONG></FONT></U></A><STRONG>]</STRONG></FONT></P></TD></TR>
<TR bgColor=#ffffff>
<TD height=0>
<DIV align=left><P>編程規范與范例(3)&nbsp; <BR>〖文章轉載或出處〗≡中國電子技術信息網≡ 網址:<A href="http://www.CETINet.com">www.CETINet.com</A> <BR>編程規范與范例(3)</P>
<P>目&nbsp; 錄<BR>1 排版 6<BR>2 注釋 11<BR>3 標識符命名 18<BR>4 可讀性 20<BR>5 變量、結構 22<BR>6 函數、過程 28<BR>7 可測性 36<BR>8 程序效率 40<BR>9 質量保證 44<BR>10 代碼編輯、編譯、審查 50<BR>11 代碼測試、維護 52<BR>12 宏 53</P>
<P><BR>6 函數、過程<BR>&amp;sup1; 6-1:對所調用函數的錯誤返回碼要仔細、全面地處理。<BR>&amp;sup1; 6-2:明確函數功能,精確(而不是近似)地實現函數設計。<BR>&amp;sup1; 6-3:編寫可重入函數時,應注意局部變量的使用(如編寫C/C++語言的可重入函數時,應使用auto即缺省態局部變量或寄存器變量)。<BR>說明:編寫C/C++語言的可重入函數時,不應使用static局部變量,否則必須經過特殊處理,才能使函數具有可重入性。<BR>&amp;sup1; 6-4:編寫可重入函數時,若使用全局變量,則應通過關中斷、信號量(即P、V操作)等手段對其加以保護。<BR>說明:若對所使用的全局變量不加以保護,則此函數就不具有可重入性,即當多個進程調用此函數時,很有可能使有關全局變量變為不可知狀態。<BR>示例:假設Exam是int型全局變量,函數Squre_Exam返回Exam平方值。那么如下函數不具有可重入性。<BR>unsigned int example( int para )<BR>{<BR>&nbsp;&nbsp;&nbsp; unsigned int temp;</P>
<P>&nbsp;&nbsp;&nbsp; Exam = para; // (**)<BR>&nbsp;&nbsp;&nbsp; temp = Square_Exam( );</P>
<P>&nbsp;&nbsp;&nbsp; return temp;<BR>}</P>
<P>此函數若被多個進程調用的話,其結果可能是未知的,因為當(**)語句剛執行完后,另外一個使用本函數的進程可能正好被激活,那么當新激活的進程執行到此函數時,將使Exam賦與另一個不同的para值,所以當控制重新回到“temp = Square_Exam( )”后,計算出的temp很可能不是預想中的結果。此函數應如下改進。<BR>unsigned int example( int para )<BR>{<BR>&nbsp;&nbsp;&nbsp; unsigned int temp;</P>
<P>&nbsp;&nbsp;&nbsp; [申請信號量操作]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 若申請不到“信號量”,說明另外的進程正處于<BR>&nbsp;&nbsp;&nbsp; Exam = para;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 給Exam賦值并計算其平方過程中(即正在使用此<BR>&nbsp;&nbsp;&nbsp; temp = Square_Exam( );&nbsp; // 信號),本進程必須等待其釋放信號后,才可繼<BR>&nbsp;&nbsp;&nbsp; [釋放信號量操作]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 續執行。若申請到信號,則可繼續執行,但其<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 它進程必須等待本進程釋放信號量后,才能再使<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 用本信號。<BR>&nbsp;&nbsp;&nbsp; return temp;<BR>}<BR>&amp;sup1; 6-5:在同一項目組應明確規定對接口函數參數的合法性檢查應由函數的調用者負責還是由接口函數本身負責,缺省是由函數調用者負責。<BR>說明:對于模塊間接口函數的參數的合法性檢查這一問題,往往有兩個極端現象,即:要么是調用者和被調用者對參數均不作合法性檢查,結果就遺漏了合法性檢查這一必要的處理過程,造成問題隱患;要么就是調用者和被調用者均對參數進行合法性檢查,這種情況雖不會造成問題,但產生了冗余代碼,降低了效率。<BR>&amp;frac12; 6-1:防止將函數的參數作為工作變量。<BR>說明:將函數的參數作為工作變量,有可能錯誤地改變參數內容,所以很危險。對必須改變的參數,最好先用局部變量代之,最后再將該局部變量的內容賦給該參數。<BR>示例:下函數的實現不太好。<BR>void sum_data( unsigned int num, int *data, int *sum )<BR>{<BR>&nbsp;&nbsp;&nbsp; unsigned int count;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; *sum = 0;<BR>&nbsp;&nbsp;&nbsp; for (count = 0; count &lt; num; count++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *sum&nbsp; += data[count]; // sum成了工作變量,不太好。<BR>&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P>若改為如下,則更好些。<BR>void sum_data( unsigned int num, int *data, int *sum )<BR>{<BR>&nbsp;&nbsp;&nbsp; unsigned int count ;<BR>&nbsp;&nbsp;&nbsp; int sum_temp;<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; sum_temp = 0;<BR>&nbsp;&nbsp;&nbsp; for (count = 0; count &lt; num; count ++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum_temp&nbsp; += data[count]; <BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; *sum = sum_temp;<BR>}<BR>&amp;frac12; 6-2:函數的規模盡量限制在200行以內。<BR>說明:不包括注釋和空格行。<BR>&amp;frac12; 6-3:一個函數僅完成一件功能。<BR>&amp;frac12; 6-4:為簡單功能編寫函數。<BR>說明:雖然為僅用一兩行就可完成的功能去編函數好象沒有必要,但用函數可使功能明確化,增加程序可讀性,亦可方便維護、測試。<BR>示例:如下語句的功能不很明顯。<BR>value = ( a &gt; b ) ? a : b ;</P>
<P>改為如下就很清晰了。<BR>int max (int a, int b)<BR>{<BR>&nbsp;&nbsp;&nbsp; return ((a &gt; b) ? a : b);<BR>}</P>
<P>value = max (a, b);</P>
<P>或改為如下。<BR>#define MAX (a, b) (((a) &gt; (b)) ? (a) : (b))</P>
<P>value = MAX (a, b);<BR>&amp;frac12; 6-5:不要設計多用途面面俱到的函數。<BR>說明:多功能集于一身的函數,很可能使函數的理解、測試、維護等變得困難。<BR>&amp;frac12; 6-6:函數的功能應該是可以預測的,也就是只要輸入數據相同就應產生同樣的輸出。<BR>說明:帶有內部“存儲器”的函數的功能可能是不可預測的,因為它的輸出可能取決于內部存儲器(如某標記)的狀態。這樣的函數既不易于理解又不利于測試和維護。在C/C++語言中,函數的static局部變量是函數的內部存儲器,有可能使函數的功能不可預測,然而,當某函數的返回值為指針類型時,則必須是STATIC的局部變量的地址作為返回值,若為AUTO類,則返回為錯針。<BR>示例:如下函數,其返回值(即功能)是不可預測的。<BR>unsigned int integer_sum( unsigned int base )<BR>{<BR>&nbsp;&nbsp;&nbsp; unsigned int index;<BR>&nbsp;&nbsp;&nbsp; static unsigned int sum = 0; // 注意,是static類型的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 若改為auto類型,則函數即變為可預測。<BR>&nbsp;&nbsp;&nbsp; for (index = 1; index &lt;= base; index++)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum += index;<BR>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp; return sum;<BR>}<BR>&amp;frac12; 6-7:盡量不要編寫依賴于其他函數內部實現的函數。<BR>說明:此條為函數獨立性的基本要求。由于目前大部分高級語言都是結構化的,所以通過具體語言的語法要求與編譯器功能,基本就可以防止這種情況發生。但在匯編語言中,由于其靈活性,很可能使函數出現這種情況。<BR>示例:如下是在DOS下TASM的匯編程序例子。過程Print_Msg的實現依賴于Input_Msg的具體實現,這種程序是非結構化的,難以維護、修改。<BR>...&nbsp; // 程序代碼<BR>proc Print_Msg // 過程(函數)Print_Msg<BR>&nbsp;&nbsp;&nbsp; ...&nbsp; // 程序代碼<BR>&nbsp;&nbsp;&nbsp; jmp&nbsp; LABEL<BR>&nbsp;&nbsp;&nbsp; ...&nbsp; // 程序代碼<BR>endp</P>
<P>proc Input_Msg // 過程(函數)Input_Msg<BR>&nbsp;&nbsp;&nbsp; ...&nbsp; // 程序代碼<BR>LABEL:<BR>&nbsp;&nbsp;&nbsp; ...&nbsp; // 程序代碼<BR>endp<BR>&amp;frac12; 6-8:避免設計多參數函數,不使用的參數從接口中去掉。<BR>說明:目的減少函數間接口的復雜度。<BR>&amp;frac12; 6-9:非調度函數應減少或防止控制參數,盡量只使用數據參數。<BR>說明:本建議目的是防止函數間的控制耦合。調度函數是指根據輸入的消息類型或控制命令,來啟動相應的功能實體(即函數或過程),而本身并不完成具體功能。控制參數是指改變函數功能行為的參數,即函數要根據此參數來決定具體怎樣工作。非調度函數的控制參數增加了函數間的控制耦合,很可能使函數間的耦合度增大,并使函數的功能不唯一。<BR>示例:如下函數構造不太合理。<BR>int add_sub( int a, int b, unsigned char add_sub_flg )<BR>{<BR>&nbsp;&nbsp;&nbsp; if (add_sub_flg == INTEGER_ADD)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (a + b);<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (a&nbsp;&nbsp; b);<BR>&nbsp;&nbsp;&nbsp; }<BR>}</P>
<P>不如分為如下兩個函數清晰。<BR>int add( int a, int b )<BR>{<BR>&nbsp;&nbsp;&nbsp; return (a + b);<BR>}</P>
<P>int sub( int a, int b ) <BR>{<BR>&nbsp;&nbsp;&nbsp; return (a&nbsp;&nbsp; b);<BR>}<BR>&amp;frac12; 6-10:檢查函數所有參數輸入的有效性。<BR>&amp;frac12; 6-11:檢查函數所有非參數輸入的有效性,如數據文件、公共變量等。<BR>說明:函數的輸入主要有兩種:一種是參數輸入;另一種是全局變量、數據文件的輸入,即非參數輸入。函數在使用輸入之前,應進行必要的檢查。<BR>&amp;frac12; 6-12:函數名應準確描述函數的功能。<BR>&amp;frac12; 6-13:使用動賓詞組為執行某操作的函數命名。如果是OOP方法,可以只有動詞(名詞是對象本身)。<BR>示例:參照如下方式命名函數。<BR>void print_record( unsigned int rec_ind ) ;<BR>int&nbsp; input_record( void ) ;<BR>unsigned char get_current_color( void ) ;<BR>建議6-14:避免使用無意義或含義不清的動詞為函數命名。<BR>說明:避免用含義不清的動詞如process、handle等為函數命名,因為這些動詞并沒有說明要具體做什么。<BR>建議6-15:函數的返回值要清楚、明了,讓使用者不容易忽視錯誤情況。<BR>說明:函數的每種出錯返回值的意義要清晰、明了、準確,防止使用者誤用、理解錯誤或忽視錯誤返回碼。<BR>&amp;frac12; 6-16:除非必要,最好不要把與函數返回值類型不同的變量,以編譯系統默認的轉換方式或強制的轉換方式作為返回值返回。<BR>&amp;frac12; 6-17:讓函數在調用點顯得易懂、容易理解。<BR>&amp;frac12; 6-18:在調用函數填寫參數時,應盡量減少沒有必要的默認數據類型轉換或強制數據類型轉換。<BR>說明:因為數據類型轉換或多或少存在危險。<BR>&amp;frac12; 6-19:避免函數中不必要語句,防止程序中的垃圾代碼。<BR>說明:程序中的垃圾代碼不僅占用額外的空間,而且還常常影響程序的功能與性能,很可能給程序的測試、維護等造成不必要的麻煩。<BR>&amp;frac12; 6-20:防止把沒有關聯的語句放到一個函數中。<BR>說明:防止函數或過程內出現隨機內聚。隨機內聚是指將沒有關聯或關聯很弱的語句放到同一個函數或過程中。隨機內聚給函數或過程的維護、測試及以后的升級等造成了不便,同時也使函數或過程的功能不明確。使用隨機內聚函數,常常容易出現在一種應用場合需要改進此函數,而另一種應用場合又不允許這種改進,從而陷入困境。<BR>在編程時,經常遇到在不同函數中使用相同的代碼,許多開發人員都愿把這些代碼提出來,并構成一個新函數。若這些代碼關聯較大并且是完成一個功能的,那么這種構造是合理的,否則這種構造將產生隨機內聚的函數。<BR>示例:如下函數就是一種隨機內聚。<BR>void Init_Var( void )<BR>{<BR>&nbsp;&nbsp;&nbsp; Rect.length = 0;<BR>&nbsp;&nbsp;&nbsp; Rect.width = 0; /* 初始化矩形的長與寬 */<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; Point.x = 10;<BR>&nbsp;&nbsp;&nbsp; Point.y = 10;&nbsp;&nbsp; /* 初始化“點”的坐標 */<BR>}</P>
<P>矩形的長、寬與點的坐標基本沒有任何關系,故以上函數是隨機內聚。<BR>應如下分為兩個函數:<BR>void Init_Rect( void )<BR>{<BR>&nbsp;&nbsp;&nbsp; Rect.length = 0;<BR>&nbsp;&nbsp;&nbsp; Rect.width = 0; /* 初始化矩形的長與寬 */<BR>}</P>
<P>void Init_Point( void )<BR>{<BR>&nbsp;&nbsp;&nbsp; Point.x = 10;<BR>&nbsp;&nbsp;&nbsp; Point.y = 10;&nbsp;&nbsp; /* 初始化“點”的坐標 */<BR>}<BR>&amp;frac12; 6-21:如果多段代碼重復做同一件事情,那么在函數的劃分上可能存在問題。<BR>說明:若此段代碼各語句之間有實質性關聯并且是完成同一件功能的,那么可考慮把此段代碼構造成一個新的函數。<BR>&amp;frac12; 6-22:功能不明確較小的函數,特別是僅有一個上級函數調用它時,應考慮把它合并到上級函數中,而不必單獨存在。<BR>說明:模塊中函數劃分的過多,一般會使函數間的接口變得復雜。所以過小的函數,特別是扇入很低的或功能不明確的函數,不值得單獨存在。<BR>&amp;frac12; 6-23:設計高扇入、合理扇出(小于7)的函數。<BR>說明:扇出是指一個函數直接調用(控制)其它函數的數目,而扇入是指有多少上級函數調用它。<BR>扇出過大,表明函數過分復雜,需要控制和協調過多的下級函數;而扇出過小,如總是1,表明函數的調用層次可能過多,這樣不利程序閱讀和函數結構的分析,并且程序運行時會對系統資源如堆棧空間等造成壓力。函數較合理的扇出(調度函數除外)通常是3-5。扇出太大,一般是由于缺乏中間層次,可適當增加中間層次的函數。扇出太小,可把下級函數進一步分解多個函數,或合并到上級函數中。當然分解或合并函數時,不能改變要實現的功能,也不能違背函數間的獨立性。<BR>扇入越大,表明使用此函數的上級函數越多,這樣的函數使用效率高,但不能違背函數間的獨立性而單純地追求高扇入。公共模塊中的函數及底層函數應該有較高的扇入。<BR>較良好的軟件結構通常是頂層函數的扇出較高,中層函數的扇出較少,而底層函數則扇入到公共模塊中。<BR>&amp;frac12; 6-24:減少函數本身或函數間的遞歸調用。<BR>說明:遞歸調用特別是函數間的遞歸調用(如A-&gt;B-&gt;C-&gt;A),影響程序的可理解性;遞歸調用一般都占用較多的系統資源(如棧空間);遞歸調用對程序的測試有一定影響。故除非為某些算法或功能的實現方便,應減少沒必要的遞歸調用。<BR>&amp;frac12; 6-25:仔細分析模塊的功能及性能需求,并進一步細分,同時若有必要畫出有關數據流圖,據此來進行模塊的函數劃分與組織。<BR>說明:函數的劃分與組織是模塊的實現過程中很關鍵的步驟,如何劃分出合理的函數結構,關系到模塊的最終效率和可維護性、可測性等。根據模塊的功能圖或/及數據流圖映射出函數結構是常用方法之一。<BR>&amp;frac12; 6-26:改進模塊中函數的結構,降低函數間的耦合度,并提高函數的獨立性以及代碼可讀性、效率和可維護性。優化函數結構時,要遵守以下原則:<BR>(1)不能影響模塊功能的實現。<BR>(2)仔細考查模塊或函數出錯處理及模塊的性能要求并進行完善。<BR>(3)通過分解或合并函數來改進軟件結構。<BR>(4)考查函數的規模,過大的要進行分解。<BR>(5)降低函數間接口的復雜度。<BR>(6)不同層次的函數調用要有較合理的扇入、扇出。<BR>(7)函數功能應可預測。<BR>(8)提高函數內聚。(單一功能的函數內聚最高)<BR>說明:對初步劃分后的函數結構應進行改進、優化,使之更為合理。<BR>&amp;frac12; 6-27:在多任務操作系統的環境下編程,要注意函數可重入性的構造。<BR>說明:可重入性是指函數可以被多個任務進程調用。在多任務操作系統中,函數是否具有可重入性是非常重要的,因為這是多個進程可以共用此函數的必要條件。另外,編譯器是否提供可重入函數庫,與它所服務的操作系統有關,只有操作系統是多任務時,編譯器才有可能提供可重入函數庫。如DOS下BC和MSC等就不具備可重入函數庫,因為DOS是單用戶單任務操作系統。<BR>&amp;frac12; 6-28:避免使用BOOL參數。<BR>說明:原因有二,其一是BOOL參數值無意義,TURE/FALSE的含義是非常模糊的,在調用時很難知道該參數到底傳達的是什么意思;其二是BOOL參數值不利于擴充。還有NULL也是一個無意義的單詞。<BR>&amp;frac12; 6-29: 對于提供了返回值的函數,在引用時最好使用其返回值。<BR>&amp;frac12; 6-30:當一個過程(函數)中對較長變量(一般是結構的成員)有較多引用時,可以用一個意義相當的宏代替。 <BR>說明:這樣可以增加編程效率和程序的可讀性。<BR>示例:在某過程中較多引用TheReceiveBuffer[FirstSocket].byDataPtr,<BR>則可以通過以下宏定義來代替:<BR># define pSOCKDATA TheReceiveBuffer[FirstScoket].byDataPtr <BR>&nbsp;<BR><A></A></P></DIV></TD></TR></TBODY></TABLE><FONT color=#ff0000></FONT>
<P align=right><A href="http://blog.21ic.org/blog.asp?name=cxjr" target=_blank><FONT color=#ff0000>如果你的‘芯’是一座作坊,我愿做那不知疲倦的程序匠。打造一流博客,我們每天在努力!</FONT></A></P><A href="http://blog.21ic.org/blog.asp?name=cxjr" target=_blank><FONT color=#ff0000></FONT></A><br><a name='comment'></a><table width='90%' border='0' align='center' cellspacing='0' cellpadding='0'> <tr> <td><strong>發表評論:</strong></tr></td></table>
<table width='90%' border='0' align='center' cellspacing='0' cellpadding='0'> <tr> <td><table align='left' width='100%' border='0' cellspacing='0' cellpadding='0'>
<form action='more.asp?name=cxjr&id=2756&action=addcomment_ic' method='post' name='commentform' onSubmit='return Verifycomment()'>
<tr><td height='25'  align='left'>昵稱:<input name='UserName' type='text' id='UserName' size='15' maxlength='20' value=''></td></tr>
<tr><td height='25' align='left'>密碼:<input name='Password' type='password' id='Password' size='15' maxlength='20' value=''> (游客無須輸入密碼)</td></tr>
<tr ><td height='25' align='left'  >驗證碼:<input name='GetCode' type='text' id='GetCode' size='12' maxlength='20' />&nbsp;<img src='inc/code.asp' width='40' height='10' border='0' /><td></tr><tr ><td height='25' align='left'  >主頁:<input name='homepage' type='text' id='homepage' size='42' maxlength='50' value='http://'><td></tr><tr ><td height='25' align='left'  >標題:<input name='commenttopic' type='text' id='commenttopic' size='42' maxlength='50' value='回復:編程規范與范例(3)'><td></tr><tr height='200'><td ><INPUT type='hidden' name='edit' id='edit' value=''>
<link rel="STYLESHEET" type="text/css" href="images/edit.css">

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲福利视频导航| 国产精品18久久久久久久久| 免费高清在线视频一区·| 国产乱一区二区| 精品视频免费看| 国产精品网站在线| 日本午夜一区二区| 色综合天天综合狠狠| 精品成人在线观看| 一区二区三区在线看| 国产精品一区免费视频| 制服.丝袜.亚洲.中文.综合| 国产精品妹子av| 激情综合网天天干| 91精品国产综合久久久久久久久久| 亚洲国产高清不卡| 久久精品理论片| 精品污污网站免费看| 中文字幕一区二| 国产精品资源网站| 欧美zozo另类异族| 蜜桃一区二区三区在线| 欧美日韩国产综合视频在线观看 | www.亚洲精品| 精品盗摄一区二区三区| 美女网站一区二区| 欧美一卡在线观看| 麻豆视频观看网址久久| 日韩一区二区在线看| 日韩专区欧美专区| 欧美精品在线视频| 午夜天堂影视香蕉久久| 色欲综合视频天天天| 日韩美女精品在线| 91网址在线看| 亚洲日本韩国一区| 一本到不卡免费一区二区| 中文字幕一区二区三区在线观看 | 日本不卡一区二区三区| 欧美老肥妇做.爰bbww视频| 亚洲午夜影视影院在线观看| 色婷婷av一区二区三区大白胸 | 亚洲精品免费在线观看| 亚洲1区2区3区视频| 国产成人在线色| 精品欧美黑人一区二区三区| 日韩精品每日更新| 欧美绝品在线观看成人午夜影视| 亚洲精品国产成人久久av盗摄| 91亚洲国产成人精品一区二三| 亚洲欧洲精品一区二区三区不卡 | 日产国产高清一区二区三区 | jlzzjlzz亚洲日本少妇| 中文字幕精品三区| 色综合咪咪久久| 亚洲综合色区另类av| 欧美日韩一区二区三区在线看| 午夜视频在线观看一区二区| 欧美一级艳片视频免费观看| 久久精品99久久久| 国产精品久久免费看| 国产v日产∨综合v精品视频| 26uuu久久天堂性欧美| 国产福利91精品| 国产精品全国免费观看高清| 色婷婷久久久综合中文字幕| 男女性色大片免费观看一区二区 | 97国产一区二区| 肉肉av福利一精品导航| 久久人人97超碰com| 99国产精品一区| 蜜桃av一区二区三区电影| 国产日韩精品一区二区浪潮av| 91福利小视频| 久久国产尿小便嘘嘘| 亚洲人成影院在线观看| 日韩欧美国产综合在线一区二区三区| 粉嫩欧美一区二区三区高清影视| 亚洲午夜免费视频| 久久久久国产精品麻豆| 欧美三级三级三级爽爽爽| 激情深爱一区二区| 亚洲一区二区av在线| 国产亚洲婷婷免费| 欧美乱妇一区二区三区不卡视频| 国产二区国产一区在线观看| 日韩精品亚洲专区| 亚洲免费av观看| 国产日韩欧美激情| 日韩欧美亚洲国产另类| 色94色欧美sute亚洲13| 国产精品亚洲第一区在线暖暖韩国| 亚洲香蕉伊在人在线观| 国产精品拍天天在线| 日韩午夜在线影院| 欧美日韩亚洲另类| 91啦中文在线观看| 成人午夜在线播放| 国产老妇另类xxxxx| 日韩国产欧美在线播放| 亚洲一区二区三区三| 国产精品电影一区二区三区| 久久久久久久久久久99999| 日韩一区二区麻豆国产| 欧美日韩免费一区二区三区 | 极品少妇xxxx精品少妇| 丝袜诱惑亚洲看片| 亚洲国产日韩综合久久精品| 国产精品久久久久久福利一牛影视| 精品国内二区三区| 精品美女在线播放| 欧美电影免费观看高清完整版在线 | 欧美日韩免费一区二区三区 | 国产视频一区二区在线| 日韩一区二区在线观看| 欧美精品1区2区| 欧美在线影院一区二区| 91丝袜美女网| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 欧美日韩在线精品一区二区三区激情| 91亚洲资源网| 91在线你懂得| 一本大道综合伊人精品热热| 91蝌蚪porny九色| 97精品电影院| 在线观看日产精品| 欧美日韩一区高清| 91精品国产一区二区三区香蕉| 欧美片在线播放| 日韩一区二区免费在线电影 | 欧美亚洲一区二区三区四区| 欧美三级电影在线看| 欧美日韩精品一二三区| 欧美嫩在线观看| 日韩一区二区在线看| 久久久久久免费| 国产精品高清亚洲| 亚洲一区二区三区中文字幕 | 日本欧美一区二区在线观看| 久久成人久久爱| 国产高清不卡一区二区| 91免费版在线| 欧美日韩在线播放三区四区| 日韩视频中午一区| 中文字幕免费不卡在线| 亚洲综合久久久久| 精品系列免费在线观看| 不卡影院免费观看| 欧美日韩国产欧美日美国产精品| 精品少妇一区二区三区视频免付费 | 中文字幕在线视频一区| 一区二区三区加勒比av| 日本成人在线网站| 成人午夜精品在线| 欧美色综合网站| 精品88久久久久88久久久| 自拍偷拍国产精品| 久久精品国产一区二区三区免费看| 国产成人综合在线观看| 91久久精品一区二区三区| 日韩精品一区二区在线观看| 中文在线一区二区| 视频一区视频二区在线观看| 国产精品1区2区3区在线观看| 欧美主播一区二区三区美女| 精品国产麻豆免费人成网站| 亚洲精品中文字幕在线观看| 国内精品国产三级国产a久久| 一本到一区二区三区| 久久综合国产精品| 午夜激情一区二区三区| 成人精品一区二区三区中文字幕| 欧美一三区三区四区免费在线看| 国产精品麻豆一区二区| 免费人成在线不卡| 欧洲一区在线电影| 中文字幕一区二区日韩精品绯色| 久久99精品久久久久婷婷| 欧美自拍偷拍午夜视频| 国产精品福利电影一区二区三区四区 | 最新欧美精品一区二区三区| 精品一区二区免费看| 欧美日韩国产小视频| 一区二区三区欧美亚洲| 国产a精品视频| 精品国偷自产国产一区| 青青草成人在线观看| 欧美在线免费视屏| 亚洲男帅同性gay1069| 国产91色综合久久免费分享| 精品国产麻豆免费人成网站| 日本aⅴ免费视频一区二区三区| 欧美色图在线观看| 亚洲狠狠爱一区二区三区| 本田岬高潮一区二区三区| 国产亚洲一区二区三区四区 | 精品女同一区二区| 麻豆国产精品一区二区三区| 欧美男人的天堂一二区| 亚洲国产日韩综合久久精品|