軟件工程實踐6編程_第1頁
軟件工程實踐6編程_第2頁
軟件工程實踐6編程_第3頁
軟件工程實踐6編程_第4頁
軟件工程實踐6編程_第5頁
已閱讀5頁,還剩63頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、北京理工大學軟件工程實踐湯銘端中國航天科工集團公司204所第五講軟件實現(xiàn)內容和目的n編程語言的選擇 n編程風格n程序效率n編碼要求n靜態(tài)分析n代碼審查n軟件調試編程n編程是設計的自然結果n編程語言的特性和編程風格會深刻地影響軟件的重量和可維護性n軟件實現(xiàn)是一個不斷變換的過程:設計源程序目標代碼機器碼編程語言的選擇n應用領域n算法及運算的復雜性n軟件運行的環(huán)境n性能n數(shù)據(jù)結構的復雜性n軟件開發(fā)組成員對該語言的熟悉程度編程風格n程序必須是可以理解的n程序的風格應該強調簡單和清晰n影響程序風格的因素有:n源程序內部文檔化n數(shù)據(jù)說明的方法n語句的結構ni/o的方法源程序文檔化n選擇好標識符(變量和標號

2、)的名字n挑選有意義的標識符名字n安排注解n序言式注解(頭文件)n功能注解n使程序的結構一目了然n縮進數(shù)據(jù)說明n數(shù)據(jù)說明的次序應該規(guī)范化n多個變量說明時最好按字典數(shù)順序排列n對復雜結構用注解說明語句結構n每個語句應該簡單直接,不應該為提高效率而把語句復雜化n使程序簡單易懂n避免采用復雜的條件語句n不要用“否定”條件的條件語句n避免多重的循環(huán)嵌套或條件嵌套n用括號使邏輯表達式或算術表達式更為清晰n用空格及有意義的符號使語句內容清晰明確n反問自己“如果這程序不是我編的,我能看懂嗎?”輸入/輸出n對批處理i/on符合邏輯地組織輸入ni/o出錯檢查n好的i/o出錯恢復功能n清晰的輸出報告格式n對交互式

3、i/on簡單而有提示的輸入方式n完備的出錯處理及出錯恢復n人機對話輸出ni/o格式的一致性n原則:n檢查所有輸入數(shù)據(jù)的合法性n檢查輸入項的各種重要組合是否合理n輸入格式要簡單n最好采用數(shù)據(jù)結尾指示符,而不應要求用戶規(guī)定“輸入項目的數(shù)量”n交互式i/o要求用戶輸入時,標明交互輸入可選擇的種類和范圍n輸出時保持格式的一致性n設計和標明所有的輸出wasserman交互系統(tǒng)設計原則原則n把計算機的內部特性掩蓋起來不讓用戶看到n使程序“穿上防彈衣”,保證程序不被用戶破壞n如果用戶的請求會產(chǎn)生重大的后果,就要提醒用戶n在使用此程序時提供聯(lián)機的幫助條件n按照用戶的水平設計輸入要求n按照輸出設備的速度設計輸出

4、信息n區(qū)別對待不同類型的用戶n保持一致的響應時間n應盡量減少用戶處理出錯的工作量效率n要求有效地利用臨界資源是自然的ncpu周期和內存單元常被看作臨界資源n有關效率的三個格言:n效率是一種性能需求。軟件的效率應根據(jù)需要,而不是盡可能地高!n好的設計必然提高效率。n程序的簡單性與程序的效率往往是一致的。n總之不要去犧牲程序的清晰性、可讀性或正確性去追求效率的非本質的提高源程序的效率n源程序的效率與算法效率直接相關n編程風格會影響運行速度及所需內存的大小n編譯器的“優(yōu)化”特性是提高效率的一種手段n原則:n在具體編程前應簡化算術表達式及邏輯表達式n細心地分析多層嵌套循環(huán)以確定能否把一些語句或表達式移

