基于案例的軟件構(gòu)造教程第2版全套教學(xué)課件_第1頁
基于案例的軟件構(gòu)造教程第2版全套教學(xué)課件_第2頁
基于案例的軟件構(gòu)造教程第2版全套教學(xué)課件_第3頁
基于案例的軟件構(gòu)造教程第2版全套教學(xué)課件_第4頁
基于案例的軟件構(gòu)造教程第2版全套教學(xué)課件_第5頁
已閱讀5頁,還剩816頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

軟件構(gòu)造

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

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

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論