軟件質量保證與測試PPT課件第8章 高質量編程_第1頁
軟件質量保證與測試PPT課件第8章 高質量編程_第2頁
軟件質量保證與測試PPT課件第8章 高質量編程_第3頁
軟件質量保證與測試PPT課件第8章 高質量編程_第4頁
軟件質量保證與測試PPT課件第8章 高質量編程_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1第第8章章 高質量編程高質量編程 2內容提要內容提要p8.1 代碼風格代碼風格l8.1.1程序的書寫格式l8.1.2windows程序命名規(guī)則l8.1.3共性規(guī)則l8.1.4表達式和基本語句p8.2 函數(shù)設計規(guī)則函數(shù)設計規(guī)則l8.2.1函數(shù)外部特性的注釋規(guī)則l8.2.2參數(shù)規(guī)則l8.2.3返回值的規(guī)則l8.2.4函數(shù)內部的實現(xiàn)規(guī)則p8.3 提高程序質量的技術提高程序質量的技術l8.3.1內存管理規(guī)則l8.3.2面向對象的設計規(guī)則p8.4 代碼審查代碼審查l8.4.1代碼審查的主要工作l8.4.2代碼審查的流程l8.4.3java代碼審查的常見錯誤p8.5 小結小結38.1 代碼風格代碼風格p

2、統(tǒng)一編程風格的意義很大,是一個優(yōu)秀而且職業(yè)統(tǒng)一編程風格的意義很大,是一個優(yōu)秀而且職業(yè)化的開發(fā)團隊所必需的素質。化的開發(fā)團隊所必需的素質。l增加開發(fā)過程代碼的強壯性、可讀性、易維護性。l減少有經驗和無經驗開發(fā)人員編程所需的腦力工作,為軟件的良好維護性打下好的基礎。通過人為以及自動的方式對最終軟件應用質量標準,通過人為以及自動的方式對最終軟件應用質量標準,使新的開發(fā)人員快速適應項目氛圍。使新的開發(fā)人員快速適應項目氛圍。l支持項目資源的復用:允許開發(fā)人員從一個項目區(qū)域移動到另一個,而不需要重新適應新的子項目團隊的氛圍。48.1.1程序的書寫格式程序的書寫格式p版本的聲明格式版本的聲明格式/copyr

3、ight 2011,北京侏羅紀公司xx部/all rights reserved./文件名稱:filename.h/文件標識:見配置管理計劃書/摘 要:簡要描述本文件的內容/ 當前版本:2.1/作 者:輸入作者名字/完成日期:2011年3月20日/取代版本:2.0/原作者 :輸入原作者名字/完成日期:2011年2月10日/5頭文件的書寫格式頭文件的書寫格式 p頭文件必須包含下列頭文件必須包含下列內容:內容:l頭文件開頭處的版權和版本聲明。l預處理塊。l函數(shù)和類結構聲明等。/ 版權和版本聲明見示例1-1。#ifndef graphics_h /防止graphics.h被重復引用#define g

4、raphics_h#include /引用標準庫的頭文件#include “myheader.h” /引用非標準庫的頭文件void function1(); /全局函數(shù)聲明class box /類結構聲明;#endif6定義文件的書寫格式定義文件的書寫格式 p定義文件的書寫格式:定義文件的書寫格式:必須包含三部分內容:必須包含三部分內容:l定義文件開頭處的版權和版本聲明;l對一些頭文件的引用;l程序的實現(xiàn)體(包括數(shù)據(jù)和代碼)。/ 版權和版本聲明見示例1-1,此處省略。#include “graphics.h”/引用頭文件/全局函數(shù)的實現(xiàn)體void function1()/ 類成員函數(shù)的實現(xiàn)體v