5、到循環(huán)之外n盡量避免采用多維數(shù)組n盡量避免采用指針及復雜的表n采用“快”的算術運算n不要把不同的數(shù)據(jù)類型混在一起n只要可能就采用整型數(shù)的算術運算和布爾表達式內存效率n大機器領域內存幾乎無限制,虛存使“內存效率”不等同于“占用最小的內存”n微機領域內存的限制仍是很現(xiàn)實的問題n采用匯編語言可以節(jié)省內存n提高運行效率的技術往往可以同時節(jié)省內存n使程序簡單是提高內存效率的關鍵輸入輸出效率n提高i/o效率的指導原則:n全部i/o應有緩沖以避免過于頻繁的信息交換n對外存應該選用最簡單的可接收的存取方式n與外存聯(lián)系的i/o操作應成塊地傳送數(shù)據(jù)n與終端及行式打印機聯(lián)系的i/o操作應考慮設備的特性,以改進質量與

6、速度n如果“超高效率”的i/o無法被人們理解,則是毫無意義的kernighan和plauger給出的好的程序設計風格的規(guī)則n寫得清晰而不是太靈巧n簡單而直接地說明你的用意n使用庫功能n避免使用臨時變量n寫清晰不要為了“效率”而犧牲清晰n讓機器干苦活n用調用一個公共的例程去代替重復的表示n選用不易混淆的變量名n避免使用不必要的轉移kernighan和plauger給出的好的程序設計風格的規(guī)則n不使用條件轉移代替一個邏輯表達式n假如一個邏輯表達式難以理解,則試著對其進行變換n使用數(shù)組,避免重復的控制序列n選用使程序簡單的數(shù)據(jù)表示法n先用一個容易理解的偽語言寫程序,然后再翻譯成你所用的語言使用ife

7、lseifelseifelseendif實施多路選擇n模塊化,使用子例程kernighan和plauger給出的好的程序設計風格的規(guī)則n確保注釋與代碼一致n不要用注釋去精確地重復代碼使每一個注釋有價值n不要注釋或修補壞代碼重寫n使用有意義的變量名n使用有意義的語句標號n程序格式應有助于讀者理解程序n為你的數(shù)據(jù)設計提供文檔n僅使用goto去實施一個基本的結構kernighan和plauger給出的好的程序設計風格的規(guī)則n假如你能保持程序的可讀性,則完全不必使用goton以小片段的方式寫和測試一個大程序n對已定義的遞歸數(shù)據(jù)結構使用遞歸過程n檢測輸入的合理性和合法性n確保輸入沒有違反程序的限制n使用

8、文件的結尾或標記終止輸入,而不是用計數(shù)來終止輸入n識別錯誤的輸入(若有可能要恢復輸入)kernighan和plauger給出的好的程序設計風格的規(guī)則n輸入簡易,輸出自明n使用一致的輸入格式n使輸入容易校對n若可能,使用自由格式輸入n使用自標識的輸入,允許缺省,輸出時反映這兩者n確保在使用之前,所有變量已被置初值n在出現(xiàn)故障時不要停機n使用排錯編譯程序kernighan和plauger給出的好的程序設計風格的規(guī)則n用data語句或initial屬性置常數(shù)n用可執(zhí)行的代碼置變量初值n盡量注意由錯誤引起的分岔n注意在相等時轉移的正確性n當一個循環(huán)從邊上或底上退出到同一個地方時,必須十分小心n確保你的

9、代碼“沒有做什么優(yōu)美方面的事情”n在邊值處測試程序n人工核查某些答案kernighan和plauger給出的好的程序設計風格的規(guī)則n10.0乘以0.1很少是1.0n不要單獨地進行浮點數(shù)相等比較n先保證正確,再提高速度n在提高速度之前,做好自動防止故障的措施n先保證清晰,再提高速度n不要為謀求“效率”上的少量增益而犧牲清晰n讓你的編譯程序做簡單的優(yōu)化n不要濫用再使用代碼,取而代之的是改組n確保特殊情況是確實的特殊kernighan和plauger給出的好的程序設計風格的規(guī)則n保持簡單,以提高速度n不要浪費代碼而提高速度找一個較好的算法n使用工具裝備你的程序,在“效率”改變以前測量(end)程序編

