基于案例的軟件構造教程第2版全套教學課件_第1頁
基于案例的軟件構造教程第2版全套教學課件_第2頁
基于案例的軟件構造教程第2版全套教學課件_第3頁
基于案例的軟件構造教程第2版全套教學課件_第4頁
基于案例的軟件構造教程第2版全套教學課件_第5頁
已閱讀5頁,還剩816頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

軟件構造

SOFTWARECONSTRUCTION00引言01軟件開發概述02模塊化軟件構造03面向對象的軟件構造04數據處理的軟件構造05用戶交互的軟件構造06軟件重構與交付07GUI軟件構造08應用數據庫09基于復用的軟件構造全套可編輯PPT課件新的學期,新的起跑線,讓我們一起開始新的征程。秋天,收獲的季節。祝愿同學們在這個秋季學期里收獲豐碩的果實。2課程背景課程內容課程教材及參考資料課程目標教學方式方法教學進度計劃學習方法學期考核3課程背景小型軟件開發的重要性凸顯;傳統計算機學科的課程傳授方式理論化、知識碎片化;軟件工程課程基本前提是要求學生具備軟件構造能力;現代軟件開發方法包括極限編程、測試驅動開發等敏捷方法,突出特點是每個程序員都具有高超的軟件開發功力。4課程內容以一個案例演變,模擬不斷變化的用戶需求,按照增量迭代的開發模式,將碎片化的功能開發、用戶交互、數據處理等知識,以及軟件設計、軟件測試和敏捷開發的最佳實踐,與軟件開發的原理、技術和工具融合到設計、編碼、調試及測試的構造過程。5課程內容課程具體內容包括軟件構造的一般原理(如模塊化、增量迭代)、常用技巧(如表驅動編程、測試驅動開發)、軟件設計(契約式設計、設計模式)、軟件知識(如軟件測試、軟件復用)及軟件構造的工作要素(如編碼規范、構造工具)和活動(如設計、編碼、測試、交付)。6課程教材及參考資料課程教材李勁華等.基于案例的軟件構造教程.北京:電子工業出版社,2016.6參考資料S.McConnel.金戈,等譯.代碼大全(第二版).北京:電子工業出版社,2011.RobertC.Martin.鄧輝,譯.敏捷軟件開發:原則、模式與實踐.北京:清華大學出版社,2003.CapersJones.吳舜賢,等譯.軟件工程最佳實踐.北京:機械工業出版社,2014.……7課程目標本課程旨在以案例為引導,通過集成化解決軟件知識的碎片化,提升個人的軟件構造能力,加快從程序編寫到軟件開發的轉變,在孤立的基礎課程與軟件工程課程之間搭建橋梁。目標是把學生培養成能獨立地綜合運用技術、開發可用產品的高級程序員,再通過后續課程(如軟件工程、綜合課程設計和實習實訓)培養成軟件工程師。8教學方式方法以案例需求演變為主線;理論方法講解;案例分析實踐;將軟件構造的原理、原則、方法、技術、流程和技能整合到一起,通過案例的展開由淺及深地學習。9教學進度計劃參考教材中“教學方案”10學習方法一邊思考案例問題;一邊學習;一邊動手實踐。11第1章