5、oid draw()7空行的使用空行的使用 /空行/空行void function1()/空行/空行void function2()/空行/空行void function3()/空行while(condition)statement1;/空行if(condition)statement2;elsestatement3;/ 空行statement4; 8 void func1(int x,int y,int z); /良好的風格void func1(int x,int y,int z); /不良的風格if (year=2000) /良好的風格if(year=2000) /不良的風格if (a=b

6、)&(c=b&c=d) /不良的風格for (i=0;i10;i+) /良好的風格for(i=0;i10;i+) /不良的風格for (i=0;i10;i+) / 過多的空格x = a b ? a : b; /良好的風格x=afunction(); / 不要寫成b - function();代碼行內的空格代碼行內的空格 98.1.2windows程序命名規(guī)則程序命名規(guī)則p匈牙利命名法是一種編程時的命名規(guī)范。基本原則是:變量名匈牙利命名法是一種編程時的命名規(guī)范。基本原則是:變量名屬性類型對象描述,其中每一對象的名稱都要求有明確屬性類型對象描述,其中每一對象的名稱都要求有明確含義,

7、可以取對象名字全稱或名字的一部分。命名要基于容易含義,可以取對象名字全稱或名字的一部分。命名要基于容易記憶容易理解的原則。保證名字的連貫性是非常重要的。記憶容易理解的原則。保證名字的連貫性是非常重要的。l舉例來說,表單的名稱為form,那么在匈牙利命名法中可以簡寫為frm,則當表單變量名稱為switchboard時,變量全稱應該為frmswitchboard。這樣可以很容易從變量名看出switchboard是一個表單,同樣,如果此變量類型為標簽,那么就應命名成lblswitchboard。可以看出,匈牙利命名法非常便于記憶,而且使變量名非常清晰易懂,這樣,增強了代碼的可讀性,方便各程序員之間相

8、互交流代碼。p據(jù)說這種命名法是一位叫據(jù)說這種命名法是一位叫charles simonyi的匈牙利程序員的匈牙利程序員發(fā)明的,后來他在微軟呆了幾年,于是發(fā)明的,后來他在微軟呆了幾年,于是 這種命名法就通過微軟這種命名法就通過微軟的各種產品和文檔資料向世界傳播開了。的各種產品和文檔資料向世界傳播開了。p現(xiàn)在,大部分程序員不管自己使用什么軟件進行開發(fā),或多或現(xiàn)在,大部分程序員不管自己使用什么軟件進行開發(fā),或多或少都使用了這種命名法。少都使用了這種命名法。10常用的數(shù)據(jù)類型前綴常用的數(shù)據(jù)類型前綴 前綴前綴類型類型例子例子bboolbisparentby,bytebytebyflag,byteflagc

9、hcharchtextfn函數(shù)變量fncallbackhhandle(句柄)hwndiintivaluenintnvalueuunsigned intuflagdwdworddwdatap指針pbuffersz,str字符串szbufferlpstr,lpszlpstrlpstrmessagewwordwdatax,y坐標xpos,yposm_類成員變量m_bflag,m_nvalg_全局變量g_bflag,g_nmsg11常用的控件名前綴常用的控件名前綴 前綴前綴控件類型控件類型frm,wnd窗口cmd,btn按鈕cmb,combo下拉式列表框txt文本輸入框lbl標簽grdgrid,網格s

10、cr滾動條lst列表框frame框架128.1.3共性規(guī)則共性規(guī)則 p提示提示1較短的單詞可通過去掉較短的單詞可通過去掉“元音元音”形成縮寫;較長的單詞形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫;一些單詞有大家公認的縮寫。可取單詞的頭幾個字母形成縮寫;一些單詞有大家公認的縮寫。l示例:如下單詞的縮寫能夠被大家基本認可。ltemp 可縮寫為 tmp ;lflag 可縮寫為 flg ;lstatistic 可縮寫為 stat ;lincrement 可縮寫為 inc ;lmessage 可縮寫為 msg ;p提示提示2 應該在源文件的開始之處,對文件中所使用的縮寫或應該在源文件的開始之處,對

11、文件中所使用的縮寫或約定,特別是特殊的縮寫,進行必要的注釋說明。約定,特別是特殊的縮寫,進行必要的注釋說明。l標識符最好采用英文單詞或其組合,便于記憶和閱讀,可望文知意,不必進行“解碼”。不能使用漢語拼音來命名。程序中的英文單詞一般不會太復雜,用詞應當準確。例如不要把currentvalue寫成nowvalue。138.1.4表達式和基本語句表達式和基本語句p1. 表達式與復合表達式表達式與復合表達式示例如下表達式,考慮不周就可能出問題,也較難理解。* stat_poi + += 1;* + stat_poi += 1;應分別改為如下。*stat_poi += 1;stat_poi+; / 此