10、碼結構要求n采用結構化編碼方法n按以下22個特性構造(1)完整性n任何程序或控制段的開始和結束,必須包含在單一的結構化模塊中。(2)功能n每個模塊必須完成單一的定義良好的功能,模塊的全部元素都是為了實現(xiàn)唯一的功能。n此外,模塊實現(xiàn)的細節(jié)對其它模塊來說應該是隱蔽的。如果實現(xiàn)的細節(jié)改變,直接受影響的只是實現(xiàn)功能的那個模塊,并且只有該模塊需要修改。(3)入口出口n每個模塊一般要求單一入口和單一出口。處理完成后,模塊必須返回到調用它的程序而不是其它模塊。n接口(入口與出口條件和參數(shù))必須明確表示和定義。(4)說明n模塊的說明語句和數(shù)據(jù)語句應放在程序首部之后和第一個可執(zhí)行語句之前,雖然允許每行可有多個數(shù)

11、據(jù)說明,但應保證清晰地定義復雜的數(shù)據(jù)結構。(5)常量n常量必須在程序的說明中定義,常量通常有數(shù)組規(guī)模、值、do和for 循環(huán)中的循環(huán)數(shù)、數(shù)組下標、記錄規(guī)模和行長度等。(6)變元n在調用語句中的變元一般不得包含算術或邏輯表達式。n每個變元必須由單一變量來表示。n在調用一個模塊的過程中,變元的類型和個數(shù)必須與模塊的形參相一致。n此外,必須標明調用過程中使用的形參。(7)冪n冪的指數(shù)必須用整數(shù)表示,即而不是3.0。(8)混合方式運算n應避免使用混合運算的算術表達式,不能避免時應仔細計算表達式的值,以保證類型轉換得到預期的結果,應對轉換進行適當?shù)淖⑨?。?)轉移n盡量少用無條件轉移語句。如需使用,必須

12、在同一程序單元內轉移,并應向轉移語句所在點的前方轉移。n允許使用為實現(xiàn)結構化程序設計所必需的轉移指令。(10)錯誤處理a.必須記錄所有錯誤的發(fā)生及處理情況,保存系統(tǒng)發(fā)生錯誤的全部記錄,以利于后續(xù)錯誤情況的處理和分析;b.必須預先了解錯誤的潛在影響,并且在它們出現(xiàn)之前確定如何處理;c.應盡可能使錯誤不擴散,不引起連鎖反應;d.當程序不能執(zhí)行時,必須在中止前釋放已取得的全部資源和結果。(11)范圍檢查n為保證變量值落在預期的范圍內,必須進行范圍檢查。n如果變量值不在規(guī)定范圍內,則必須進行適當?shù)腻e誤處理。n變量的定義域必須在設計時規(guī)定,在實現(xiàn)時聲明,并在運行時檢查。n必須進行范圍檢查的變量應包括:參

13、數(shù);數(shù)值下標;case結構中的變量參數(shù);循環(huán)結構中用作初值、增量和終值的變量。(12)序標和下標n循環(huán)序標參數(shù)和數(shù)值下標必須表示為整型的常量或變量。(13)循環(huán)終止n必須保證循環(huán)終止,終止條件不能靠對循環(huán)參數(shù)所作假設的正確性,而是靠對循環(huán)入口事前直接的驗證。(14)標號和名字的使用n標號和名字必須有意義、一致并明顯、唯一,不易混淆。(15)全局變量和共享變量n應避免使用全局或共享變量。當一個變量由兩個或多個模塊共享時,每個模塊都必須正確地使用該變量。n由多個模塊使用的變量應作為變元進行通信。限制變量的范圍有助于掌握變量的準確含義。n當有明確的技術根據(jù)需要使用公共數(shù)據(jù)時,應有下列限制:a.僅使用