軟件開發概述第1章軟件開發概述從不同方面深入理解程序及其開發。首先,認識程序和軟件的區別,了解不同的軟件分類。其次,理解小程序的編寫與大型軟件的開發。最后,深入理解軟件構造,從編輯-編譯-運行的程序編寫,到設計-實現-調試-測試的軟件構造。13第1章軟件開發概述1.1程序與軟件1.2軟件生存周期1.3軟件開發過程1.4敏捷開發1.5軟件構造1.6為什么不直接編寫軟件1.7案例導讀1.8思考與練習題141.1程序與軟件1.1.1從程序到軟件1.1.2軟件類型1.1.3程序設計與軟件開發151.1.1從程序到軟件計算機程序(簡稱程序)是為了解決某個特定問題而用程序設計語言描述的適合計算機處理的語句序列。軟件是能夠完成預定功能和性能的可執行的程序和使程序正常執行所需要的數據,加上描述軟件開發過程及其管理、程序的操作和使用的有關文檔,即“軟件=程序+數據+文檔”。161.1.1從程序到軟件教學管理軟件,它通過一組獨立而又交互的程序提供各種教與學的服務功能。該教學管理軟件數據有相對穩定的學生、教師、課程、教室等信息;有變動性強的授課信息;以及不斷變化的授課教師發布的授課/參考材料、作業及批改、試題及分數、學生提交的作業、師生的答疑等。該軟件還需要各種文檔,如安裝說明書、操作說明書和技術說明書等。所有這些程序、數據和文檔,共同構成了這個教學管理軟件。171.1.2軟件類型功能系統軟件、支撐軟件和應用軟件。工作方式實時處理軟件、分時軟件、交互式軟件和批處理軟件。服務對象的范圍項目軟件(定制開發)和產品軟件(或通用軟件)。其他商業軟件、開源軟件、共享軟件。181.1.2軟件類型軟件規模191.1.2軟件類型隨著軟件變得越來越大、越來越復雜,軟件開發的關注點也發生了變化。相對于小規模的程序設計(ProgrammingintheSmall),提出了大規模的程序設計(ProgrammingintheLarge),即軟件開發。201.1.3程序設計與軟件開發程序設計是解決特定問題而編寫程序的過程,是軟件生產活動中的重要組成部分。程序設計以某種程序設計語言為工具,編寫源程序,然后由編譯系統完成可執行代碼的轉換。程序設計的活動包括分析、設計、編碼、測試、排錯等不同階段。211.1.3程序設計與軟件開發圖靈獎獲得者沃斯(NiclausWirth)提出的“程序=算法+數據結構”是程序設計的精辟觀點。數據結構指的是程序處理或應用的數據與數據之間的邏輯關系。算法指的是解決特定問題的步驟和方法。程序設計的核心就是選擇和設計適合特定問題的數據結構與算法,用編程語言編制為程序。221.1.3程序設計與軟件開發在計算機技術發展的早期,軟件開發的主要活動就是程序設計。隨著程序向軟件的演變,軟件開發不再只是純粹的程序的功能設計,還包括數據庫設計、用戶界面設計、軟件接口設計、通信協議設計和復雜的系統配置。軟件變得越來越大、越來越復雜。231.1.3程序設計與軟件開發軟件變得越來越大、越來越復雜。圖1.1示意了Linux操作系統的內核在10年里從240萬行擴大到接近1600萬行。241.1.3程序設計與軟件開發程序設計活動走向軟件工程。軟件工程把經過時間考驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來,以系統性的、規范化的、可定量的過程化方法去開發和維護軟件。軟件工程是應用計算機科學、數學、邏輯學及管理科學等原理,開發軟件的工程學科和活動。251.2軟件生存周期一個軟件產品或軟件系統也要經歷孕育、誕生、成長、成熟、衰亡等階段,一般稱為軟件生存周期(軟件生命周期)。軟件的生產者和使用者對軟件生存周期的階段和活動具有不同的理解和劃分。1.2.1使用角度的軟件生存周期1.2.2開發角度的軟件生存周期261.2.1使用角度的軟件生存周期提出需求。用戶根據需要,提出要解決的問題和需要的軟件。獲取軟件。主要是對獲取軟件的最佳途徑做出決策并選擇最佳的供應商。購買軟件定制或開發軟件租賃軟件或租賃服務使用軟件。一旦獲得軟件之后,用戶將操作軟件使之為其服務。271.2.2開發角度的軟件生存周期從軟件開發者的角度,一般把軟件生存周期分為定義軟件、開發軟件和維護軟件三個階段。281.3軟件開發過程把軟件開發工作分成若干都有特定結果的步驟或活動,按照一定的方式開展軟件活動,從而形成了軟件過程。簡單而言,軟件開發過程是用來生產軟件產品的流程及一系列工具、方法和實踐的集合。軟件過程模型是從一個特殊的視角對軟件開發過程的簡化描述。291.3軟件開發過程301.3軟件開發過程1.3.1瀑布式開發過程1.3.2增量開發模型1.3.3個體軟件過程311.3.1瀑布式開發過程瀑布式開發過程,也叫軟件生存期模型。按照軟件生命周期,開發分為制定計劃、需求分析、軟件設計、程序編寫、軟件測試和運行維護等6個基本活動。各項活動嚴格按照線性方式進行,自上而下、相互銜接。每項活動的結果需要驗證通過后,才能繼續進行下一項活動。321.3.1瀑布式開發過程核心思想是按工序將問題化簡,將功能的實現與設計分開,即采用結構化的分析與設計方法將邏輯實現與物理實現分開。331.3.1瀑布式開發過程主要問題在于:階段劃分僵硬,每個階段不能缺省,而且產生大量文檔,增加了工作量;開發是線性的,只有等到整個過程的末期才能見到開發成果——可運行軟件,不利于快速響應變化的需求;早期的錯誤要等到開發后期的測試階段才能發現,可能帶來嚴重的后果,增加了開發的風險。341.3.2增量開發模型把軟件分成一系列增量,完成一部分就交付一部分。本質上是迭代開發的,即不是一次性執行軟件開發的全部活動,而是有計劃地反復執行“分析-設計-編碼-測試”的過程。351.3.2增量開發模型增量開發模型的特點是引進了增量包的概念,無須等到所有需求,只要某個需求明確了,就可進行開發。增量的類型及其開發不止一種。可行的方式是首先實現那些明確的、核心的需求;也可以對需求按優先級排序,或者按照用戶的要求實現增量。361.3.2增量開發模型增量開發模型的基本思想是讓開發者能夠從早期的開發、系統的增量、交付的版本中學到經驗。過程中的關鍵是從系統需求的簡單子集實現開始,通過迭代增強和進化后續的版本,直到系統被實現。每次迭代中,對設計進行修改,并增加新的功能要求。371.3.2增量開發模型增量開發模型的優點如下:在短時間內向用戶提交一個可運行軟件,能夠提供解決用戶急用的一些功能。由于每次只提交部分功能,用戶有較充分的時間學習和適應新的產品。在開發過程中,需求的變化是不可避免的。增量開發模型的靈活性可以使軟件適應需求變化。有利于系統維護,因為整個系統是由一個個增量(部件)集成在一起的,當需求變更時,只變更部分部件,而不必影響整個系統。381.3.2增量開發模型增量模型存在以下風險:由于各個部件是逐漸并入已有軟件的,必須確保每次增加的部件不破壞已構造好的系統,這需要軟件具備開放式的體系結構,否則系統將失去穩定的結構。逐步增加部件的方式,很容易退化為邊做邊改模型,從而使軟件過程的控制失去整體性。在一個軟件開發中如何一致地定義“增量”?如何界定它的工作量、需求范圍、功能或特性?391.3.2增量開發模型實踐中,增量開發模型往往要求在分析了軟件需求以后,在軟件設計開發時進行增量。增量開發最好是在架構設計完成后再開始進行增量,這樣可以更好地保證系統的健壯性和可擴展性。每次迭代過程仍然要遵循“分析→設計→實現”的微型瀑布過程。迭代周期的長度跟軟件的開發周期和規模有關系。401.3.3個體軟件過程美國卡內基梅隆大學軟件工程研究院的漢弗萊(Humphrey)主持開發了個體軟件過程(PersonalSoftwareProcess,PSP)和團隊軟件過程(TeamSoftwareProcess,TSP)。TSP是為開發軟件產品的開發團隊提供的指導,在于幫助開發團隊改善其質量和生產率,更好地滿足成本及進度的目標。411.3.3個體軟件過程PSP是一種可用于控制、管理和改進個人工作方式的自我持續改進過程。它是一個包括軟件開發表格、指南和規程的結構化框架。PSP與具體的技術(程序設計語言、工具或設計方法)相對獨立,其原則能夠應用到任何軟件工程任務之中。PSP能夠說明個體軟件過程的原則;幫助軟件工程師做出準確的計劃;確定軟件工程師為改善產品質量要采取的步驟;建立度量個體軟件過程改善的基準;確定過程的改變對軟件工程師能力的影響。421.3.3個體軟件過程PSP為個體的能力也提供了一個階梯式的進化框架,每一級別都包含了更低一級別中的所有元素,并增加了新的元素。借助這個框架,個體可以循序漸進地改進開發過程。它賦予軟件人員度量和分析工具,使其清楚地認識到自己的表現和潛力,從而可以提高自己的技能和水平。431.3.3個體軟件過程PSP0的目的是建立個體過程基線,學會使用PSP的各種表格采集過程的有關數據,執行的軟件過程包括計劃、設計、編碼、編譯和測試。按照選定的缺陷類型標準、度量引入的缺陷個數和排除的缺陷個數等,用在測量PSP過程的改進。PSP0.1增加了編碼標準、程序規模度量和過程改善建議三個關鍵過程域。441.3.3個體軟件過程PSP1的重點是個體計劃,用自己的歷史數據來預測新程序的大小和需要的開發時間,并使用線性回歸方法計算估計參數,確定置信區間以評價預測的可信程度。PSP1.1增加了對任務和進度的規劃。在PSP1階段應該學會編制項目開發計劃,這不僅對承擔大型軟件的開發十分重要,即使是開發小型軟件,也必不可少。451.3.3個體軟件過程PSP2的重點是個體質量管理,根據程序的缺陷建立檢測表,按照檢測表進行設計復查和代碼復查(也稱“代碼走查”),以便及早發現缺陷,使修復缺陷的代價最小。PSP2.1則論述設計過程和設計模板,但并不強調選用什么設計方法,而強調設計完備性準則和設計驗證技術。461.3.3個體軟件過程PSP3的目標是把個體開發小程序所能達到的生產效率和生產質量延伸到大型程序;其方法是采用迭代增量式開發方法,首先把大型程序分解成小的模塊,然后對每個模塊按照PSP2.1所描述的過程進行開發,最后把這些模塊逐步集成為完整的軟件產品。在新一輪開發循環中,可以采用回歸測試。471.4敏捷開發敏捷開發是從20世紀90年代開始逐漸引起廣泛關注的一組新型的軟件開發方法,更強調程序員團隊與業務專家之間的緊密協作、面對面的溝通、頻繁交付新的軟件版本、緊湊而自我組織型的團隊、能夠很好地適應需求變化的代碼編寫和團隊組織方法,更注重軟件開發中人的作用。1.4.1概述1.4.2Scrum方法481.4.1概述敏捷開發是應對快速變化的需求的一種軟件開發能力。以用戶需求進化為核心,采用迭代、循序漸進的方法進行軟件開發。敏捷開發采用了更加人性化、個性化的溝通表達方式,特別是使用隱喻而非常規術語或形式化技術。例如,表示和處理需求的用戶故事(UserStory)。再如,sprint指增量開發的迭代周期,長度通常是一至六周。一個用戶故事的大小和復雜度應該以能在一個sprint中完成。491.4.1概述敏捷開發通過宣言表示了它的4個核心價值觀。(1)個體和互動勝過流程和工具。(2)工作的軟件勝過詳盡的文檔。(3)客戶合作勝過合同談判。(4)響應變化勝過遵循計劃。501.4.1概述所有敏捷開發方法都遵循下面12條原則。(1)最優先要做的是通過盡早地、持續地交付有價值的軟件滿足客戶需要。(2)即使在開發后期也歡迎需求的變化,敏捷過程利用變化為客戶創造競爭優勢。(3)經常交付可以工作的軟件,從幾星期到幾個月,時間越短越好。(4)業務人員和開發人員應該在整個項目過程中始終朝夕在一起工作。(5)要善于激勵項目人員,給他們以所需要的環境和支持,并相信他們能夠完成任務。(6)在開發小組中最有效率、也最有效果的信息傳達方式是面對面的交談。(7)工作的軟件是進度的主要度量標準。(8)責任人、開發者和用戶應該維持長期、恒等的開發節奏。(9)對卓越技術與良好設計的不斷追求將有助于提高敏捷性。(10)簡單——盡可能減少工作量的藝術——至關重要。(11)最好的架構、需求和設計都源于自組織的團隊。(12)每隔一定時間,團隊都要總結、反省工作效率,然后相應地調整自己的行為。511.4.1概述基本技術敏捷方法可以視為一些最佳實踐的集合,包括經典的軟件開發技術和管理,也包括敏捷開發首創的技術和方法。敏捷開發遵循軟件開發的基本原則,同時也總結出了11條面向對象設計的原則,如單一職責原則(模塊內聚的體現)、(采納的)Liskov替換原則等。521.4.1概述基本技術敏捷開發主要采用了面向對象的開發技術,使用CRC卡(Class-Responsibility-Collaborator,類-責任-協作)、用戶用例、設計模式及UML(UnifiedModellingLanguage,統一建模語言)。但是,敏捷開發使用UML的符號主要是類圖和時序圖,因為這兩種符號有助于直接編寫出代碼。531.4.1概述意圖導向編程意圖導向編程指的是,先假設當前這個對象中已經有了一個理想方法,它可以準確無誤地完成想做的事情,而不是直接盯著每一點要求來編寫代碼。在這個實例中,需要創建一個服務程序,它接收一個業務交易,然后提交。先簡單創建一個對象,它只包含一個公共方法來完成這件事。541.4.1概述具體需求如下交易信息開始于一串標準ASCII字符串。信息字符串必須轉換成一個字符串的數組,其值是此次交易用到的領域語言中所包含的詞匯元素(token)。每個詞匯元素必須標準化:第一個字母大寫,其余字母小寫,空格和非字母數字的符號都要刪掉。超過150個詞匯元素的交易應該采用與小型交易不同的方式(不同的算法)來提交,以提高效率。如果提交成功,返回true;否則返回false。551.4.1概述561.4.1概述采用“意圖導向編程”的編碼方式,在編程開始時,假設這些“輔助方法”都已經存在,只需先考慮這些“輔助方法”要實現的功能和它們的輸入和輸出,然后按程序要求寫出程序的主框架。最后才是“輔助方法”的編程。這樣的編碼方式使得程序員在整個編程中思路清晰,可以把精力集中在如何分解最終目標,以及那些全局性的問題上。實現的代碼功能單一,易讀易理解。571.4.1概述敏捷技術敏捷開發也創造了一些新的技術或實踐。如測試驅動開發、結對編程、代碼重構和持續集成。581.4.1概述測試驅動開發在一個微循環開發中,首先確認并自動化進行一個失敗的測試,然后編寫足夠的代碼通過測試,在下一輪前以必要的方式清理代碼。591.4.1概述結對編程兩個程序員在一個計算機上共同工作。一個人輸入代碼,而另一個人審查他輸入的每一行代碼。兩個程序員經常互換角色。代碼重構指的是改變程序結構而不改變其行為,以便提高代碼的可讀性、易修改性等。例如,給變量重新命名,把一段代碼提升為函數,把公共的屬性和行為抽象成基類。601.4.1概述持續集成微軟等公司的軟件開發方法包括每日構造產品,持續集成比它更進一步,只要可能,就把新代碼或變更的代碼合并到應用程序,然后測試,確保一切都正常。611.4.1概述敏捷開發是一個統稱,很多軟件開發方法都認為自己是敏捷的。典型的敏捷開發方法包括極限編程(ExtremeProgramming,XP)、Scrum、水晶方法(Crystal)、特性驅動開發(FeatureDrivenDevelopment,FDD)、動態系統開發方法(DynamicSystemsDevelopmentMethod,DSDM)。621.4.2Scrum方法Scrum是一個用于開發和維持復雜軟件產品的框架,是一個增量的、迭代的開發過程。整個開發過程由若干短的迭代周期(沖刺Sprint)組成。Scrum使用產品積壓工作(ProductBacklog)來管理產品需求,它是一個按照商業價值排序的需求列表,列表條目的體現形式為用戶故事。Scrum團隊總是先開發對客戶具有較高價值的需求。在沖刺中,團隊從產品積壓工作中挑選最高優先級的需求進行開發。挑選的需求在沖刺計劃會議上經過討論、分析和估算得到相應的任務列表,稱為沖刺清單(SprintBacklog)。每個迭代結束時,團隊將遞交潛在可交付的產品增量。631.4.2Scrum方法Scrum框架可以簡化成3個角色、3個工件、5個活動和5個價值。Scrum框架的3個角色是:產品負責人、產品經理(ScrumMaster)及團隊。3個工件是產品積壓工作、沖刺清單和燃盡圖(Burn-downChart)。5個活動包括:沖刺計劃會議、每日站會、沖刺評審會議、沖刺回顧會議和產品積壓工作梳理會議。641.4.2Scrum方法Scrum的5個價值是:①承諾:愿意對目標做出承諾;②專注:把心思和能力都用到承諾的工作上去;③開放:Scrum把項目中的一切開放給每個人看;④尊重:每個人都有其獨特的背景和經驗;⑤勇氣:有勇氣做出承諾、履行承諾、接受別人的尊重。651.4.2Scrum方法Scrum的工作流程661.5軟件構造1.5.1有關概念1.5.2構造與開發過程1.5.3主要內容1.5.4軟件構造的重要性671.5.1有關概念IEEE計算機學會于2013年正式發布了最新的軟件工程知識體系(SWEBOK3.0)指南,提出了構成軟件工程學科的11個實踐知識域,每個知識域分解為子域,子域含若干主題。這11個軟件工程實踐知識域是:軟件需求、軟件設計、軟件構造、軟件測試、軟件維護、軟件配置管理、軟件工程管理、軟件工程過程、軟件工程模型與方法、軟件質量、軟件工程專業實踐。681.5.1有關概念“軟件構造”指的是通過編碼、驗證、單元測試、集成測試和調試的組合,詳細地創建可工作的、有意義的軟件。691.5.2構造與開發過程構造在不同軟件開發流程或模型中的地位也不一樣。有些流程更加重視構造。從構造角度看,有些模型側重于線性化過程——比如瀑布模型、階段交付的生命周期模型。線性化開發方式更加重視構造之前的活動(需求和設計),并且在這些活動之間建立明確的任務劃分。在這些模型中,構造工作主要就是編碼。701.5.2構造與開發過程有些模型是迭代的——如Scrum、極限編程、進化式原型法。這些方式傾向于把構造視為與其他軟件開發(包括需求、設計和計劃)同時發生或重疊的活動。這些方式混合設計、編碼和測試活動,把構造當成這些活動的集合體。所以,如何考慮構造,在某種程度上依賴于采用的生存周期模型。一般地說,軟件構造最主要是編碼和調試,但也可以包含工作計劃、詳細設計、單元測試、集成測試,以及其他活動。711.5.3主要內容軟件構造的知識域分為5個子域,每個子域包含了數量不等的主題。軟件構造基礎。管理構造。實際考慮。構造技術。軟件構造工具。721.5.3主要內容本書使用的“軟件構造”指的是運用軟件最佳實踐,通過設計、編碼和測試的迭代過程,增量地建造出可運行軟件。本書涵蓋了指南中5個知識子域的大部分主題。通過增量迭代地構造一個可運行軟件,用具體的技術實踐講解了軟件構造域的知識主題。此外,本書討論了軟件模塊的構造、用戶交互的構造及數據處理的構造。有關軟件測試、敏捷開發的技術、設計模式包含了比指南更多的內容。在開發階段方面,增加了軟件交付。731.5.3主要內容本書沒有涵蓋指南的部分主題:管理構造子域中的構造計劃和構造度量;構造技術子域中的可執行模型、并發原語、性能分析與調優,也沒有特別處理實時、分布式和異構軟件;軟件構造工具子域中的性能優化、分析、切片工具。741.5.3主要內容總體而言,本書面向個體,涉及團隊少;以技術、方法和工具的最佳實踐為主,通過代碼實現學習抽象的原則和技術方法,不涉及管理;采用增量迭代的構造方式,不采用任何明確定義的流程或模型;涉及少量的需求和分析,不包含交付之后的活動。751.5.4軟件構造的重要性構造占據了軟件開發的大部分工作。研究表明,構造占軟件開發30%~80%的工作時間。而任何占據項目大量時間的工作一定會深刻地影響項目的成功。構造是軟件開發的中心活動。把重心放在構造,能顯著提升個體程序員的生產率。構造的產品——源程序代碼,常常是唯一準確的軟件描述。構造是確保唯一要完成的活動。761.6為什么不直接編寫軟件相對于編程,軟件具有了工程特征。軟件開發是要跨越分析、設計、實現、安裝和維護活動的一個可以反復遵循的、復雜的過程(工作流程);軟件需要依靠一個團隊的分工合作,需要過程的組織和管理(人員組織與管理);軟件開發還要運用各種技術和工具生產出來的產品(工具和自動化)。771.6為什么不直接編寫軟件1.6.1軟件開發語言1.6.2編程工具與集成化開發環境1.6.3軟件運行環境1.6.4軟件開發的最佳實踐1.6.5開發過程與管理781.6.1軟件開發語言計算機軟件的編程語言基本被劃分成機器語言/匯編語言的低級語言和與計算機的硬件結構及指令系統無關的高級(程序)語言。面向對象語言是目前使用最多的一種語言。791.6.1軟件開發語言按計算模型的劃分聲明式:告訴計算機做什么。函數式語言邏輯式語言數據流語言命令式:告訴計算機應該如何做。馮·諾依曼式語言腳本語言面向對象語言801.6.1軟件開發語言高級程序語言的一個發展趨勢是融合各種類型語言的特性。大多數面向對象語言都具有馮·諾依曼式語言的結構,有些也融合了函數式編程范式的思想,如Java和C#引入了λ算子等。811.6.1軟件開發語言例題1.1:使用歐幾里得算法,編寫計算兩個整數a和b的最大公因數的程序gcd。821.6.1軟件開發語言按執行模式的劃分高級語言程序不能直接在計算機上運行,必須轉換成低級語言的指令后才能運行。按照語言的轉換和執行方式,高級語言分為編譯型語言和解釋型語言。831.6.2編程工具與集成化開發環境使用任何語言編程都需要基本的編程工具——軟件開發工具包(SoftwareDevelopmentKit,SDK),它通常包括編譯程序或解釋程序、調試程序、連接程序等,如Java的JDK、Android的ADK。編寫程序的工具是普通的文本編輯器,它可以是傳統的正文行編輯器,也可以是面向全屏的圖形編輯器。841.6.2編程工具與集成化開發環境編寫程序的工具是普通的文本編輯器,它可以是傳統的正文行編輯器,也可以是面向全屏的圖形編輯器。編輯器可以是通用的、與程序語言無關,也可以是具備源程序語言知識的語法制導編輯器或結構化編輯器(如emacs、notepad++)。語法制導編輯工具運用程序語言的語法知識,在用戶編寫程序時按照詞法和語法分析的信息提供若干智能化幫助,包括自動地提供關鍵字及其匹配的關鍵字、左右括號的配對、對象的屬性和操作,等等。851.6.2編程工具與集成化開發環境軟件開發還需要管理各種代碼文件、檢查程序質量、測試工具、管理bugs、軟件打包工具等。這些基礎開發工具通常是行式命令,直接在操作系統中輸入相應的命令,如編譯Java程序的編譯命令javac,解釋執行Java程序的命令java。也有一些語言直接提供可視化開發工具。861.6.2編程工具與集成化開發環境可視化集成開發環境IDE,用圖形用戶界面(GraphicalUserInterface,GUI)集成了代碼編寫、靜態分析、編譯、調試、連接、打包等功能的一體化軟件開發套件。如Delphi、VisualStudio、Eclipse和Netbeans,它們以GUI形式提供支持多種語言進行編程,還提供代碼管理、代碼分析、軟件維護、軟件測試及軟件部署和交付等工具,同時支持多種形態應用軟件(通用應用程序、Web應用、數據庫應用、移動應用)的開發。871.6.3軟件運行環境軟件運行環境,廣義上說,是一個軟件運行所要求的各種條件,包括軟件環境和硬件環境。許多應用軟件不僅僅要求特定的硬件條件,還對軟件提出明確的支撐條件。操作系統將計算機的硬件細節屏蔽,將計算機抽象成虛擬資源。通常把計算機硬件和操作系統稱為平臺。881.6.3軟件運行環境為了能夠使同一種編程語言的程序獨立于操作系統,實現程序運行的獨立性,即“一次編寫程序、到處運行”,在操作系統層面提出并出現了語言虛擬機或運行容器。它為程序的運行提供所需的運行時資源,包括把程序翻譯成計算機指令、分配內存、通過操作系統調用計算資源等。例如,Java虛擬機(JavaVirtualMachine,JVM)可以理解成一臺運行Java程序的抽象的計算機。891.6.3軟件運行環境除了計算機硬件和操作系統構成的運行平臺,運行軟件還需要支撐環境,包括使用的數據庫管理系統(如Oracle、MySQL、SQLServer)、Web服務器(如Apache服務器、微軟的Internet信息服務器)、應用框架(如.NETFramework、Java程序的SSH框架、Web應用框架RubyonRails)及使用的第三方庫函數、類庫、APIs等。901.6.4軟件開發的最佳實踐合適的技術和方法能提高軟件開發的效率和產品質量。軟件開發一直缺乏堅實的理論基礎。軟件行業借用了管理學的最佳實踐(BestPractice)的概念來概括到達用戶滿意的、可以反復使用的軟件開發的一切手段。最佳實踐認為存在某種技術、方法、過程、活動或機制,可以使生產或管理實踐的結果達到最優,并減少出錯的可能性。911.6.4軟件開發的最佳實踐原則是一個已經接受或專業化的指導行動的最高準則或標準。人們總結、使用了軟件開發的基本原則、面向對象原則等。原則必須通過某種途徑體現出來,才具有指導作用。機制指的是有機體的構造、功能及其相互關系、工作原理,如可視化編程的事件響應機制、類型的多態機制。921.6.4軟件開發的最佳實踐技術是科學原理的應用,是具有技能特點的特殊的步驟或途徑。軟件開發技術是運用了計算機科學、數學、系統科學、管理科學的基本原理,進行軟件開發的方式方法。931.6.4軟件開發的最佳實踐方法是獲得一個客體(對象)的步驟或過程。作為一個系統的步驟、技術活動被特定的專業或藝術采納,是技能或技術的全部。研究方法及其知識的活動稱為方法學,如面向對象方法學、軟件方法學。941.6.4軟件開發的最佳實踐工具指的是執行操作的器具,引申為為達到、完成或促進某一事物的手段。我們使用更加廣泛的含義,軟件工具指的是從編輯器、編譯器、自動化測試框架到IDE的實用程序。951.6.4軟件開發的最佳實踐軟件開發的技術實踐十分豐富,按照開發活動劃分有用戶需求、軟件設計、軟件構造、軟件測試、軟件交付技術和方法。每個方面又可以細分,如軟件設計技術包括軟件架構設計、構件設計、算法設計、數據結構設計或功能設計、用戶交互設計、數據庫設計。這些技術方法只適合某一個開發階段或某個軟件組成,也有一些成套的包含技術、方法和工具,主要是公司內部研制和使用(如微軟開發方法與最佳實踐MSF)。961.6.4軟件開發的最佳實踐按照軟件開發范式有結構化開發、面向對象開發和新興的面向服務開發等,側重在軟件工程活動的前期、以軟件分析和設計或軟件建模為主。結構化開發方法是用系統工程的思想和工程化的方法,按用戶至上的原則,結構化、模塊化、自頂向下地對系統進行分析和設計的方法。971.6.4軟件開發的最佳實踐面向對象方法是一種把面向對象的思想應用于軟件開發過程中,指導開發活動的系統方法,是目前的主流開發方法。著名的方法體系有對象建模技術OMT、面向對象軟件工程OOSE、Booch面向對象分析與設計。981.6.4軟件開發的最佳實踐軟件開發最佳實踐包括一些普遍適用的軟件開發基本原則(抽象、模塊化),針對某個方法的設計原則(開閉原則、最少知識原則),提供軟件質量和生產率的復用技術、設計模式,支持工具如自動化測試、版本控制、缺陷追蹤。敏捷開發提出了獨特的技術實踐,如代碼重構、測試先行開發。991.6.4軟件開發的最佳實踐1001.6.4軟件開發的最佳實踐1011.6.5開發過程與管理首先,軟件開發是做出決策、權衡和選擇的過程。抉擇的內容除了上述技術方面,還包括工作步驟、工作方式、開發人員及其組織、結構等。其次,具有工程和產品生產特點的軟件開發,需要良好的人員組織和管理、開發結果的管理及開發過程的管理。1021.6.5開發過程與管理對于人員的組織管理,首先要識別出參與軟件開發、與軟件開發相關、受軟件影響的人員,并分析每個相關人員對軟件的訴求、期望、影響和作用。其次,把開發人員組織成目標一致、分工合作的團隊,包括確定職責、分配任務、明確規則等。然后,團隊負責人要運用領導力和權利,指導開發人員各行其責,確保各類人員之間能順利地溝通和協調,同時要給予必要的培訓、獎懲、激勵,確保高度的團隊和個人的開發效率。1031.6.5開發過程與管理軟件開發作為項目,要評估成本、開發時間、質量、人員等因素,預先做出項目計劃。首先要識別軟件開發的所有活動、所有結果(如代碼、測試、文檔、數據、設計、配置文件),確定項目范圍。然后,將開發活動分解成可管控的工程活動,如問題分析、程序設計、編碼實現等,結合人員、預算、時間等資源條件,制定開發進度和交付物,明確監控、檢查和評估的時間點和內容。1041.6.5開發過程與管理同時,要考慮軟件開發的風險——不確定的、對軟件開發有危害的潛在因素,制定風險防范與應對計劃。對于軟件質量,要考慮采取的質量保障方法、質量評估流程和標準,制定質量管理計劃。在軟件開發的過程,就是按照計劃調配資源、執行各項開發任務,確保開發按照要求和計劃展開。必要時對計劃做出適當的調整和變更,直至交付軟件產品、開發任務結束。1051.7案例導讀案例描述50道100以內的加減法口算習題。1061.7案例導讀開發過程以個體為中心,主要采取敏捷和增量迭代的開發策略。敏捷開發:以需求進化為核心,采用迭代、循序漸進的方式進行軟件開發;不要求全面、完備的需求,也不規定設計的方法和表達。增量迭代:針對用戶提出的需求,每次都執行“分析-設計-編碼-測試”的軟件構造活動;循環的次數、每個增量的大小及每次構造活動的重點可以不一致,有些構造的重點在設計,有些構造的重點在測試。1071.7案例導讀問題和解空間1081.8思考與練習題109第2章