12、二語句功能相當于“ * stat_poi + += 1; ”和+ stat_poi;*stat_poi += 1; / 此二語句功能相當于“ * + stat_poi += 1; ”14if語句語句 假設布爾變量名字為假設布爾變量名字為flag,它與零值比較的標準,它與零值比較的標準if語句如下:語句如下:if (flag)/ 表示表示flag為真為真if (!flag)/ 表示表示flag為假為假其它的用法都屬于不良風格,例如:其它的用法都屬于不良風格,例如:if (flag = true)if (flag = 1 )if (flag = false)if (flag = 0)/我覺得應該采

13、用我覺得應該采用if(flag = true)來表示,賦值用)來表示,賦值用flag = true;/因為不同操作系統(tǒng)的因為不同操作系統(tǒng)的true和和false不一樣,如不一樣,如windows里里true是是1而有些系統(tǒng)而有些系統(tǒng)/true是是0 cyj應當將整型變量用應當將整型變量用“=”或或“!=”直接與直接與0比較。比較。假設整型變量的名字為假設整型變量的名字為value,它與零值比較的標準,它與零值比較的標準if語句如下:語句如下:if (value = 0)if (value != 0)不可模仿布爾變量的風格而寫成不可模仿布爾變量的風格而寫成if (value)/ 會讓人誤解會讓人

14、誤解value是布爾變量是布爾變量if (!value)不可將浮點變量用不可將浮點變量用“=”或或“!=”與任何數(shù)字比較。與任何數(shù)字比較。15循環(huán)語句的效率循環(huán)語句的效率 for(row=0; row100; row+)for( col=0; col5; col+ )sum=sum+arowcol;for (col=0; col5; col+ )for (row=0; row100; row+) sum=sum+arowcol;16建議建議p【建議】如果循環(huán)體【建議】如果循環(huán)體內存在邏輯判斷,并內存在邏輯判斷,并且循環(huán)次數(shù)很大,宜且循環(huán)次數(shù)很大,宜將邏輯判斷移到循環(huán)將邏輯判斷移到循環(huán)體的外面。

15、體的外面。p例如,下面代碼:例如,下面代碼: for (i=0; in; i+)if (condition) dosomething();else dootherthing();if (condition)for (i=0; in; i+) dosomething();else for (i=0; in; i+) dootherthing();17建議建議p【建議】【建議】for語句的語句的循環(huán)控制變量的取值循環(huán)控制變量的取值采用采用“半開半閉區(qū)間半開半閉區(qū)間”寫法。例如寫法。例如for (x=0; xn; x+)for (x=0; x=n-1; x+)18c+類中的常量類中的常量 不能在類聲

16、明中初始化不能在類聲明中初始化const數(shù)據(jù)成員。以下用法是錯誤的,因為類的對象未被創(chuàng)建時,數(shù)據(jù)成員。以下用法是錯誤的,因為類的對象未被創(chuàng)建時,編譯器不知道編譯器不知道size的值是什么。的值是什么。class a const int size = 100; / 錯誤,企圖在類聲明中初始化錯誤,企圖在類聲明中初始化const數(shù)據(jù)成員數(shù)據(jù)成員int arraysize;/ 錯誤,未知的錯誤,未知的size;const數(shù)據(jù)成員的初始化只能在類構造函數(shù)的初始化表中進行,例如數(shù)據(jù)成員的初始化只能在類構造函數(shù)的初始化表中進行,例如class a a(int size););/ 構造函數(shù)構造函數(shù) cons

17、t int size ; ;a:a(int size) : size(size)/ 構造函數(shù)的初始化表構造函數(shù)的初始化表 a a(100););/ 對象對象a的的size值為值為100a b(200););/ 對象對象b的的size值為值為200198.2 函數(shù)設計規(guī)則函數(shù)設計規(guī)則p函數(shù)是函數(shù)是c+/c程序的基本功能單元,其重要性程序的基本功能單元,其重要性不言而喻。不言而喻。l函數(shù)設計的細微缺點很容易導致該函數(shù)被錯用,所以光使函數(shù)的功能正確是不夠的。p函數(shù)接口的兩個要素是參數(shù)和返回值。函數(shù)接口的兩個要素是參數(shù)和返回值。c+ 語語言中,函數(shù)的參數(shù)和返回值的傳遞方式有三種:言中,函數(shù)的參數(shù)和返回