14、可由名字訪問的公用域;b.公用數(shù)據(jù)域的長度和說明,對于使用它的每個模塊都是相同的;c.可能時,應僅保留公用塊的一個副本,而且必須用“include ”語句包容在每一個模塊中而不是在模塊中各自編碼描述。(16)連接約定n如果模塊是用匯編語言實現(xiàn)的,則必須定義和使用模塊間通信的標準約定。目的是構造獨立的、自包容的模塊,它可以用良好定義的方法與其它模塊通信。n應考慮的約定有:a.在將控制轉給其它模塊之前必須保護寄存器的內容,并在控制返回時恢復;b.通信必須通過變元素;c.必須有一個與調用模塊返回地址進行通信的標準方法。(17)輸入與輸出n輸入例程和輸出例程必須集中在有限幾個模塊內。n將這些例程匯集到

15、少數(shù)幾個模塊中有利于輸入和輸出數(shù)據(jù)的監(jiān)控。n此外,將這些例程限制在有限范圍內可使修改更容易。(18)命名n代碼和數(shù)據(jù)單元的名字必須體現(xiàn)它們的功能和內容。(19)程序首部n每個代碼模塊必須包含一個標準化的程序首部注釋語句塊,作為每個程序模塊的內部源文檔。它放在模塊的首部,描述模塊的功能、用途和操作要求。n程序首部應包括下面的信息:a.名稱:包含用于標識模塊的名稱、版本標識符和入口。b.目的:包含模塊目的功能的簡要說明。程序首部n程序首部應包括下面的信息: c.輸入輸出,包含該模塊所使用的每個文件名,并指明是向模塊輸入、還是輸出、還是兩者兼有。使用交互式屏幕的模塊也應提供屏幕功能的說明。d.參數(shù):

16、提供模塊所需的全部變元的定義以及模塊的返回值(輸出參數(shù))。參數(shù)定義必須包括:名字、數(shù)據(jù)類型、大小和功能。e.調用:提供該模塊調用的全部例程的清單和調用該模塊的全部例程的清單。f.全局數(shù)據(jù):提供模塊中使用的全部公用或全局數(shù)據(jù)的清單。程序首部n程序首部應包括下面的信息:g.限制:包含約束或限制模塊性能特點的任何特殊或非常規(guī)因素的清單。h.異常結束:包含異常返回條件和動作的清單。i.方法:包含為實現(xiàn)模塊的功能而使用的方法的詳細說明。j.編程者:代碼編制人名及所屬機構。k.版本號及完成日期:當前的模塊版本號和它的完成日期。l.修改記錄:包含對該模塊的修改人、所屬機構、日期及對應的版本號。(20)行間注

17、釋n源程序體內的注釋必須解釋程序執(zhí)行的處理,必須指明每一個控制語句(有條件地更改一個數(shù)據(jù)值或語句的執(zhí)行順序的語句)的目的。a.if語句:說明條件滿足時執(zhí)行動作的理由。b.i/o語句:標明處理的記錄或文件的性質。c.do語句:說明執(zhí)行動作的理由。d.call語句:說明調用過程的理由。(21)注釋比例n注釋行數(shù)不得少于源程序總行數(shù)的。(22)縮進和分段n源代碼必須清楚地縮進表達,以表明結構化程序段外形的控制范圍,使編碼的邏輯關系對應于程序列表的實際位置。n可執(zhí)行語句限于每行一條。n超過一行的語句的后續(xù)部分應縮進該語句的第一行下面。n一行允許有多個數(shù)據(jù)說明。數(shù)據(jù)說明應使用某種邏輯順序(例如字母順序)