模塊化軟件構造第2章模塊化軟件構造討論函數級的軟件構造技術。學習如何運用模塊化技術進行分解和細化,設計由函數組成的、具有一定結構的程序來分離不同的專注點,管理和控制程序的復雜性,使其便于維護、更新和擴展。如何針對實際問題設計和選擇數據結構;初步學習如何編程實現軟件測試、如何調試程序;理解好程序不僅僅是正確的,還有易維護、健壯等其他性質,學習良好的編程風格。111第2章模塊化軟件構造故事一50道100以內的加減法口算習題。循環50次,每次產生一個運算題:隨機地產生兩個100以內的整數,隨機地從兩個運算符“加法”和“減法”中挑選一個,就可以生成一道口算題;然后打印輸出一套練習題。112第2章模塊化軟件構造113第2章模塊化軟件構造程序沒有明確清晰的“算式”、“習題”的含義,沒有使用相應的變量、數據結構等程序設計的方式表達。若干獨立的功能集中在一個函數中不利于發現和修改程序中的錯誤,也不便擴充程序的功能。程序修改后,每次都要重新設計一些檢驗的數據,運行程序、觀察結果,判斷修改過的程序是否正確。我們希望能保留下檢測數據、運行結果及其判斷,無須改變地反復使用。編程缺乏規范。114第2章模塊化軟件構造2.1分解與模塊化2.2數據結構與算法2.3模塊化設計理論初步2.4測試程序2.5調試程序2.6案例分析與實踐2.7討論與提高2.8思考與練習題1152.1分解與模塊化2.1.1分解的含義2.1.2模塊化與結構化1162.1.1分解的含義分而治之的策略:①把問題分成兩個或多個更小的問題;②分別解決每個小問題;③然后把各個小問題的解答聚合起來,即可得到原問題的解答。例如,軟件開發分解為若干方面,包括軟件過程、項目管理、軟件開發技術等。軟件開發活動細化為需求分析、系統設計、軟件構造、軟件交付等活動。又如,對于一個要編程解決的問題,可以把程序分解為若干函數或若干類。1172.1.1分解的含義分解的核心是將多個問題、難點或關注點分離。關注點分離是對只與“特定概念、目標”(關注點)相關聯的軟件組成部分進行“標識、封裝和操縱”的能力,即標識、封裝和操縱關注點的能力,是處理復雜性的一個原則。關注點分離是面向方面的程序設計的核心概念。1182.1.1分解的含義案例代碼2.1的程序可以分解4個部分。(1)增加一個程序頭打印函數voidprintHeader(),簡單說明本程序的作用和使用。(2)函數voidgenerateEquations(),產生加法或減法算式的符號串并存入一個數組。(3)輸出習題的函數voidprintExercise(),它接收generateEquations的輸出,按照要求打印輸出所有的算式。(4)輸出習題中每個算式的計算結果voidprintCalculations()。1192.1.1分解的含義1202.1.2模塊化與結構化模塊化是把問題分解成容易理解、便于控制、便于實現的子問題的一個重要手段,是實現控制復雜性的方式。模塊化通過把一個程序分解成簡單獨立、互相作用的模塊,對不同的模塊設定不同的功能,來實現大型、復雜的程序。模塊是可組合、可更換的程序單元。良好設計的模塊只完成一個特定的或一組相關的子功能。所有模塊按某種方法組裝起來,成為一個整體,完成整個系統所要求的功能。1212.1.2模塊化與結構化軟件模塊是指具有相對獨立性的、由數據說明、執行語句等程序對象構成的代碼集合。每個模塊都需要單獨命名,如:函數、子程序、過程、方法等。通過名字訪問指定模塊。一個模塊具有輸入/輸出(接口)、功能、內部數據和程序代碼4個組成部分。模塊具有三大特征:獨立性、互換性和通用性。1222.1.2模塊化與結構化模塊化設計,簡單地說,就是將產品的某些要素組合在一起,構成一個具有特定功能的、相對獨立的子系統,將這個子系統作為通用模塊與其他產品要素進行多種組合,產生多種不同功能或相同功能、不同性能的系列產品。函數(或方法、過程)是實現軟件模塊化的一個基本手段。1232.1.2模塊化與結構化在模塊設計中,最基本的是算法和數據結構的設計。代碼2.1中只有一個數據結構——算式表示成基本類型符號串,代碼2.2增加了一個存儲算式的數組作為習題。1242.1.2模塊化與結構化如何定義兩個算式相等?如果把算式表示成符號串,計算機語言判定符號串“□2+3=”、“2□+3=”、“2+□3=”和“2+3□=”(其中□表示一個空格)互不相等,“2+3”和“2+3=”不相等。但它們是相同的算式。預處理算式——消除算式符號串中的所有空格。但預處理會占用計算資源。1252.1.2模塊化與結構化圖靈獎獲得者Wirth提出的“結構化程序設計”(StructuredProgramming)的方法,可以簡化為“算法+數據結構=程序”。這種結構化程序設計方法又稱為“自頂向下”或“逐步求精”法。增量迭代方法汲取了這些方法的精華,但有著不同的特點:“增量”是少量可執行程序的功能及每次具體實現增量的過程,而不是從抽象到代碼,可視為“需求分析、概念設計、編碼實現”的微構造過程。1262.2數據結構與算法2.2.1數據結構與算法的關系2.2.2選擇與設計數據結構2.2.3選擇與設計算法1272.2.1數據結構與算法的關系數據結構是計算機存儲、組織數據的方式,指相互之間存在一種或多種特定關系的數據元素的集合。為數據集提供獨立于計算機內存的數據組織,并提供被視為一種抽象的工具來訪問。常見的數據結構,如數組、集合、棧、隊列、堆、樹、圖、散列表等。1282.2.1數據結構與算法的關系算法以一步一步的方式來詳細描述計算機如何將輸入轉化為所要求的輸出的過程。描述算法的方式可以采用自然語言、程序設計語言,也可以兩種語言混合使用。用計算機程序語言實現并在計算機上運行的算法就是程序,它是一個解決實際問題方法的程序語言的指令序列。基本的算法(類型)包括查找、排序、二叉樹的遍歷、圖的遍歷、最短路徑算法。1292.2.1數據結構與算法的關系計算機算法與數據結構密切相關,算法依賴于具體的數據結構,數據結構直接關系到算法的選擇和效率。(1)一種數據結構、一種算法:通常是針對一種特殊的數據結構設計的特殊算法。如,計算樹的高度、樹節點的層級。(2)一種數據結構、多種算法:如,數組,支持的算法如排序、查找、圖類、矩陣類等等。(3)多種數據結構、一種算法:如,折半查找使用數組和二叉樹,也可以使用鏈表。(4)多種數據結構、多種算法:如,數組和二叉樹,基本的算法有遍歷類、查找類、求最大值等。1302.2.1數據結構與算法的關系在程序設計和軟件開發的實踐和理論中,存在過以數據為中心和以操作為中心的開發方法。更多時候,軟件開發者在數據與算法之間尋找均衡的設計方法,同時兼顧數據結構與算法。面向對象的程序設計語言和面向對象開發方法就是綜合了數據與操作,將其封裝成一個軟件實體——對象,完成用戶需求分析、軟件建模與軟件構造。1312.2.2選擇與設計數據結構算式與習題的基本數據結構設計1:把算式理解成具有一定組成元素的結構——兩個運算數、一個加或減法的運算符,以及結果。程序設計風格操作數的命名獨立變量和非獨立變量1322.2.2選擇與設計數據結構一個結構類型是否包含非獨立變量,應該考慮下列因素。①獲取非獨立變量值的難易程度。②使用非獨立變量的頻繁程度。1332.2.2選擇與設計數據結構對于包含算式的習題,自然地選擇數組。數組是有限個同類型元素的有序集合。絕大多數高級程序設計語言都有內置數組。習題Exercise可以定義成以結構體的算式為元素的數組:1342.2.2選擇與設計數據結構設計2:使用一個包含三個成員的數組[operand,operand2,operator]表示算式Equation。語言要求數組成員屬于同一類型,故將算式中的運算符operator定義成整數類型。可以用不同的數值對應不同的運算符,如0表示“加”,1表示“減”。習題Exercise仍然使用數組,可視為一個[50,3]的二維數組。1352.2.2選擇與設計數據結構比較首先,數據結構的設計是否滿足實際問題的需要?是否直接反映了問題本身?第二,數據結構的設計是否容易編程實現?第三,對解決問題的操作是否給予支持?即是否方便算法的設計與實現。第四,設計的質量如何?包括可讀性、易修改性、可擴展性、易維護性等。1362.2.2選擇與設計數據結構1372.2.2選擇與設計數據結構符號串直接顯示了人易讀的形式;節省存儲空間。符號沒有語義(數據類型),需要解析;結構體表示出算式組成的數據類型;節省存儲空間。要用轉換函數才能顯示并輸出一個算式。數組任意表示復雜的算式;容易擴展到兩個、甚至數十個運算符;節省存儲空間。算式成分與數組的位置需要映射;要用轉換函數才能顯示并輸出一個算式。1382.2.2選擇與設計數據結構小結:(1)算式的三種數據結構都能滿足需求。(2)如程序要求擴展或改善,則會要求代碼易讀、結構穩定,才容易理解、修改和擴充。如,檢查算式是否重復,或在習題中查找算式,設計1和2比代碼2.1有明顯優勢。再如,增加乘、除法運算,三種數據結構都不變,代碼2.1的算式輸出不變,但要增加解析操作,從符號串分解出乘和除;設計1和2需要增加乘、除法運算符的顯示方式,而設計2要增加兩個映射(比如3對應乘法)。結論:總體考慮,把算式成分明確表示出來的結構體是目前算式的最佳數據結構。1392.2.2選擇與設計數據結構算法分析與其他數據結構案例隱含要求:不允許出現重復的算式。對于數組,要實現算式比較算法。產生50個算式的習題總共需要的比較次數是:0+1+2+…+49=(0+49)×50/2=1225。產生有正整數n個不同算式的習題,算法的復雜性是O(n2)。“集合”。語言實現了集合的基本操作,包括插入、判定一個元素是否在集合中。而且,集合中元素數量可以動態變化。如此構造一個習題的算法就是線性的。1402.2.3選擇與設計算法1.習題與算式的分離算式與習題是兩個完全不同的數據。算式是具有滿足一定約束條件的組成元素和結構的數據,不是簡單的符號串。習題包含了數目確定的不同的算式,它像一個容器把算式存儲起來。它們的產生方式不同,操作和使用也不相同。1412.2.3選擇與設計算法1.習題與算式的分離把習題和算式明確地從代碼中抽出,并分別用合適的數據結構表示,有助于各自的設計與實現,也能實現不同的算式和習題的任意組合。假設算式有三種數據結構:結構體、一維數組和字符串;習題有4種選擇:一維數組、集合、隊列及不需數據結構(如代碼2.1),則案例程序可以有12種數據結構的組合方式。1422.2.3選擇與設計算法1.習題與算式的分離而且,不僅一個程序的數據結構具有不同的組合方式。如果把數據結構連同對它們的操作也都封裝到一個模塊——最簡單的就是函數,那么,包含了數據與操作的這些函數可以作為程序的模塊使用。可以提高程序的結構性和可維護性,如可以替換相同功能、不同實現的模塊,而不影響程序的功能。1432.2.3選擇與設計算法2.算式產生與其約束條件的分離考慮到程序的可擴展性、可修改性,例如,允許不止一個加法或減法運算,或者將算式數值范圍擴大到500、1000等。分別定義運算數生成函數與約束條件檢測函數,對滿足一定條件的運算數才生成算式。“滿足100以內整數”的條件不僅適合兩個運算數,也適用于其結果。1442.2.3選擇與設計算法3.加減法算式的分離為了能夠產生全加、全減和混合三種類型的習題,應當分別編寫加法算式和減法算式函數,然后隨機地選擇這兩種算式,就能生成混合運算的習題。1452.2.3選擇與設計算法1462.3模塊化設計理論初步2.3.1模塊化原則2.3.2模塊的內聚性2.3.3模塊間的耦合性1472.3.1模塊化原則Meyer提出了5條標準來評價一種設計方法是否定義了有效的模塊系統的能力。(1)模塊可分解性。(2)模塊可組裝性。(3)模塊可理解性。(4)模塊連續性。(5)模塊保護性。1482.3.1模塊化原則模塊的獨立程度可以由兩個定性標準來度量——內聚和耦合。內聚衡量一個模塊內部各個元素之間相互結合的緊密程度;耦合衡量不同模塊彼此間互相依賴(連接)的緊密程度。1492.3.2模塊的內聚性內聚性是對一個模塊內部各個組成元素之間相互結合的緊密程度的度量指標。模塊中組成元素結合得越緊密,模塊的內聚性就越高,模塊的獨立性也就越高。理想的內聚性要求模塊的功能應明確、單一,即一個模塊只做一件事情。1502.3.2模塊的內聚性內聚有如下7種,由弱到強排列如下。(1)偶然內聚(2)邏輯內聚(3)時間內聚(4)過程內聚(5)通信內聚(6)順序內聚(7)功能內聚1512.3.3模塊間的耦合性耦合性是一個模塊與系統內其他模塊及與外部世界的關聯程度的度量。耦合的強弱取決于模塊間接口的復雜性、調用模塊的方式及通過界面傳送數據的多少。在軟件開發中,應該追求盡可能松散耦合的系統。1522.3.3模塊間的耦合性耦合度從低到高可分為7級。非直接耦合數據耦合標記耦合控制耦合外部耦合公共耦合內容耦合1532.3.3模塊間的耦合性耦合是影響軟件復雜程度的一個重要因素。一般而言,應該采取下述設計原則:應盡量使用數據耦合,減少控制耦合,限制外部環境耦合和公共耦合,杜絕內容耦合,降低接口的復雜度。1542.3.3模塊間的耦合性模塊的內聚性和耦合性是兩個相互對立且又密切相關的概念。軟件概要設計的目標是力求增加模塊的內聚,盡量減少模塊間的耦合。在程序結構中,各模塊的內聚程度越高,模塊間的耦合程度就越低。雖然這種關聯不是絕對的,但是,增加內聚比減少耦合更重要,軟件開發者應當把更多的注意力集中到提高模塊的內聚程度。1552.4測試程序IEEE軟件工程標準術語:軟件測試使用人工或自動手段來運行或測定某個系統的過程,目的在于檢測它是否滿足規定的需求或者是否弄清預期結果與實際結果之間的差別。測試是對程序或系統能否完成特定任務建立信心的過程。軟件測試是說明程序是否正確的最基本的一種技術手段。1562.4測試程序執行程序測試時,要考慮下列因素。首先,如何判定程序的運行結果是否滿足了需求?上面列出的需求是否可以判定對錯?其次,如何執行程序測試?是否需要記錄?如何記錄?軟件測試應該盡量詳細、完整地記錄下來。測試執行與記錄可以手工完成,也可以借助軟件工具或框架完成,還可以通過編寫測試代碼完成。第三,需要運行程序多少次才能說明程序正確了?或者說,選擇什么樣的輸入數據、涵蓋了哪些程序范圍就可以說明了程序的正確性?1572.4測試程序2.4.1測試需求2.4.2測試設計與測試用例1582.4.1測試需求由于對用戶需求理解的偏差,要執行軟件測試,實現測試目的,首要任務是要仔細地分析用戶需求和設計,梳理含糊不清、模棱兩可、相互矛盾的需求,明確、細化和羅列出需求,并且將每個需求表示成可以檢測的測試需求。例如,要求運算數的數值范圍是0~100。[0,100]、(0,100)、(0,100]、[0,100)。1592.4.1測試需求有時用戶難以精確地表示需求,需要在使用之后“感覺”到沒有問題了。這就要求程序員具有一定的經驗,與用戶溝通交流、對問題深入理解、良好的軟件設計等能力及對編程語言的掌握程度等,才能開發出滿足用戶要求的軟件。針對軟件開發中用戶需求的不確定性、經常變化等問題,出現了用戶聯合開發方法(JointApplicationDevelopment,JAD)。特別地,敏捷開發方法要求客戶參與軟件開發。1602.4.1測試需求其次,測試需求要求程序的預期結果和實際運行結果都要明確、合理、可觀察并可比較。案例要求50道算式的需求非常明確。1612.4.1測試需求為了測試程序是否包含某個算式,一定要運行整個程序嗎?如同采用分解和模塊化技術,分而治之地解決一個較大問題的軟件開發,分解也同樣適用于軟件測試。為了方便、快速地檢測一個用戶需求或者特定功能是否得到滿足,可以針對性地設計測試,或者測試程序的一部分。一種策略是分析用戶需求,把它細化成一個個具體的、獨立的、功能單一的測試需求。1622.4.1測試需求將代碼2.1的測試需求分解如下:(1)程序是否能正確地產生滿足條件的加法算式?(確定的程序)(2)程序是否能正確地產生滿足條件的減法算式?(確定的程序)(3)程序是否能正確地產生滿足條件的加法或減法算式?(隨機性)(4)進一步,還可以繼續分解成如下的測試需求:程序是否產生了[0..100]范圍的值,或者[1,100]范圍的值,或者(0,100)范圍的值?1632.4.2測試設計與測試用例測試設計不同于測試用例設計。測試設計的內容包含設計測試用例,此外還包括決定是否實施所有層次的測試、是否采用測試工具或自動化測試框架、哪些測試采用哪些工具、如何組織人員進行測試等。IEEE,測試用例是一組輸入、運行條件和通過/失敗準則。簡單地說,測試用例是一組測試數據和預期結果。1642.4.2測試設計與測試用例程序的運行結果分為三類:產生的值。如局部觀察的輸出(數值、文字、圖片、聲音等)或者操作、存儲的輸出。狀態變化。如程序的狀態變化、數據庫的狀態變化。必須一起解釋為輸出才有效的一個序列或一組值。測試用例設計的核心就是設計測試輸入,即測試數據。1652.4.2測試設計與測試用例【例2.1】一個生成整數減法的程序,輸入是兩個整數,要求輸出它們的差,結果不能為負數。1662.4.2測試設計與測試用例對每個測試用例,將程序運行結果與預期結果比較。若相等,表示待測程序“通過”了測試數據;若不相等,表示待測程序未通過測試數據,即測試“失敗”。可能出現其他情況,沒有執行所有的測試用例,比如因某個測試數據導致待測程序沒能運行完而退出,或者程序異常退出,或者用戶中斷程序運行等。1672.4.2測試設計與測試用例測試結果的判定可能會存在誤判和漏判。由于測試數據或預期結果的錯誤而導致顯示待測程序可能有誤,稱為測試誤判。如果待測程序有錯,而測試沒有發現錯誤,稱為測試漏判。如何減少漏判,即如何通過測試發現程序中存在錯誤,實際上就是如何設計測試和測試數據,使得待測程序不能通過一些測試用例。理論上,測試不能證明程序沒有錯誤,而是通過測試發現錯誤,提高程序正確性。1682.4.2測試設計與測試用例待測程序使用測試用例的三種方式①每次從鍵盤輸入一個測試數據,觀察測試結果并和預期值比較,記錄測試通過與否;②通過編寫測試程序,先存儲測試用例,然后讓待測程序逐個讀取測試數據、運行、比較預期結果,同時記錄測試結果;③使用測試工具完成測試程序的操作及其他更多操作。1692.5調試程序當程序不能編譯運行,或者測試發現了錯誤,程序員要理解程序的行為,發現可能的錯誤并去除它,這個過程稱為調試。調試是軟件開發的重要活動,是程序員必須熟練掌握的軟件開發技術。2.5.1缺陷的相關術語2.5.2調試基礎1702.5.1缺陷的相關術語軟件Bug即缺陷(Defect),是軟件產品中所存在的問題,最終表現為用戶需求沒有完全實現。從產品內部看,軟件缺陷是軟件產品開發或維護過程中所存在的錯誤、毛病等各種問題。從外部看,軟件缺陷是系統所需要實現的某種功能的失效或違背。1712.5.1缺陷的相關術語缺陷源自人的過失(Mistake)活動產生的不正確結果。過失活動包括誤解、遺漏用戶需求、設計不合理等。引起故障的原因是程序中不正確的步驟、過程或數據定義,是過失發展的結果,它們可能導致軟件失效(Failure)。1722.5.1缺陷的相關術語所謂錯誤(Error)就是導致不正確結果的全部。它展示了某個故障的不正確的內部狀態。可以理解Bug是程序中引起錯誤的具體位置,因此,debug就是找出并更改程序中的錯誤。1732.5.2調試基礎1.科學的調試過程調試是根據程序的出錯情況,分析、猜測可能出現錯誤的程序區域,讓程序運行,觀察程序的變化來發現錯誤的根源。調試的基本活動包括隔離、定位和更正錯誤。1742.5.2調試基礎2.定位程序缺陷最簡單的調試技術是在要觀察的語句前后添加各種類型的打印語句。如簡單打印“執行到此”——調試時可以看到程序是否執行了某條語句或執行到某語句;或者打印一個或一組變量的值,觀察變量值的變化。1752.5.2調試基礎3.更改缺陷調試中確定錯誤位置是最困難的任務,修改程序相對容易。然而,容易的事情有時也容易出錯。一項研究發現,第一次更正缺陷具有50%的可能性出錯。1762.6案例分析與實踐2.6.1案例程序的初始構造2.6.2無相同算式的基礎構造2.6.3編程實現測試1772.6.1案例程序的初始構造對故事1程序的構造程序1:生成50道100以內加法/減法算式的習題,并輸出。分析首先,如何產生100以內的隨機數?隨機數生成函數,隨機產生一定范圍的值。其次,如何表示一個算式?采用什么樣的數據結構?字符串、結構體、數組。1782.6.1案例程序的初始構造構造模塊化技術設計程序,分別產生加法習題和減法習題。程序起名為口算練習產生器。減generateExerciseOfSubstactEquations1792.6.1案例程序的初始構造1802.6.1案例程序的初始構造故事2100以上的數和負數。(1)每個算式還需要答案;(新增)(2)加法算式的和不能超過100;(隱含)(3)減法算式的差不能小于0;(隱含)(4)每行整齊地多顯示幾個算式。(更改)1812.6.1案例程序的初始構造分析首先,如何處理每個算式的答案?其次,除了每個運算數有100以內的約束條件外,還要約束它們的運算結果(n+m<100和n?m>0或n>m)。最后,由于是50個題目,每行顯示5個算式,正好10行顯示完。1822.6.1案例程序的初始構造構造1832.6.2無相同算式的基礎構造構造任務2:生成50道100以內加減法算式的混合習題,題中不能有相同的算式。故事3有些題的答案一樣、眼熟。加法和減法都有的題目。分析如何讓神器生成沒有重復算式的習題。練習中要有加法和減法的算式。1842.6.2無相同算式的基礎構造構造函數表示分解出的、相對獨立的代碼,如增加了算式生產的模塊,循環調用來構造習題。采用了較好的編程風格,如使用名稱常量。程序結構詳見課本。1852.6.3編程實現測試現代軟件開發的一個最佳實踐是,程序員自己編寫測試程序,記錄下測試數據、測試過程及結果分析。編寫測試程序具有以下顯著優點。(1)測試有助于編寫正確的程序。(2)測試有助于提高程序質量。(3)測試是程序的重要文檔。(4)測試提高了復用。1862.6.3編程實現測試如何編寫測試程序?它的基本結構如何?1.可選的編程測試任務簡單的不測,如算式的字符串顯示asString;用戶認可就行,很難說對錯,不測,如整齊的輸出格式;整個程序的核心函數,對程序能否使用起到關鍵作用,必須測試,例如,算式的產生、是否滿足條件、答案是否正確、能否查出重復的算式。1872.6.3編程實現測試測試程序的基本組成如下。①建立測試環境,包括初始化測試用例、初始化統計變量;②執行測試,即把每個測試數據作為參數傳入待測程序、運行,比較實際運行結果與預期結果,給出測試通過與否的判定,計算“通過”、“失敗”及“未運行”等其他的測試數;③處理測試結果:主要是統計、分析測試結果,并將其顯示、存儲。1882.6.3編程實現測試2.測試代碼與待測代碼同源編寫測試代碼時也要遵循模塊化原則。首先將測試代碼與產品代碼分離,測試代碼調用產品代碼,但產品代碼獨立運行。其次,運用模塊化適當分解測試代碼,使每個模塊的功能單一、容易復用。如,可以將測試代碼劃分為:生成測試數據,讀取測試數據,執行測試、判斷并記錄測試結果,統計和分析測試結果,存儲、顯示測試結果分析。1892.6.3編程實現測試(1)選擇好的測試數據很重要。(2)一次測試,手工執行測試較快,但容易忘記測試了什么、結果如何,也不能反復使用測試數據。(3)測試在程序大致可以運行后再進行。(4)程序的質量屬性——可測性;同時,一定要像編寫應用程序那樣編寫測試程序。(5)編寫測試代碼可能比要測試的代碼還要多!有工具輔助完成測試更好。1902.7討論與提高編寫好程序的三個方面。①簡介質量的概念——什么是好程序;②測試基礎和設計——如何說明好程序;③編程風格

溫馨提示

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

評論

0/150

提交評論