18、值的傳遞方式有三種:值傳遞(值傳遞(pass by value)、指針傳遞()、指針傳遞(pass by pointer)、引用傳遞()、引用傳遞(pass by reference)。)。208.2.1函數(shù)外部特性的注釋規(guī)則函數(shù)外部特性的注釋規(guī)則函數(shù)外部特性注釋必須在函數(shù)體上部采用中文說明,標準格式如下:函數(shù)外部特性注釋必須在函數(shù)體上部采用中文說明,標準格式如下:/輸入參數(shù):輸入參數(shù):/參數(shù)參數(shù)1:(指出參數(shù)的物理意義、量綱、取值范圍等信息)(指出參數(shù)的物理意義、量綱、取值范圍等信息)/參數(shù)參數(shù)n:/函數(shù)返回:函數(shù)返回:/ (指出返回值的物理意義、量綱、取值范圍等信息)(指出返回值的物理意義

19、、量綱、取值范圍等信息)/功能描述:功能描述:/注意事項:注意事項:/218.2.2參數(shù)規(guī)則參數(shù)規(guī)則建議建議對僅作為輸入的參數(shù),盡量使用對僅作為輸入的參數(shù),盡量使用const修飾符。修飾符。如果輸入參數(shù)以值傳遞的方式傳遞對象,則宜改用“const &”方式來傳遞,這樣可以省去臨時對象的構造和析構過程,從而提高效率。參數(shù)缺省值只能出現(xiàn)在函數(shù)的聲明中,而不能出現(xiàn)在定義體中。例如:void foo(int x=0,int y=0); / 正確,缺省值出現(xiàn)在函數(shù)的聲明中void foo(int x=0,int y=0)/ 錯誤,缺省值出現(xiàn)在函數(shù)的定義體中如果函數(shù)有多個參數(shù),參數(shù)只能從后向前挨個

20、兒缺省,否則將導致函數(shù)調用語句怪模怪樣。例如:void foo(int x,int y=0,int z=0);/正確void foo(int x=0,int y,int z=0);/錯誤【建議】避免函數(shù)有太多的參數(shù),參數(shù)個數(shù)盡量控制在【建議】避免函數(shù)有太多的參數(shù),參數(shù)個數(shù)盡量控制在5個以內。如果參數(shù)太多,個以內。如果參數(shù)太多,在使用時容易將參數(shù)類型或順序搞錯。在使用時容易將參數(shù)類型或順序搞錯。【建議】盡量不要使用類型和數(shù)目不確定的參數(shù)。【建議】盡量不要使用類型和數(shù)目不確定的參數(shù)。c標準庫函數(shù)標準庫函數(shù)printf是采用不是采用不確定參數(shù)的典型代表,其原型為:確定參數(shù)的典型代表,其原型為:int

21、 printf(const chat *format,argument););這種風格的函數(shù)在編譯時喪失了嚴格的類型安全檢查。這種風格的函數(shù)在編譯時喪失了嚴格的類型安全檢查。【建議】非調度函數(shù)應減少或防止控制參數(shù),盡量只使用數(shù)據(jù)參數(shù)。該規(guī)則可【建議】非調度函數(shù)應減少或防止控制參數(shù),盡量只使用數(shù)據(jù)參數(shù)。該規(guī)則可降低代碼的控制耦合。降低代碼的控制耦合。228.2.3返回值的規(guī)則返回值的規(guī)則p【建議】有時候函數(shù)原本不需要返回值,但為了增加靈活【建議】有時候函數(shù)原本不需要返回值,但為了增加靈活性如支持鏈式表達,可以附加返回值。性如支持鏈式表達,可以附加返回值。p【建議】如果函數(shù)的返回值是一個對象,有些

