




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第6章軟件設計本章學習目標1.了解軟件設計的主要目標。2.掌握有關軟件設計的基本概念。3.掌握結構化軟件設計的基本方法。4.重點掌握面向?qū)ο笤O計方法。5.掌握軟件詳細設計方法。6.掌握人機交互界面設計的基本原則。7.了解軟件設計模式的基本概念軟件工程中的設計1結構化設計2面向?qū)ο蟮脑O計3用戶界面設計4軟件設計優(yōu)化5序言
20世紀90年代初,MitchKapor發(fā)表的“軟件設計宣言”中這樣寫道:什么是設計?設計就是你身處兩個世界——技術世界和人類的目標世界,而你嘗試將這兩個世界結合在一起……序言軟件設計是軟件工程過程中的核心技術。在這個階段,軟件工程師設計出軟件的“藍圖”,創(chuàng)建各種軟件模型,讓這些模型能正確反映出客戶的需求,并為系統(tǒng)實現(xiàn)提供軟件體系結構、數(shù)據(jù)結構、接口和構件的細節(jié)。序言
面向?qū)ο蟮能浖O計方法把OOA階段得到的需求模型進行逐步擴充:把類或?qū)ο筮M一步修改和細化,設計屬性、方法,以及類或者對象之間的聯(lián)系,由一組協(xié)同工作的對象共同完成整個系統(tǒng)功能。面向?qū)ο蟮脑O計模型一般包括四個部分:問題論域、人機交互、任務管理和數(shù)據(jù)管理。6.1軟件工程的設計6.1.1設計原理
在傳統(tǒng)軟件工程方法學中形成的軟件設計的基本原理,在面向?qū)ο笤O計時依然成立,此外還增加了一些與面向?qū)ο蠓椒ㄌ卣飨嚓P的新特點。(1)模塊化
在軟件工程領域,軟件可以被劃分成為一系列獨立命名、可處理的部件,有時也被稱為模塊。6.1軟件工程的設計6.1.1設計原理(1)模塊化
在過程化語言中過程、函數(shù)、子程序、宏等都可以看作模塊。在面向?qū)ο蟪绦蛟O計中的類或類的方法也可以稱之為模塊。
模塊化將復雜系統(tǒng)分解為可管理的模塊。這種處理問題的方式體現(xiàn)了設計中“關注點分離”的概念,即希望將復雜問題分解為可以獨立解決和(或)優(yōu)化的若干塊,從而使得這個復雜問題能夠更容易地被處理。6.1軟件工程的設計圖6-1模塊化和軟件成本6.1軟件工程的設計(2)抽象
抽象是人類在認識復雜現(xiàn)象過程中使用的一種思維工具。它把無數(shù)現(xiàn)象中相似的方面集中和概括起來,暫時忽略它們之間的差異,提取出事物的本質(zhì)特征。抽象通過抑制不必要的細節(jié),同時強調(diào)和集中在當前重要的細節(jié)來達到逐步求精的目標。6.1軟件工程的設計(3)信息隱蔽信息隱蔽是指在設計和確定模塊時,使得一個模塊內(nèi)包含的信息對于不需要這些信息的其他模塊來說,是不可訪問的。(4)模塊的獨立性模塊獨立性是模塊內(nèi)部各部分及模塊間關系的一種衡量標準。模塊獨立性概念是模塊化、抽象概念和信息隱蔽的直接結果,也是完成模塊設計中需要遵循的基本標準。模塊獨立性可以使用兩個定性的標準評估:內(nèi)聚性和耦合性。6.1軟件工程的設計
模塊的內(nèi)聚性反映了某個模塊相關功能的強度,是信息隱蔽概念的自然擴展。一個內(nèi)聚的模塊執(zhí)行一個獨立的任務,與程序的其他部分部件只需要很少的交互。簡單地說,一個內(nèi)聚的模塊應該只完成一件事情。模塊的耦合性顯示了模塊間的相互依賴性,表明了在軟件結構中多個模塊之間的相互連接程度。耦合性依賴于模塊之間的接口復雜性、引用或進入模塊所在的點以及什么數(shù)據(jù)通過接口傳遞等因素。6.1軟件工程的設計表6-1模塊的內(nèi)聚內(nèi)聚級別(低到高)內(nèi)聚名稱定義1偶然性內(nèi)聚
如果一個模塊內(nèi)部各部分之間沒聯(lián)系,即使有也很松散,則稱該模塊為偶然性內(nèi)聚2邏輯性內(nèi)聚
模塊把幾種相關功能代碼組合在一起,每次調(diào)用時,由傳給模塊的判定參數(shù)來確定該模塊應執(zhí)行哪一種功能,則稱該模塊為邏輯性內(nèi)聚模塊3時間性內(nèi)聚
如果一個模塊內(nèi)部的幾個功能必須在同一時間內(nèi)執(zhí)行(例如一個初始化模塊),但這些功能只是因為時間因素關聯(lián)在一起,則稱該模塊為時間性內(nèi)聚模塊4過程性內(nèi)聚
如果一個模塊內(nèi)部的處理成分是相關的,且必須以特定的次序執(zhí)行,則稱該模塊為過程性內(nèi)聚6.1軟件工程的設計續(xù)表6-1模塊的內(nèi)聚內(nèi)聚級別(低到高)內(nèi)聚名稱定義5通信性內(nèi)聚
如果一個模塊內(nèi)部的各部分功能使用相同的輸入數(shù)據(jù),或者產(chǎn)生相同的輸出數(shù)據(jù),則稱該模塊為通信內(nèi)聚模塊6功能性內(nèi)聚
如果一個模塊中各個部分都是完成某一具體功能必不可少的組成部分,或者說該模塊中所有部分都是為了完成一項具體功能而協(xié)同工作,緊密聯(lián)系,不可分割,則稱該模塊為內(nèi)聚模塊7信息性內(nèi)聚
如果模塊能夠完成多個功能,各個功能都在相同的數(shù)據(jù)結構上操作,每一項功能有一個唯一的入口點,代碼相對獨立。這個模塊將根據(jù)不同的要求,確定執(zhí)行哪一個功能,則稱該模塊為信息性內(nèi)聚模塊6.1軟件工程的設計表6-2模塊的耦合耦合級別(低到高)耦合名稱定義1內(nèi)容耦合
如果一個模塊直接修改另一個模塊的數(shù)據(jù),或直接跳轉(zhuǎn)入另一個模塊,則稱這兩個模塊之間存在著內(nèi)容耦合2公共耦合
如果兩個模塊都訪問同一個公共數(shù)據(jù)環(huán)境,并且該公共數(shù)據(jù)環(huán)境是全局數(shù)據(jù)結構、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū)等,則稱這兩個模塊之間存在著公共耦合3控制耦合
如果一個模塊通過傳遞開關、標志、名字等控制信息,明顯地控制選擇另一模塊的功能,則稱這兩個模塊之間存在著控制耦合4標記耦合
如果兩個模塊通過參數(shù)表傳遞記錄信息,并且這個記錄是某一數(shù)據(jù)結構的子結構,不是簡單變量,則稱這兩個模塊之間存在著標記耦合6.1軟件工程的設計續(xù)表6-2模塊的耦合耦合級別(低到高)耦合名稱定義5數(shù)據(jù)耦合
如果一個模塊訪問另一個模塊,彼此間通過簡單數(shù)據(jù)參數(shù)來交換輸入、輸出信息,并且這里的簡單數(shù)據(jù)參數(shù)不同于控制參數(shù)、公共數(shù)據(jù)結構或外部變量,則稱這兩個模塊之間存在著數(shù)據(jù)耦合6非直接耦合
如果兩模塊間沒有直接關系,之間的聯(lián)系完全是通過主模塊的控制和調(diào)用來實現(xiàn)的,則稱這兩個模塊之間不存在耦合,或者稱為存在非直接耦合
在軟件設計中,要盡可能保持模塊內(nèi)部的高內(nèi)聚和模塊之間的低耦合。6.1軟件工程的設計6.1.2設計過程
軟件設計的主要任務是要解決“如何做”的問題。在軟件設計過程中一般要完成數(shù)據(jù)/類、軟件體系結構、接口、構件級和部署級幾個基本設計模型的創(chuàng)建。
數(shù)據(jù)設計或者類設計:首先以用戶或者客戶看待數(shù)據(jù)的角度來創(chuàng)建數(shù)據(jù)模型和(或)信息模型,然后通過逐步求精將其轉(zhuǎn)化為特定于實現(xiàn)的表示,例如應用級別的數(shù)據(jù)庫或者業(yè)務級別的數(shù)據(jù)倉庫等。6.1軟件工程的設計
體系結構設計:定義軟件主要結構元素之間的關系、可用于達到系統(tǒng)所定義需求的體系結構風格、設計模式以及影響體系結構實現(xiàn)方式的約束。
接口設計:定義了軟件和協(xié)作系統(tǒng)之間、軟件和使用人員之間的通信。
構件級設計:將軟件體系結構的結構元素變換為對軟件構件的過程性描述。構件通常是指“系統(tǒng)中模塊化的,可部署和可替換的部件,封裝了實現(xiàn)并對外開放一組接口”。
部署級設計:規(guī)劃如何將軟件功能和子系統(tǒng)分布在物理計算環(huán)境中。6.1軟件工程的設計圖6-2從需求模型到設計模型的轉(zhuǎn)化6.2結構化設計6.2.1結構化設計主要步驟圖6-3結構化設計的基本流程6.2結構化設計步驟1:進一步分析和審查需求分析階段得到的數(shù)據(jù)流圖。步驟2:根據(jù)系統(tǒng)的數(shù)據(jù)流圖形式來確定系統(tǒng)的數(shù)據(jù)處理方式屬于“變換型”還是“事務型”。步驟3:根據(jù)不同數(shù)據(jù)處理類型,參照不同的方式,逐步給出初始的系統(tǒng)結構圖。步驟4:利用啟發(fā)式規(guī)則(如模塊的耦合性)多次修改,得到最終的系統(tǒng)結構圖。6.2結構化設計步驟5:根據(jù)需求分析階段得到的數(shù)據(jù)字典和實體關系圖進行數(shù)據(jù)庫設計或者是數(shù)據(jù)文件設計。步驟6:根據(jù)數(shù)據(jù)流圖中對加工的說明、輸入輸出說明進行模塊的接口設計。步驟7:使用詳細設計工具(如程序流程圖、PDL、盒圖等)描述模塊內(nèi)部的詳細設計。步驟8:制定測試計劃。
典型的數(shù)據(jù)流類型有變換型數(shù)據(jù)流和事務型數(shù)據(jù)流,根據(jù)不同數(shù)據(jù)流類型,可以轉(zhuǎn)化成不同的系統(tǒng)結構。6.2結構化設計(1)變換型數(shù)據(jù)流映射圖6-4變換型數(shù)據(jù)流圖6.2結構化設計(1)變換型數(shù)據(jù)流映射圖6-5具有變換型特征系統(tǒng)的模塊結構圖6.2結構化設計(2)事務型數(shù)據(jù)流映射圖6-6具有事務處理中心的數(shù)據(jù)流6.2結構化設計圖6-7具體有事務型特征的系統(tǒng)結構圖6.2結構化設計
首先對系統(tǒng)的模塊進行劃分,通過系統(tǒng)結構圖來表示模塊之間組成,然后用程序描述語言(ProgramDesignLanguage,簡稱PDL)來描述模塊內(nèi)部詳細設計,并給出數(shù)據(jù)庫表的部分簡單設計。6.2.2結構化設計實例6.2結構化設計(1)系統(tǒng)結構圖圖6-8智慧教室管理系統(tǒng)結構圖6.2結構化設計(2)模塊詳細設計//用戶管理PDLvoidlogin(String角色,String用戶名,String密碼){switch(角色)case管理員:if(verify(用戶名,密碼)==true){//verify將賬號密碼與數(shù)據(jù)庫對應信息對比
頁面跳轉(zhuǎn)到"管理員頁面";}else{
頁面跳轉(zhuǎn)到錯誤頁面;}break;case用戶或操作員或調(diào)度員或維修員:if(verify(賬號,密碼)==true){//verify將賬號密碼與數(shù)據(jù)庫對應信息對比
頁面跳轉(zhuǎn)到對應角色頁面;}else{
頁面跳轉(zhuǎn)到錯誤頁面;}}6.2結構化設計(2)模塊詳細設計booleanregister(String用戶類型,String用戶名,String密碼){if(userIsExist()){returnfalse;}else{//add_to_database將信息添加到數(shù)據(jù)庫add_to_database(用戶類型,用戶登錄名,密碼);returntrue;}}
UserInfosaveUser(String用戶名){UserInfouserInfo=null;userInfo=save_database(用戶名);returnuserInfo;}6.2結構化設計(2)模塊詳細設計booleanupdateUser(String用戶類型,String用戶登錄名,String密碼,其他信息){if(userIsExist()==false){//用戶是否存在returnfalse;}else{//更新數(shù)據(jù)庫信息update_database();returntrue;}}booleandeleteUser(String用戶名){//更新數(shù)據(jù)庫信息if(userIsExist()==false){//用戶是否存在returnfalse;}else{update_database();returntrue;}}6.2結構化設計(3)數(shù)據(jù)設計表6-3學生表結構字段名字段類型描述約束studentIdvarchar學號主鍵namevarchar姓名不為空passwordvarchar密碼不為空sexvarchar男or女stateinteger用戶狀態(tài)(可用/不可用)不為空gradeClassvarchar學生所在班級faceFeatureblob人臉特征avatarvarchar頭像permissionvarchar權限phoneNumbervarchar手機號6.2結構化設計(3)數(shù)據(jù)設計表6-4教師表結構字段名字段類型描述約束teacherIdvarchar學號主鍵namevarchar姓名不為空passwordvarchar密碼不為空sexvarchar男or女stateinteger用戶狀態(tài)(可用/不可用)不為空faceFeatureblob人臉特征avatarvarchar頭像permissionvarchar權限phoneNumbervarchar手機號6.2結構化設計(3)數(shù)據(jù)設計表6-5樓管表結構字段名字段類型描述約束buildingIdvarchar學號主鍵namevarchar姓名不為空passwordvarchar密碼不為空sexvarchar男or女stateinteger用戶狀態(tài)(可用/不可用)不為空locationvarchar樓管管理的大樓permissionvarchar權限phoneNumbervarchar手機號6.2結構化設計(3)數(shù)據(jù)設計表6-6系統(tǒng)管理員表結構字段名字段類型描述約束adminIdvarchar工號主鍵namevarchar姓名不為空passwordvarchar密碼不為空sexvarchar男or女stateinteger用戶狀態(tài)(可用/不可用)不為空permissionvarchar權限6.2結構化設計(3)數(shù)據(jù)設計表6-7教室表結構字段名字段類型描述約束roomIdinteger教師號主鍵locationvarchar教室所在大樓位置不為空statusinteger狀態(tài)(可用/正在使用)不為空字段名字段類型描述約束deviceIdinteger設備編號主鍵namevarchar設備名不為空typevarchar設備類型不為空runStatusvarchar是否正在運行不為空roomIdinteger所在房間id外鍵表6-8設備表結構6.2結構化設計(3)數(shù)據(jù)設計表6-9課程表結構字段名字段類型描述約束courseIdinteger課程號主鍵namevarchar課程名稱不為空teacherIdinteger責任教師id外鍵couresHoursinteger課時creditfloat學分introvarchar課程簡介6.2結構化設計(3)數(shù)據(jù)設計表6-10教學班表結構字段名字段類型描述約束classIdinteger教學班號主鍵namevarchar教學班名稱不為空courseIdinteger課程號不為空、外鍵studentNuminteger學生數(shù)量不為空classRoomIdinteger上課房間號外鍵teacherIdinteger主講教師id外鍵Scheduledatatime上課時間不為空6.2結構化設計(3)數(shù)據(jù)設計表6-11云課堂表結構字段名字段類型描述約束cloudIdinteger云課堂編號主鍵classIdinteger教學班id外鍵startTimedatetime開始時間不為空endTimedatetime結束時間不為空videoPathvarchar視頻路徑文件不為空字段名字段類型描述約束noteIdinteger白板筆記編號主鍵cloudIdinteger云課堂id外鍵imgPathvarchar圖片文件路徑不為空noteTimedatetime筆記時間不為空表6-12白板筆記錄表結構6.2結構化設計(3)數(shù)據(jù)設計表6-13考勤記錄表結構字段名字段類型描述約束attenIdinteger記錄編號主鍵userIdinteger學生id外鍵classIdinteger教學班id外鍵arrTimedatetime到課時間不為空stateinteger狀態(tài)(正常/申訴/接受申訴/拒絕申訴)不為空6.2結構化設計(3)數(shù)據(jù)設計表6-14請假記錄表結構字段名字段類型描述約束leaveIdinteger記錄編號主鍵userIdinteger學生id外鍵classIdvarchar教學班id外鍵infodatetime請假說明不為空createTimedatatime請假時間stateinteger狀態(tài)(未審核/批準/拒絕)不為空6.3面向?qū)ο蟮脑O計面向?qū)ο笤O計的步驟概括如下:步驟1:細化重組類。步驟2:細化和實現(xiàn)類間關系,明確其可見性。步驟3:增加屬性,指定屬性的類型與可見性。步驟4:分配職責,定義執(zhí)行每個職責的方法。步驟5:對消息驅(qū)動的系統(tǒng),明確消息傳遞方式,避免對象之間的關系數(shù)目日益膨脹,形成復雜的網(wǎng)狀結構。步驟6:利用設計模式進行優(yōu)化設計步驟7:畫出詳細的類圖與時序圖。6.3.1面向?qū)ο筌浖O計的步驟6.3面向?qū)ο蟮脑O計面向?qū)ο笤O計還有如下啟發(fā)式規(guī)則:(1)設計結果應該清晰易懂①用詞一致。②使用已有的協(xié)議。③減少消息模式的數(shù)量。④避免模糊的定義。(2)一般—特殊結構的深度應適當6.3面向?qū)ο蟮脑O計(3)設計簡單的類①避免包含過多的屬性。②有明確的定義。③盡量簡化對象之間的協(xié)作關系。④不要提供太多服務。(4)使用簡單的消息傳遞(5)使用簡單的服務(6)把設計變動減至最小6.3面向?qū)ο蟮脑O計(1)類的調(diào)整和詳細設計6.3.2面向?qū)ο筌浖O計實例表6-15智慧教室系統(tǒng)中的部分實體類及其重要屬性、基本方法類名屬性基本方法方法說明用戶User-userId:String-name:String-sex:String-password:String-state:integer-userType:String-permission:List-faceFeature:Blob-faceInfo:String+login():void+getPermission():List+getFaceFeature():Blob+getFaceInfo():String+setUserInfo():void登錄驗證獲取權限獲取人臉特征獲取人臉信息設置用戶信息6.3面向?qū)ο蟮脑O計續(xù)表6-15智慧教室系統(tǒng)中部分實體類類名屬性基本方法方法說明學生Student(父類:User)-gradeClass:String-avatar:String-phoneNumber:String+getgradeClass():String+setStudentInfo():void獲取學生班級設置學生信息教師Teacher(父類:User)-avatar:String-phoneNumber:String+getRelClass():String+setTeacherInfo():void獲取相關課程設置教師信息樓管BuildingManagement(父類:User)-location:String+getLocation():String+updateLocation():boolean+setBuildingManagementInfo():void獲取管理大樓更改管理大樓設置樓管信息系統(tǒng)管理員SystemManagement(父類:User)+insertUser():boolean+deleteUser():boolean+updateUser():boolean+returnUserInfo():String+setSystemManagementInfo():void新建一個用戶刪除一個用戶修改用戶信息返回用戶信息設置系統(tǒng)管理員信息6.3面向?qū)ο蟮脑O計續(xù)表6-15智慧教室系統(tǒng)中部分實體類類名屬性基本方法方法說明設備Device-deviceId:integer-name:String-type:String-runStatus:boolean-roomId:String+freshStatus():boolean+updateStatus():boolean+insertDevice():boolean+deleteDevice():boolean+getDeviceInfo():String+setDeviceInfo():void+checkDevice():boolean+repairDevice():boolean刷新設備狀態(tài)更改設備狀態(tài)增添設備刪除設備返回設備信息設置設備信息檢查設備維修設備環(huán)境設備EnvironmentDev(父類:Device)-direction:integer+getTemperature():float+getHumidity():float+setEnvironmentDeviceInfo():void獲取環(huán)境溫度獲取環(huán)境濕度設置環(huán)境設備信息6.3面向?qū)ο蟮脑O計續(xù)表6-15智慧教室系統(tǒng)中部分實體類類名屬性基本方法方法說明攝像頭Camera(父類:Device)-direction:integer+openCamera():boolean+stopCamera():boolean+setDirection():void+setCameraInfo():void開啟攝像頭關閉攝像頭設置攝像頭角度設置攝像頭信息教室ClassRoom-roomId:integer-location:String-status:integer-relDev:List+updateStatus():boolean+updateRoom():boolean+getRoomInfo():String+insertRoom():boolean+getRelDev():List+updateRelDev():boolean+setClassRoomInfo():void更新使用狀態(tài)更新教室信息返回教室信息添加教室獲取設備列表更新設備列表設置教室信息6.3面向?qū)ο蟮脑O計續(xù)表6-15智慧教室系統(tǒng)中部分實體類類名屬性基本方法方法說明教室ClassRoom-roomId:integer-location:String-status:integer-relDev:List+updateStatus():boolean+updateRoom():boolean+getRoomInfo():String+insertRoom():boolean+getRelDev():List+updateRelDev():boolean+setClassRoomInfo():void更新使用狀態(tài)更新教室信息返回教室信息添加教室獲取設備列表更新設備列表設置教室信息課程Course-courseId:integer-teacherId:integer-name:String-courseHours:integer-credit:float-intro:String+insertCourse():boolean+deleteCourse():boolean+updateCourse():boolean+getCourseInfo():String+setCourseInfo():void添加課程刪除課程更新課程信息獲取課程信息設置課程信息6.3面向?qū)ο蟮脑O計續(xù)表6-15智慧教室系統(tǒng)中部分實體類類名屬性基本方法方法說明教學班Class-classId:integer-name:String-classRoomId:integer-courseId:integer-studentId[]:integer+addStudent():boolean+getStudentList():List+setClassInfo():void增加學生獲取學生列表設置教學班信息人臉庫FaceDB-faceId:integer-faceFeature:Blob+addFaceFeature():boolean+deleteFaceFeature():boolean+setFaceDBInfo():void添加人臉特征刪除人臉特征設置人臉庫信息6.3面向?qū)ο蟮脑O計續(xù)表6-15智慧教室系統(tǒng)中部分實體類類名屬性基本方法方法說明考勤Attendance-attenId:integer-userId:integer-courseId:integer-arrTime:datetime-state:integer+insertAtten():boolean+updateAtten():boolean+deleteAtten():boolean+analysisAtten():String+appealAtten():boolean+acceptAtten():boolean+setAttendanceInfo():void添加到課記錄更新到課記錄刪除到課記錄獲取統(tǒng)計結果申訴到課記錄接受申訴到課設置考勤信息
在確定每一個類的具體屬性后,在設計相關類的具體方法時需要注意如下幾點:①需考慮所有用戶信息的增、刪、改、查功能,設定相應的方法。6.3面向?qū)ο蟮脑O計②確認上課時首先將所有學生考勤狀態(tài)設置為缺勤,將已請假并通過審批的學生考勤狀態(tài)設置為已請假。上課過程中攝像頭自動捕捉學生頭像進行匹配,匹配后更新當前課堂對應學生的考勤記錄。//用戶類詳細設計publicclassUser{privateStringuserId;//用戶IDprivateStringname;//用戶名稱privateStringsex;//用戶性別privateStringpassword;//用戶密碼privateStringstate;//用戶狀態(tài)privateStringuserType;//用戶類型privateStringpermission;//用戶權限privateStringfaceFeature;//人臉特征privateStringfaceInfo;//人臉信息6.3面向?qū)ο蟮脑O計publicvoidlogin(Stringname,Stringpassword,StringuserType){switch(用戶類型)case學生:if(verify(賬號,密碼)==true){//verify將賬號密碼與數(shù)據(jù)庫對應信息對比
頁面跳轉(zhuǎn)到"學生頁面";}else{
頁面跳轉(zhuǎn)到錯誤頁面;}break;case教師或樓管或系統(tǒng)管理員:if(verify(賬號,密碼)==true){//verify將賬號密碼與數(shù)據(jù)庫對應信息對比
頁面跳轉(zhuǎn)到對應角色頁面;}else{
頁面跳轉(zhuǎn)到錯誤頁面;}}6.3面向?qū)ο蟮脑O計publicListgetPermission(Stringname,StringuserType){if(userIsExist()==false){//用戶是否存在returnnull;}else{permissionList=getUserPermissionByType(name,userType);returnpermissionList;//根據(jù)用戶和類型返回權限列表}}
publicStringgetFaceFeature(Stringname,StringuserTpye,Stringpermission){if(userIdExit()==false){//用戶是否存在returnnull;}elseif(userHasPermission()==false){//用戶是否有權限r(nóng)eturnnull;}else{StringfaceFeature=getUserFaceFeature(name,userType,permission);returnfaceFeature;//根據(jù)用戶類型和權限返回人臉特征}}6.3面向?qū)ο蟮脑O計publicStringgetFaceInfo(Stringname,StringuserTpye,Stringpermission){if(userIdExit()==false){//用戶是否存在returnnull;}elseif(userHasPermission()==false){//用戶是否有權限r(nóng)eturnnull;}else{StringfaceInfo=getUserFaceInfo(name,userType,permission);returnfaceInfo;//根據(jù)用戶類型和權限返回人臉信息}}
publicvoidsetUserInfo(Useruser){if(userIdExit()==true){//用戶是否存在setUserInfo(user);//設置有用信息}}}6.3面向?qū)ο蟮脑O計表6-16智慧教室系統(tǒng)中的部分控制類設計類名屬性基本方法方法說明云課堂CloudClass-cloudId:integer-courseId:integer-startTime:datetime-endTime:datetime+insertCloud():boolean+deleteCloud():boolean+getVideo():Blob+analysisCloud():List添加一條課堂信息刪除一條課堂信息獲取課堂錄像獲取統(tǒng)計分析結果人臉考勤FaceAttendance-unsignStudents:List-signStudents:List+getFaceMatch(StringstudentId):boolean+addFaceFeature():boolean+deleteFaceFeature():boolean+matchFace():int+getStudentByFace():Student+saveToAttendance():void返回指定學生是否考勤添加人臉特征刪除人臉特征匹配人臉圖像根據(jù)人臉獲取學生信息保存學生考勤信息6.3面向?qū)ο蟮脑O計續(xù)表6-16智慧教室系統(tǒng)中的部分控制類設計類名屬性基本方法方法說明用戶管理UserManage-userType:integer+addUser(Stringname,Stringinfo,IntegeruserType):boolean+updateUser(Stringuserid,Stringinfo,IntegeruserType):boolean+deleteUser(Integeruserid,IntegeruserType):boolean+searchUser(Integeruserid,IntegeruserType):String+changePassword(Stringusername,Stringpassword,IntegeruserType):boolean+changePermission(Stringname,Stringpermission,IntegeruserType):boolean添加用戶更新用戶信息刪除用戶查詢用戶信息修改用戶密碼修改用戶權限6.3面向?qū)ο蟮脑O計//matchFace方法:將視頻單幀圖片的人臉信息與學生信息庫的當前課堂應到學生人臉數(shù)據(jù)進行匹配,得到考勤記錄publicintmatchFace(Listfaces,ListsignStudentFaces){foreach(faceinfaces){FaceAttendancefaceAttendance=newFaceAttendance();if(isInUnsignStudents(face,signStudentFaces)){//若該人臉在未簽到的學生人臉集合中unsignStudents.remove(face);//從未簽到的學生人臉集合中移除Studentstudent=faceAttendance.getStudentByFace(face);//根據(jù)人臉獲取學生信息signStudents.add(student);//將該學生添加至已簽到學生集合中
}}faceAttendance.saveToAttendance(signStudents);//存儲到考勤信息庫
returnfaceAttendance.count();}6.3面向?qū)ο蟮脑O計(2)協(xié)作圖的精化圖6-9教師查詢考勤記錄協(xié)作圖迭代6.3面向?qū)ο蟮脑O計(3)順序圖的精化圖6-10精化后的人臉考勤用例順序圖6.4用戶界面設計
用戶界面又稱人機界面,是人與計算機之間傳遞和交流信息的媒介。用戶界面設計是一項涉及技術、藝術和心理學等學科交叉融合的工作,最終實現(xiàn)用戶對計算機系統(tǒng)的應用。6.4用戶界面設計TheoMandel在1997年提出了界面設計的三條黃金規(guī)則。
(1)用戶操縱控制
允許用戶操作控制的原則:
①以不強迫用戶進入不必要的或不希望的動作的方式來定義交互
模式。
②提供靈活的交互。
③允許用戶交互可以被中斷和撤消。
④當用戶技能級別增加時,界面設計應該變得更加流暢和高效,并
允許定制交互。
⑤使用戶與內(nèi)部技術細節(jié)隔離開來。
⑥設計應允許用戶與出現(xiàn)在屏幕上的對象直接交互。6.4.1黃金規(guī)則6.4用戶界面設計(2)減少用戶的記憶負擔
減少用戶記憶負擔的設計原則:
①減少對短期記憶的要求。
②建立有意義的缺省。
③定義直觀的快捷方式。
④界面的視覺布局應該基于真實世界的象征。
⑤以不斷進展的方式揭示信息。6.4用戶界面設計(3)保持界面一致
幫助保持界面一致性的設計原則:
①允許用戶將當前任務放入有意義的語境。
②在應用系列內(nèi)保持一致性。
③如過去的交互模型已建立起了用戶期望,除非有迫不得已
的理由,不要改變它。6.4用戶界面設計
分析和設計用戶界面時要考慮四種不同的模型:軟件工程師創(chuàng)建的設計模型、工程師創(chuàng)建的用戶模型、終端用戶的心理模型(終端用戶對未來系統(tǒng)的假想)、系統(tǒng)實現(xiàn)后得到的實現(xiàn)模型(系統(tǒng)映象)。
這四種模型可能相差甚遠,界面設計人員的任務就是消除這些差距,導出一致的界面表示。6.4.2用戶界面設計過程6.4用戶界面設計
用戶界面的分析和設計過程是迭代的,包括四個框架性活動:用戶、任務和環(huán)境分析及建模;界面設計;界面構造;界面確認。
用戶界面開發(fā)始于一組分析任務:用戶分析、任務分析、顯示內(nèi)容分析和環(huán)境分析。6.4.2用戶界面設計過程6.4用戶界面設計(1)用戶分析:設計人員要抓住用戶的特征,發(fā)現(xiàn)用戶的需求。(2)任務分析:需要定義用戶任務和行為。(3)顯示內(nèi)容分析:界面顯示內(nèi)容是在用戶任務分析確認后對不同數(shù)據(jù)對象進行的描述。(4)環(huán)境分析:需要清楚界面必須操作的物理結構和社會結構。6.4用戶界面設計界面設計過程的步驟可以概括如下:(1)使用界面分析中獲得的信息,通過創(chuàng)建和分析用戶場景來定義一組界面對象和作用于對象上的動作,為創(chuàng)建屏幕布局提供基礎。(2)定義導致用戶界面狀態(tài)發(fā)生變化的事件,并對行為建模。(3)按照最終用戶實際看到的那樣,描述每個界面狀態(tài),并進行屏幕布局。(4)簡要說明用戶如何從界面提供的信息來獲得系統(tǒng)狀態(tài)的解釋。
在這個過程中,用戶界面的設計具體內(nèi)容可能包括:系統(tǒng)啟動封面設計、軟件框架設計、軟件按鈕設計、軟件面板設計、菜單設計、標簽設計、圖標設計、滾動條設計、狀態(tài)欄設計、安裝過程設計以及產(chǎn)品包裝等。6.4用戶界面設計
目前主流的交互方式是WIMP交互界面。WIMP是窗口(Windows)、圖標(Icon)、選單(Menu)、指針選取(PointingDevice)這4個英文單詞的縮寫,表示W(wǎng)IMP交互界面中所依賴的4種元素。6.4.3
GUI設計規(guī)則6.4用戶界面設計6.4.3
GUI設計規(guī)則
圖形用戶界面設計的基本原則是要遵循用戶需求,具體實施的原則每個機構可能有所不同,一般都會要求遵循以下規(guī)則:
(1)一致性
(2)通用性
(3)功能性
(4)視覺組織結構
(5)減輕短期記憶負擔
(6)預防操作錯誤,有效反饋
(7)風格創(chuàng)新性,鼓勵探索6.5面向?qū)ο筌浖O計優(yōu)化
為了讓這些類的設計在未來能更適應變更并減少變更帶來的副作用的傳播,在面向?qū)ο蠓椒ㄑ芯恐行纬闪巳缦禄镜脑O計原則。
(1)單一職責原則(SimpleResponsibilityPrinciple,簡稱SRP)
就一個類而言,應該僅有一個引起它變化的原因。
(2)開—閉原則(Open-ClosedPrinciple,簡稱OCP)
一個軟件實體應當對擴展開放,對修改關閉。6.5.1軟件設計原則6.5面向?qū)ο筌浖O計優(yōu)化
(3)里氏代換原則(LiskovSubstitutionPrinciple,簡稱LSP)
一個軟件實體如果使用的是一個基類的話,那么一定適用于其
子類。應當盡量從抽象類繼承,而不是從具體類繼承。
(4)依賴倒置原則(DependenceInversionPrinciple,簡稱DIP)
抽象不應當依賴于細節(jié),細節(jié)應當依賴于抽象。
(5)接口隔離原則(InterfaceSegregationPrinciple,簡稱ISP)
一個類對另外一個類的依賴是建立在最小的接口上,使用多個
專門的接口比使用單一的總接口要好。6.5.1軟件設計原則6.5面向?qū)ο筌浖O計優(yōu)化
(6)合成/聚合復用原則(Composite/AggregateReuse Principle,簡稱CARP)
在一個新的對象里面使用一些已有的對象,使之成為新對
象的一部分;新對象通過向這些對象的委派達到復用的目的。
(7)迪米特法則(LawofDemeter,簡稱LoD)
一個對象應當對其他對象有盡可能少的了解。6.5.1軟件設計原則6.5面向?qū)ο筌浖O計優(yōu)化
軟件設計模式是為特定設計環(huán)境中重復出現(xiàn)的設計問題提供的一個解決方案,是面向?qū)ο筌浖脑O計經(jīng)驗總結。通常一個軟件設計模式有四個基本要素:
(1)模式名稱(patternname):助記名,用來描述模式的問題、解決方案和效果。
(2)問題(problem):描述了應該在何時使用該模式。
(3)解決方案(solution):描述了設計的組成成分,它們之間的相互關系及各自的職責和協(xié)作方式。
(4)效果(consequences):描述了模式應用的效果及使用模式應權衡的問題。6.5.2軟件設計模式6.5面向?qū)ο筌浖O計優(yōu)化
按照設計模式目的——即反映模式是干什么的,可以將23種設計模式分成三類:
(1)創(chuàng)建性模式(creational):這類模式封裝動態(tài)產(chǎn)生對象的過程和所使用的類的信息,解決系統(tǒng)在創(chuàng)建對象時,抽象化類的實例化過程。
(2)行為性模式(behavioral):這類模式處理類和對象間的交互方式和任務分布,主要解決算法和對象之間的責任分配問題,描述對象或類以及它們之間的通信模式。
(3)結構性模式(structural):這類模式考慮如何組合類和對象構成較大的結構。使用繼承來組合接口或?qū)崿F(xiàn)新類,或使用對象合成來實現(xiàn)新功能。6.5面向?qū)ο筌浖O計優(yōu)化
以外觀模式(Facade)來舉例說明。
外觀模式(又稱門面模式)提供一個高層次的接口,使得子系統(tǒng)更易于使用。就如同接待員一樣,外觀模式的門面類將客戶端與子系統(tǒng)的內(nèi)部復雜性分隔開,使得客戶端只需要與門面對象交互,而不需要與子系統(tǒng)內(nèi)部的很多對象交互。圖6-11外觀模式結構圖6.5面向?qū)ο筌浖O計優(yōu)化
以智慧教室管理子系統(tǒng)的一個例子來說明外觀模式的作用。智慧教室管理子系統(tǒng)由用戶管理系統(tǒng)、教室管理系統(tǒng)、考勤管理系統(tǒng)和設備管理系統(tǒng)組成。智慧教室管理子系統(tǒng)的操作人員需要經(jīng)常審核、調(diào)配各個子系統(tǒng)的內(nèi)容。6.5面向?qū)ο筌浖O計優(yōu)化圖6-12不使用外觀模式的類圖6.5面向?qū)ο筌浖O計優(yōu)化圖6-13使用外觀模式的類圖總結1.了解軟件設計的主要目標。2.掌握有關軟件設計的基本概念。3.掌握結構化軟件設計的基本概念。4.重點掌握面向?qū)ο笤O計方法。5.掌握軟件詳細設計方法。6.掌握人機交互界面設計的基本原則7.了解軟件設計模式的基本概念第7章
軟件實現(xiàn)與測試?掌握軟件質(zhì)量的概念?了解代碼規(guī)范?了解代碼重構?理解軟件測試的相關概念和模型?理解測試自動化?掌握幾種重要的黑盒和玻璃盒測試方法?了解測試驅(qū)動的開發(fā)TDD?了解軟件集成方式軟件實現(xiàn)并不等同于編碼。軟件實現(xiàn)包括編碼、代碼審查、單元測試、集成測試、缺陷跟蹤和糾錯等一系列過程。學習目標高質(zhì)量軟件開發(fā)基本方法1代碼規(guī)范2軟件測試3測試驅(qū)動開發(fā)TDD4集成57.1高質(zhì)量軟件開發(fā)的基本方法軟件質(zhì)量是貫穿軟件生命周期的一個極為重要的問題。(1)建立軟件過程規(guī)范
一個軟件過程定義了軟件開發(fā)中采用的方法,還包含該過程、
中應用的技術方法和自動化工具。(2)軟件復用
復用(Reuse)簡單來說就是指“利用現(xiàn)成的東西”。早期的軟件復用主要是代碼級復用,后來逐步擴大到需求、設計、代碼、文檔、領域知識、開發(fā)經(jīng)驗、設計決策、體系結構等與軟件產(chǎn)品相關的各方面。(3)軟件評審
軟件評審(Review)是在軟件生命周期內(nèi)所實施的對軟件本身的評審,是對軟件元素或者項目狀態(tài)的一種評估,以確定其是否與計劃的結果保持一致,并使其得到改進。評審方法已經(jīng)被業(yè)界廣泛采用并取得了很好的效果,它被普遍認為是軟件開發(fā)的最佳實踐之一。評審可以比測試更早地發(fā)現(xiàn)并消除工作成果中的缺陷,而越早消除缺陷就越能降低開發(fā)成本。7.1高質(zhì)量軟件開發(fā)的基本方法(4)軟件測試
軟件測試(SoftwareTesting)是一種實際輸出與預期輸出之間審核或者比較的過程。測試與評審的主要區(qū)別是前者要運行軟件而后者不必執(zhí)行軟件。(5)軟件質(zhì)量保證
軟件質(zhì)量保證的目的是提供一種有效的人員組織形式和管理方法,通過客觀地檢查和監(jiān)控“過程質(zhì)量”與“產(chǎn)品質(zhì)量”,從而實現(xiàn)持續(xù)地改進質(zhì)量。軟件質(zhì)量保證小組在項目開始時就一起參與建立計劃、標準和過程。7.1高質(zhì)量軟件開發(fā)的基本方法7.2代碼規(guī)范7.2.1代碼規(guī)范的重要性每一個高質(zhì)量代碼的背后,一定存在著一份優(yōu)秀的代碼規(guī)范。代碼規(guī)范是針對特定編程語言約定的一系列規(guī)則,包括開發(fā)約定、編程實踐、編程原則和最佳實踐等。代碼規(guī)范的重要性體現(xiàn)在以下幾個方面:
(1)促進團隊合作
(2)有效減少軟件缺陷數(shù)量、降低維護成本
(3)有助于代碼審查
(4)有助于程序員自身的成長代碼規(guī)范7.2.2常見的代碼規(guī)范代碼規(guī)范的制定往往包含命名規(guī)則、格式、控制語句、面向?qū)ο缶幊蹋∣OP)規(guī)約、集合處理、并發(fā)處理、注釋、異常處理、日志、數(shù)據(jù)庫相關規(guī)約等多個方面,部分可能的代碼規(guī)范。
1)命名規(guī)范①類名使用UpperCamelCase風格(大駝峰形式)。例如TonyHall、XmlService、TcpUdpDeal,避免使用tonyHall、XMLService、TCPUDPDeal。②方法名、參數(shù)名、成員變量、局部變量都統(tǒng)一使用lowerCamelCase風格(小駝峰形式)。例如localInput、getMessage()、outputUserId。7.2代碼規(guī)范③常量命名全部大寫,單詞間用下劃線隔開。例如MAX_USER_COUNT。④抽象類命名使用Abstract或Base開頭;異常類命名使用Exception結尾;測試類命名以它要測試的類的名稱開始,以Test結尾。⑤包名統(tǒng)一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。例如com.baidu.map.util。⑥如果使用到了設計模式,建議在類名中體現(xiàn)出具體模式,有利于代碼閱讀者快速理解架構設計思想。例如ProductFactory(工廠模式)、DataObserver(觀察者模式)。
7.2代碼規(guī)范2)格式規(guī)范①大括號的使用約定。如果是大括號內(nèi)為空,則寫成{}即可,不需要換行;如果是非空代碼塊則:左大括號前不換行;左大括號后換行;右大括號前換行;右大括號后還有else等代碼則不換行;右大括號后為空必須換行。②if/for/while/switch/do等保留字與左右括號之間必須加空格。③任何運算符左右必須加一個空格。運算符包括賦值運算符、邏輯運算符、加減乘除符號等。④代碼塊縮進4個空格。⑤單行字符數(shù)不超過120個,超出需要換行,換行時相對上一行縮進4個空格。⑥方法參數(shù)在定義和傳入時,多個參數(shù)逗號后邊必須加空格。7.2代碼規(guī)范(3)OOP規(guī)范(針對Java編程語言)①避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,直接用類名訪問即可。②所有的覆寫方法,必須加@Override注解。③所有的相同類型的包裝類對象之間值的比較,全部使用equals方法比較。④構造方法里面禁止加入任何業(yè)務邏輯,如果有初始化邏輯,放在init方法中。⑤類成員與方法訪問控制從嚴:a.如果不允許外部直接通過new來創(chuàng)建對象,構造方法必須是private。b.類非static成員變量并且與子類共享,必須是protected。c.類非static成員變量并且僅在本類使用,必須是private。d.類static成員變量如果僅在本類使用,必須是private。e.若是static成員變量,必須考慮是否為final。f.類成員方法只供類內(nèi)部調(diào)用,必須是private。g.類成員方法只對繼承類公開,那么限制為protected。7.2代碼規(guī)范(4)控制語句規(guī)范①在一個switch塊內(nèi),每個case或者通過break/return來終止,或者利用注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個case為止;在每個switch塊內(nèi),都必須包含一個default語句并且放在最后,即使該語句后沒有代碼。②在if/else/for/while/do語句中必須使用大括號,即使只有一行代碼,避免使用下面的形式:if(condition)statements。③循環(huán)體中的語句要考量性能,以下操作盡量移至循環(huán)體外處理,如定義對象、變量、獲取數(shù)據(jù)庫連接、不必要的try-catch操作。④當一個條件判斷(if、while)比較復雜,請寫好注釋。⑤盡量少采用取反邏輯運算符。取反邏輯不利于快速理解。例如使用if(x<365)來表達x小于365,避免使用if(!(x>=365))。7.2代碼規(guī)范(5)注釋規(guī)范(針對Java編程語言)①類、類屬性、類方法的注釋必須使用/*內(nèi)容*/格式。②所有的抽象方法(包括接口中的方法)必須要注釋、除了返回值、參數(shù)、異常說明外,還必須指出該方法做什么事情,實現(xiàn)什么功能。③方法內(nèi)部單行注釋,在被注釋語句上方另起一行,使用//注釋。方法內(nèi)部多行注釋使用/**/注釋,注意與代碼對齊。④所有的枚舉類型字段必須要有注釋,說明每個數(shù)據(jù)項的用途。⑤代碼修改的同時,注釋也要進行相應的修改。⑥謹慎注釋掉代碼。⑦注釋力求精簡準確、表達到位,避免過多過濫的注釋。7.2代碼規(guī)范7.2.3代碼重構代碼重構通常是指在不改變代碼對外表現(xiàn)的情況下,修改代碼的內(nèi)部功能特征,從而改善軟件質(zhì)量,使程序的設計模式和架構更趨合理,更容易被理解,提高軟件的可擴展性和可維護性。很多人認為重構浪費時間,影響項目進度,其實重構不僅可以讓代碼更加健壯,而且從長遠來看,還可以加快項目進度。7.2代碼規(guī)范(1)以查詢?nèi)〈R時變量:圖7-1以查詢?nèi)〈R時變量7.2代碼規(guī)范(2)搬移函數(shù)或字段:圖7-2搬移函數(shù)或字段7.2代碼規(guī)范(3)提煉類:圖7-3提煉類7.2代碼規(guī)范(4)以常量取代字面數(shù)值:圖7-4以常量取代字面數(shù)值7.2代碼規(guī)范(5)簡化嵌套條件表達式:圖7-5簡化嵌套條件表達式7.2代碼規(guī)范(6)使用異常替換返回錯誤碼:圖7-6使用異常替換返回錯誤碼7.27.3軟件測試GlenfordJ·Myers在《軟件測試的藝術》中提出了關于軟件測試的多個重要觀點,對該領域產(chǎn)生了深遠的影響:(1)測試是為了發(fā)現(xiàn)程序中的錯誤而執(zhí)行程序的過程。(2)好的測試方案在于它能發(fā)現(xiàn)迄今為止尚未發(fā)現(xiàn)的錯誤。(3)成功的測試是發(fā)現(xiàn)了至今為止尚未發(fā)現(xiàn)的錯誤的測試。(4)測試并不僅僅是為了找出錯誤。(5)沒有發(fā)現(xiàn)錯誤的測試也是有價值的。
7.3.1軟件測試介紹軟件測試為了盡可能發(fā)現(xiàn)軟件中的錯誤,提高軟件產(chǎn)品的質(zhì)量,在軟件測試的實踐中應把握以下基本測試原則:(1)測試用例中的一個必需部分是對預期輸出或結果進行定義。(2)程序員應當避免測試自己編寫的程序。(3)編寫軟件的組織不應當測試自己編寫的軟件。(4)應當徹底檢查每個測試的執(zhí)行結果。7.3軟件測試(5)測試用例的編寫不僅應當根據(jù)有效和預期的輸入情況,而且也應當根據(jù)無效和未預料到的輸入情況。(6)檢查程序是否“未做其應該做的”僅是測試的一半,測試的另一半是檢查程序是否“做了其不應該做的”。(7)應避免測試用例用后即棄,除非軟件本身是一個一次性的軟件。(8)計劃測試工作時不應默許假定不會發(fā)現(xiàn)錯誤。(9)程序某部分存在更多錯誤的可能性,與該部分已發(fā)現(xiàn)錯誤的數(shù)量成正比。7.3軟件測試廣義的軟件測試必須貫穿在軟件生命周期的始終,測試對象應該包括軟件設計開發(fā)的各個階段的內(nèi)容。狹義的軟件測試的分類,即開發(fā)階段的測試和程序測試,如下:(1)按照開發(fā)階段劃分
①單元測試
②集成測試
③系統(tǒng)測試
④確認測試
⑤驗收測試
7.3.2軟件測試分類7.3軟件測試(2)按照測試實施組織劃分
①開發(fā)方測試:也叫α測試
②用戶測試:也叫β測試
③第三方測試(3)按照測試與需求的關系劃分
①功能測試
②非功能測試7.3軟件測試(4)按照是否需要運行程序劃分
①靜態(tài)測試
②動態(tài)測試(5)按照測試技術劃分
①玻璃盒測試
②黑盒測試
③灰盒測試7.3軟件測試為了節(jié)省人力、時間或硬件資源,提高測試效率,自動化測試往往是十分必要的。但是自動化測試不適用于一些特殊定制型項目、周期很短的項目以及包含有復雜業(yè)務規(guī)則的項目,或者其涉及物理交互的部分。目前對自動化測試理解還存在如下誤區(qū):(1)自動化測試可以完成一切測試工作。(2)測試工具可適用于所有的測試。(3)測試工具能使工作量大幅降低。(4)測試工具能實現(xiàn)百分百的測試覆蓋率。(5)自動化測試工具容易使用。
7.3.3自動化測試7.3軟件測試自動化測試工具有很多,其大致分類如下:(1)負載壓力測試工具(2)功能測試工具(3)玻璃盒測試工具(4)網(wǎng)絡測試工具(5)測試管理工具
7.3軟件測試測試模型將測試活動進行抽象,明確了測試與開發(fā)之間的關系,是軟件測試管理的重要依據(jù)。(1)V模型
7.3.4軟件測試模型單元測試集成測試系統(tǒng)測試驗收測試編碼詳細設計概要設計需求分析圖7-7V模型7.3軟件測試(2)W模型圖7-8W模型開發(fā)組工作測試組工作詳細設計測試編碼實現(xiàn)單元測試集成測試系統(tǒng)測試驗收測試概要設計測試需求測試模塊集成系統(tǒng)構建系統(tǒng)安裝詳細設計概要設計需求分析7.3軟件測試(3)H模型圖7-9H模型7.3軟件測試(1)黑盒測試
①等價類劃分法等價類劃分主要解決如何選擇適當?shù)臄?shù)據(jù)子集來代表整個數(shù)據(jù)集的問題,通過降低測試用例的數(shù)量去實現(xiàn)合理的“覆蓋”,以此來發(fā)現(xiàn)更多的軟件缺陷。例如:一個基于整數(shù)運算的簡單計算器程序。當需要測試它是否能正確運行時,如果程序能夠正確地計算“1+1”和“2+3”的和,那么是否還有必要測試“8+9”的和,或者“80000+90000”的和呢?
7.3.5黑盒和玻璃盒測試7.3軟件測試②邊界值分析法長期的測試經(jīng)驗告訴我們,大量的錯誤是發(fā)生在輸入或輸出范圍的邊界上,而不是發(fā)生在輸入或輸出范圍的內(nèi)部。邊界值(BoundaryValues)分析法就是對輸入或輸出的邊界值進行測試的一種黑盒測試方法。7.3軟件測試邊界值分析法與等價類劃分的區(qū)別為:a.邊界值分析不是從某等價類中任意選擇一個作為代表,而是使這個等價類的每個邊界都要作為測試條件。b.邊界值分析不僅要考慮輸入條件,還要考慮輸出空間產(chǎn)生的邊界情況。例如程序包含一個輸入值,其合法取值是從1到10的數(shù)字,那么顯然邊界值測試會取0和11這兩個不合法的數(shù)字,以及1和10這兩個“剛好”合法的數(shù)字,來驗證位于輸入邊界附近的數(shù)值會不會被系統(tǒng)接受。7.3軟件測試(2)玻璃盒測試玻璃盒測試關注的是測試用例執(zhí)行的程度或覆蓋程序邏輯結構的程度。玻璃盒測試的測試方法有代碼檢查、靜態(tài)分析法、邏輯覆蓋法、基本路徑測試法、符號測試等。邏輯覆蓋包括語句覆蓋、判定覆蓋、條件覆蓋、判定/條件覆蓋、條件組合覆蓋。publicvoidRoutine(intA,intB,intX){ if(A>1&&B==0) X=X+B; if(A==2||X>1) X=X*A;}7.3軟件測試①語句覆蓋最初的邏輯覆蓋想法是將程序中的每條語句至少執(zhí)行一次,即語句覆蓋。這雖然是玻璃盒測試中較弱的覆蓋標準,但是同樣也具備了初步檢查出錯誤的能力。要實現(xiàn)語句覆蓋,上述程序只需要一個測試用例,(A=5,B=0,X=8)就可以遍歷到每一條語句。②判定覆蓋判定覆蓋(也稱分支覆蓋)相對語句覆蓋而言是較強一些的邏輯覆蓋。判定覆蓋要求必須編寫足夠的測試用例,使得每一個判斷都至少有一個為真和為假的輸出結果。也就是說,每條判定路徑都必須至少遍歷一次。在小程序Routine中,滿足判定覆蓋的兩個測試用例可以是(A=3,B=0,X=3)和(A=1,B=0,X=1)。7.37.4測試驅(qū)動開發(fā)TDD
測試驅(qū)動開發(fā)(TestDrivenDevelopment,簡稱TDD)是敏捷開發(fā)中的一項核心實踐和技術。測試驅(qū)動開發(fā)的基本思想就是在開發(fā)功能代碼之前,先編寫測試代碼,然后只編寫使測試通過的功能代碼,從而以測試來驅(qū)動整個開發(fā)過程的進行。這種開發(fā)方式與傳統(tǒng)開發(fā)方式剛好相反。在明確要開發(fā)某個功能后,TDD首先要思考如何對這個功能進行測試,并快速編寫出針對該功能的測試代碼,測試代碼只定義這個功能的外部接口,而非具體的實現(xiàn)細節(jié)。7.4.1TDD基本概念測試驅(qū)動開發(fā)TDD7.4.2TDD實施步驟開始成功增加一個測試運行一個測試改變一些代碼運行這個測試失敗失敗成功圖7-10TDD開發(fā)過程7.4測試驅(qū)動開發(fā)TDD7.4.3基于單元測試的TDD實例(Java)需求描述:通過一個矩形的長和寬來計算其面積和周長。(1)打開Eclipse。(2)創(chuàng)建RectangleTest類。publicclassRectangleTestextendsjunit.framework.TestCase{}7.4測試驅(qū)動開發(fā)TDD(3)根據(jù)需求描述,在RectangleTest中創(chuàng)建矩形對象,分別添加計算矩形面積和周長的測試方法,以及長和寬分別為2和3的具有正確輸入和輸出的測試用例。publicclassRectangleTestextendsjunit.framework.TestCase{Rectanglerectl=newRectangle();publicvoidtestArea(){assertEquals(6,rectl.Area(2,3));}publicvoidtestPerimeter(){assertEquals(10,rectl.Perimeter(2,3));}}7.4測試驅(qū)動開發(fā)TDD(4)運行測試用例,編譯失敗,錯誤提示為缺少Rectangle類的定義。于是增加Rectangle類的定義,創(chuàng)建Rectangle.java文件。publicclassRectangle{publicintArea(intlength,intwidth){return0;}publicintPerimeter(intlength,intwidth){return0;}}(5)編譯成功,但是運行這個程序,斷言顯示測試用例失敗,因為計算面積和周長的方法的返回值始終為0。7.4測試驅(qū)動開發(fā)TDD(6)先“傻瓜式”地修改兩個函數(shù)的返回值,改為return6和return10。重新編譯、運行,斷言結果為通過。publicclassRectangle{publicintArea(intlength,intwidth){return6;}publicintPerimeter(intlength,intwidth){return10;}}7.4測試驅(qū)動開發(fā)TDD
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- WB/T 1144-2024疫苗儲存與運輸服務規(guī)范
- 疫病監(jiān)測中野生動物行為學的研究考核試卷
- 電信行業(yè)科技創(chuàng)新考核試卷
- 禮儀用品企業(yè)品牌傳播策略考核試卷
- 篷布企業(yè)市場競爭力提升考核試卷
- 畜牧機械制造質(zhì)量控制考核試卷
- 煤炭氣化殘渣利用考核試卷
- 油氣儲罐操作與維護技術考核試卷
- 信陽藝術職業(yè)學院《德國社會與文化》2023-2024學年第二學期期末試卷
- 欽州幼兒師范高等專科學校《牙周病學A》2023-2024學年第二學期期末試卷
- 常見職業(yè)病危害和預防基礎知識
- 山東省2024年夏季普通高中學業(yè)水平合格考試地理試題02(解析版)
- 英語四級模擬試題(附答案)
- 人教版八年級下冊-中考生物必背知識復習提綱
- 預包裝食品標簽審核表
- 《高等教育學》歷年考試真題試題庫(含答案)
- 福建晉華的測評題庫
- 干部履歷表填寫范本(中共中央組織部1999年)
- 汽車修理店維修管理制度
- 給孩子一生的安全感閱讀記錄
- 小兒海姆立克急救法課件
評論
0/150
提交評論