18、排列。(23)模塊規(guī)模n每個軟件單元的源代碼行數(shù)(不含注釋行),平均不應超過行,最大不應超過行。靜態(tài)分析n靜態(tài)分析是通過分析、但不執(zhí)行軟件的程序,找出其中的錯誤和疑點n靜態(tài)分析手段之一,就是使用工具對軟件單元甚至軟件所有成分的源代碼進行分析,獲得以下主要信息:n語法錯誤信息;每個語句中標識符的引用分析,如變量、參數(shù)等;每個模塊調用的子模塊;未給初值的變量;已定義的但未使用的變量;未經(jīng)說明或無用的標號;對任何一組輸入數(shù)據(jù)均不可能執(zhí)行到的代碼段n可以根據(jù)所獲信息對程序進行分析,發(fā)現(xiàn)其中可能存在的缺陷n還可以通過靜態(tài)分析確定程序的分支、路徑、轉移等結構關系,為進行動態(tài)測試產(chǎn)生測試數(shù)據(jù)提供方便圈復雜度

19、程序復雜性度量nmccabe圈復雜度v(g) 7n將程序流程圖退化為程序圖,將程序流程圖中每個處理符號都退化為一個點,箭頭變成有向弧,調整使成為強連通圖nv(g)=m-n+pnm=弧數(shù)nn=節(jié)點數(shù)np=分離部分的數(shù)目(連通圖p=1)代碼審查n代碼審查是由代碼審查員根據(jù)軟件詳細設計說明,按照規(guī)定的代碼審查單,對被審查的程序代碼逐條進行審查,以確保編碼與設計的一致并確保編碼的正確性n代碼審查應著重審查錯誤代碼而不是多余代碼或代碼的遺漏n各軟件開發(fā)機構應根據(jù)自身情況和所開發(fā)的軟件的特點,形成并不斷補充完善自己使用的代碼審查單通用的代碼審查單格式:嵌套的if是否已正確地縮進?注釋準確并有意義嗎?是否使

20、用了有意義的標號?代碼是否基本上與開始時的模塊模式一致?是否遵循全套的編程標準?通用的代碼審查單入口和出口的連接:初始入口的最終出口正確嗎?對另一個模塊的每一次調用: 全部所需的參數(shù)是否已傳送給每一個被調用的模塊? 被傳送的參數(shù)值是否正確地設置?通用的代碼審查單程序語言的使用:是否使用一個或一組最佳的動詞?模塊中是否使用完整定義的語言的有限子集?存儲器使用:每一個域在第一次使用前正確地初始化了嗎?規(guī)定的域正確嗎?每個域是否已由正確的變量類型聲明?通用的代碼審查單測試和轉移:測試條件正確嗎?用于測試的是正確變量嗎?每個轉移目標正確并至少執(zhí)行一次嗎?性能:邏輯是否被最佳地編碼?提供的是一般的錯誤還

21、是異常的例程?通用的代碼審查單維護性:所提供的列表控制是否有利于提高可讀性?標號和子程序名符合代碼的意義嗎?邏輯:全部設計是否均已實現(xiàn)?編碼是否做了設計所規(guī)定的內容?每個循環(huán)是否執(zhí)行正確的次數(shù)?(end)調試n調試的任務:診斷和改正程序中的錯誤n調試的步驟:n根據(jù)跡象確定錯誤的正確位置n仔細分析研究以確定問題的原因并進行改正n確定錯誤位置占調試95%的工作量n錯誤改正后要進行回歸測試n修改程序可能帶來新的錯誤錯誤的特征和調試的困難n癥狀和原因可能是相隔很遠的n癥狀可能在另一個錯誤被糾正后消失或暫時性消失n癥狀可能實際上并不是由“錯誤”引起的(如舍入誤差)n癥狀可能是由不太容易跟蹤的人工錯誤引起的n癥狀可能是和時間有關的,而不是處理問題n很難重新產(chǎn)生完全一樣的輸入條件(如實時應用)n癥狀可能時時有時無的n癥狀可能是由分布在許多不同任務中的原因引起的調試技術n輸出存儲器內容n打印中間結果n自動工

溫馨提示

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

評論

0/150

提交評論