22、場合用【建議】如果函數(shù)的返回值是一個對象,有些場合用“引引用傳遞用傳遞”替換替換“值傳遞值傳遞”可以提高效率。而有些場合只能可以提高效率。而有些場合只能用用“值傳遞值傳遞”而不能用而不能用“引用傳遞引用傳遞”,否則會出錯。,否則會出錯。p【建議】函數(shù)要盡量只有一個返回點。【建議】函數(shù)要盡量只有一個返回點。l不能返回引用和指針到局部對象。l說明 離開函數(shù)作用域時會銷毀局部對象;使用銷毀了的對象會造成災難。l不可返回由 new 初始化,之后又已解除引用的指針。l說明 由于支持鏈式表達式,造成返回對象不能刪除,導致內存泄漏。238.2.4函數(shù)內部的實現(xiàn)規(guī)則函數(shù)內部的實現(xiàn)規(guī)則p提示提示在同一項目組應明

23、確規(guī)定對接口函數(shù)參數(shù)的合法性檢查在同一項目組應明確規(guī)定對接口函數(shù)參數(shù)的合法性檢查應由函數(shù)的調用者負責還是由接口函數(shù)本身負責,缺省是由函應由函數(shù)的調用者負責還是由接口函數(shù)本身負責,缺省是由函數(shù)調用者負責。數(shù)調用者負責。p說明:對于模塊間接口函數(shù)的參數(shù)的合法性檢查這一問題,往說明:對于模塊間接口函數(shù)的參數(shù)的合法性檢查這一問題,往往有兩個極端現(xiàn)象,即:要么是調用者和被調用者對參數(shù)均不往有兩個極端現(xiàn)象,即:要么是調用者和被調用者對參數(shù)均不作合法性檢查,結果就遺漏了合法性檢查這一必要的處理過程,作合法性檢查,結果就遺漏了合法性檢查這一必要的處理過程,造成問題隱患;要么就是調用者和被調用者均對參數(shù)進行合法

24、造成問題隱患;要么就是調用者和被調用者均對參數(shù)進行合法性檢查,這種情況雖不會造成問題,但產生了冗余代碼,降低性檢查,這種情況雖不會造成問題,但產生了冗余代碼,降低了效率。了效率。l(c+代碼)使 operator= 檢查自賦值。p說明說明 執(zhí)行檢查有兩點重要的理由:首先,派生類對象的賦值執(zhí)行檢查有兩點重要的理由:首先,派生類對象的賦值涉及到調用每一個基類(在繼承層次結構中位于此類的上方)涉及到調用每一個基類(在繼承層次結構中位于此類的上方)的賦值操作符,跳過這些操作符就可以節(jié)省很多運行時間。其的賦值操作符,跳過這些操作符就可以節(jié)省很多運行時間。其次,在復制次,在復制“rvalue”對象前,賦值

25、涉及到解構對象前,賦值涉及到解構“l(fā)value”對對象。在自賦值時,象。在自賦值時,rvalue 對象在賦值前就已銷毀了,因此賦值對象在賦值前就已銷毀了,因此賦值的結果是不確定的。的結果是不確定的。248.3 提高程序質量的技術提高程序質量的技術p8.3.1內存管理規(guī)則內存管理規(guī)則lbill gates在1981年曾經說過:640k ought to be enough for everybody。程序員們經常編寫內存管理程序,往往提心吊膽。l同時,由于個人編程的習慣性缺陷,導致同類問題重復出現(xiàn),如果不想觸雷,唯一的解決辦法就是發(fā)現(xiàn)所有潛伏的地雷并且排除它們。25內存分配方式內存分配方式p按照

26、內存分配的位置不同,內存分配方式有三種:按照內存分配的位置不同,內存分配方式有三種:l從靜態(tài)存儲區(qū)域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。l在棧上創(chuàng)建。在執(zhí)行函數(shù)時,函數(shù)內局部變量的存儲單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結束時這些存儲單元自動被釋放。l棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。l從堆上分配,亦稱動態(tài)內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態(tài)內存的生存期由我們決定,使用非常靈活,但問題也最多。26常見的

27、錯誤情況常見的錯誤情況 p內存分配未成功,卻使用了它。內存分配未成功,卻使用了它。p內存分配雖然成功,但是尚未初始化就引用它。內存分配雖然成功,但是尚未初始化就引用它。p內存分配成功并且已經初始化,但操作越過了內存的邊界。內存分配成功并且已經初始化,但操作越過了內存的邊界。p忘記了釋放內存,造成內存泄露。忘記了釋放內存,造成內存泄露。p釋放了內存卻繼續(xù)使用它。釋放了內存卻繼續(xù)使用它。l程序中的對象調用關系過于復雜,實在難以搞清楚某個對象究竟是否已經釋放了內存,此時應該重新設計數(shù)據(jù)結構,從根本上解決對象管理的混亂局面。l函數(shù)的return語句寫錯了,注意不要返回指向“棧內存”的“指針”或者“引用

28、”,因為該內存在函數(shù)體結束時被自動銷毀。l使用free或delete釋放了內存后,沒有將指針設置為null。導致產生“野指針”。l用malloc或new申請內存之后,應該立即檢查指針值是否為null。防止使用指針值為null的內存。27注意事項注意事項 p不要忘記為數(shù)組和動態(tài)內存賦初值。防止將未被初始化不要忘記為數(shù)組和動態(tài)內存賦初值。防止將未被初始化的內存作為右值使用。的內存作為右值使用。p避免數(shù)組或指針的下標越界,特別要當心發(fā)生避免數(shù)組或指針的下標越界,特別要當心發(fā)生“多多1”或或者者“少少1”操作。操作。p動態(tài)內存的申請與釋放必須配對,防止內存泄漏。動態(tài)內存的申請與釋放必須配對,防止內存泄

29、漏。p用用free或或delete釋放了內存之后,立即將指針設置為釋放了內存之后,立即將指針設置為null,防止產生,防止產生“野指針野指針”。pmalloc返回值的類型是返回值的類型是void *,所以在調用,所以在調用malloc時要顯式地進行類型轉換,將時要顯式地進行類型轉換,將void * 轉換成所需要的轉換成所需要的指針類型。指針類型。p用用delete釋放對象數(shù)組時,留意不要丟了符號。釋放對象數(shù)組時,留意不要丟了符號。p檢查程序中內存申請檢查程序中內存申請/釋放操作的成對性,防止內存泄釋放操作的成對性,防止內存泄漏。漏。28指針與數(shù)組的區(qū)別指針與數(shù)組的區(qū)別 char a = “he

30、llo”;a0 = x;cout a endl;char *p = “world”; / 注意p指向常量字符串p0 = x; / 編譯器不能發(fā)現(xiàn)該錯誤cout p endl;29內存中指針參數(shù)的傳遞內存中指針參數(shù)的傳遞 void getmemory(char *p,int num)p=(char*)malloc(sizeof(char)*num);void test(void)char *str = null;getmemory(str,100); / str 仍然為 nullstrcpy(str,hello); / 運行錯誤30示例用指向指針的指針申請動態(tài)示例用指向指針的指針申請動態(tài)內存內存

31、 p如果非得要用指針參如果非得要用指針參數(shù)去申請內存,那么數(shù)去申請內存,那么應該改用應該改用“指向指針指向指針的指針的指針”,見示例。,見示例。void getmemory2(char *p,int num) *p = (char *)malloc(sizeof(char) * num);void test2(void) char *str = null; getmemory2(&str,100); / 注意參數(shù)是 &str,而不是str strcpy(str,hello); cout str endl; free(str); 318.3.2面向對象的設計規(guī)則面向對象的設計規(guī)則

32、 p比較面向對象程序設計和面向過程程序設計,還可以得到比較面向對象程序設計和面向過程程序設計,還可以得到面向對象程序設計的其他優(yōu)點:面向對象程序設計的其他優(yōu)點:l數(shù)據(jù)抽象的概念可以在保持外部接口不變的情況下改變內部實現(xiàn),從而減少甚至避免對外界的干擾;l通過繼承大幅減少冗余的代碼,并可以方便地擴展現(xiàn)有代碼,提高編碼效率,也減低了出錯概率,降低軟件維護的難度;l結合面向對象分析、面向對象設計,允許將問題域中的對象直接映射到程序中,減少軟件開發(fā)過程中中間環(huán)節(jié)的轉換過程;l通過對對象的辨別、劃分可以將軟件系統(tǒng)分割為若干相對為獨立的部分,在一定程度上更便于控制軟件復雜度;l以對象為中心的設計可以幫助開發(fā)

33、人員從靜態(tài)(屬性)和動態(tài)(方法)兩個方面把握問題,從而更好地實現(xiàn)系統(tǒng);l通過對象的聚合、聯(lián)合可以在保證封裝與抽象的原則下實現(xiàn)對象在內在結構以及外在功能上的擴充,從而實現(xiàn)對象由低到高的升級。32開開-閉原則(閉原則(open-closed principle,ocp) p開開-閉原則的定義及優(yōu)點閉原則的定義及優(yōu)點p實現(xiàn)實現(xiàn)“開開-閉閉”原則原則p對可變性的封裝原則對可變性的封裝原則33里氏代換原則(里氏代換原則(liskov substitution principle,lsp) p里氏代換原則的定義里氏代換原則的定義l定義:如果對每一個類型為t1的對象o1,都有類型為t2 的對象o2,使得以t

34、1定義的所有程序p在所有的對象o1都代換為o2時,程序p的行為沒有變化,那么類型t2是類型t1的子類型。l即,一個軟件實體如果使用的是一個基類的話,那么一定適用于其子類。而且它覺察不出基類對象和子類對象的區(qū)別。也就是說,在軟件里面,把基類都替換成它的子類,程序的行為沒有變化。l反過來的代換不成立,如果一個軟件實體使用的是一個子類的話,那么它不一定適用于基類。任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。基于契約的設計、抽象出公共部分作為抽象基類的設計。p里氏代換原則與里氏代換原則與“開開-閉閉”原則的關系原則的關系l實現(xiàn)“開-閉”原則的關鍵步驟是抽象化。基類與子類之間的繼承關系就是抽象化的體現(xiàn)。因

35、此里氏代換原則是對實現(xiàn)抽象化的具體步驟的規(guī)范。違反里氏代換原則意味著違反了“開-閉”原則,反之未必。34依賴倒轉原則(依賴倒轉原則(dependence inversion principle,dip) 接口實例接口實例/* interface imaneuverable provides the specification for a maneuverable vehicle */public interface imaneuverable public void left();(); public void right();(); public void forward();(); pub

36、lic void reverse();(); public void climb();(); public void dive();(); public void setspeed(double speed);); public double getspeed();(); public class car implements imaneuverablepublic class board implements imaneuverablepublic class submarine implements imaneuverable35討論討論p依賴倒轉原則依賴倒轉原則p關系關系p我們決定耦合的

37、程度的依據(jù)何在呢?我們決定耦合的程度的依據(jù)何在呢?p怎樣將大系統(tǒng)拆分成小系統(tǒng)怎樣將大系統(tǒng)拆分成小系統(tǒng)p怎樣做到依賴倒轉?怎樣做到依賴倒轉?p依賴倒轉原則的優(yōu)缺點依賴倒轉原則的優(yōu)缺點36合成合成/聚合復用原則(聚合復用原則(carp) p概念概念p合成和聚合合成和聚合p合成合成/聚合的優(yōu)缺點聚合的優(yōu)缺點p繼承來進行復用的優(yōu)缺點繼承來進行復用的優(yōu)缺點37迪米特法則(迪米特法則(law of demeter,lod) p概述概述p狹義的迪米特法則狹義的迪米特法則p狹義的迪米特法則的缺點狹義的迪米特法則的缺點p廣義的迪米特法則廣義的迪米特法則p廣義迪米特法則在類的設計上的體現(xiàn)廣義迪米特法則在類的設計上

38、的體現(xiàn)38接口隔離原則(接口隔離原則(interface separate principle,isp) p概念概念p如何實現(xiàn)接口隔離原則如何實現(xiàn)接口隔離原則l不應該強迫用戶依賴于他們不用的方法。利用委托分離接口。利用委托分離接口。利用多繼承分離接口。利用多繼承分離接口。39一些基本的設計模式一些基本的設計模式 pabstract factory:提供一個創(chuàng)建一系列相關或相互依賴對:提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。象的接口,而無需指定它們具體的類。padapter:將一個類的接口轉換成客戶希望的另外一個接口。:將一個類的接口轉換成客戶希望的另外一個接口。ad

39、apter模式使得原本由于接口不兼容而不能一起工作的那些模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。類可以一起工作。pbridge:將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立:將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。地變化。pbuilder:將一個復雜對象的構建與它的表示分離,使得同樣:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。的構建過程可以創(chuàng)建不同的表示。pchain of responsibility:為解除請求的發(fā)送者和接收者之:為解除請求的發(fā)送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連間耦合,而

40、使多個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。pcommand:將一個請求封裝為一個對象,從而使你可用不同:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及的請求對客戶進行參數(shù)化;對請求排隊或記錄請求日志,以及支持可取消的操作。支持可取消的操作。40pcomposite:將對象組合成樹形結構以表示:將對象組合成樹形結構以表示“部分部分-整體整體”的的層次結構。它使得客戶對單個對象和復合對象的使用具有一致層次結構。它使得客戶對單個對象和復合

41、對象的使用具有一致性。性。pdecorator:動態(tài)地給一個對象添加一些額外的職責。就擴展:動態(tài)地給一個對象添加一些額外的職責。就擴展功能而言,它比生成子類方式更為靈活。功能而言,它比生成子類方式更為靈活。pfacade:為子系統(tǒng)中的一組接口提供一個一致的界面,:為子系統(tǒng)中的一組接口提供一個一致的界面,f a c a d e模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。容易使用。pfactory method:定義一個用于創(chuàng)建對象的接口,讓子類決:定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實例化。定將哪一個類實例化。fact

42、ory method使一個類的實例化延使一個類的實例化延遲到其子類。遲到其子類。pflyweight:運用共享技術有效地支持大量細粒度的對象。:運用共享技術有效地支持大量細粒度的對象。pinterpreter:給定一個語言,定義它的文法的一種表示,并:給定一個語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。41piterator:提供一種方法順序訪問一個聚合對象中各個元素,而又不:提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該對象的內部表示。需暴露該對象的內部表示。pmediator:用一個

43、中介對象來封裝一系列的對象交互。中介者使各:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。它們之間的交互。pmemento:在不破壞封裝性的前提下,捕獲一個對象的內部狀態(tài),:在不破壞封裝性的前提下,捕獲一個對象的內部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到保存的狀并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復到保存的狀態(tài)。態(tài)。pobserver:定義對象間的一種一對多的依賴關系,以便當一個對象:定義對象間的一種一對多的依賴關系,

44、以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。pprototype:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這個原:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這個原型來創(chuàng)建新的對象。型來創(chuàng)建新的對象。pproxy:為其他對象提供一個代理以控制對這個對象的訪問。:為其他對象提供一個代理以控制對這個對象的訪問。psingleton:保證一個類僅有一個實例,并提供一個訪問它的全局訪:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。問點。42pstate:允許一個對象在其內部狀態(tài)改變時改變它:允許一個對象在其內

45、部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它所屬的類。的行為。對象看起來似乎修改了它所屬的類。pstrategy:定義一系列的算法,把它們一個個封:定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算裝起來,并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的客戶。法的變化可獨立于使用它的客戶。ptemplate method:定義一個操作中的算法的骨:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。架,而將一些步驟延遲到子類中。template method使得子類可以不改變一個算法的結構即使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

46、可重定義該算法的某些特定步驟。pvisitor:表示一個作用于某對象結構中的各元素:表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。下定義作用于這些元素的新操作。438.4 代碼審查代碼審查p8.4.1代碼審查的主要工作代碼審查的主要工作l代碼審查的主要工作:發(fā)現(xiàn)代碼中的bug;從代碼的易維護性、可擴展性角度考察代碼的質量,提出修改建議。是否符合是否符合java開發(fā)規(guī)范和代碼審核檢查表開發(fā)規(guī)范和代碼審核檢查表l代碼編寫者,代碼審核者共同對代碼的質量承擔責任。這樣才能保證這樣才能保證code review不是走過場,其中不是走過

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論