版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
?PAGE20?UML系統(tǒng)建?;A(chǔ)教程?PAGE21?第1章面向?qū)ο笤O(shè)計(jì)第1章面向?qū)ο笤O(shè)計(jì)面向?qū)ο蠹夹g(shù)現(xiàn)在已經(jīng)逐漸取代了傳統(tǒng)的技術(shù),成為當(dāng)今計(jì)算機(jī)軟件工程學(xué)中的主要開發(fā)技術(shù),隨著面向?qū)ο蠹夹g(shù)的不斷發(fā)展,越來越多的軟件開發(fā)人員加入到了它的陣營之中。面向?qū)ο蠹夹g(shù)之所以會(huì)為廣大的軟件開發(fā)人員青睞,是由于它作為一種先進(jìn)的設(shè)計(jì)和構(gòu)造軟件的技術(shù),使計(jì)算機(jī)以更符合人的思維方式去解決一系列的編程問題。使用面向?qū)ο蠹夹g(shù)編寫的程序極大地提高了代碼復(fù)用程度和可擴(kuò)展性,使得編程效率也得到了極大的提高,同時(shí)減少了軟件維護(hù)的代價(jià)。面向?qū)ο蠹夹g(shù)發(fā)展的重大成果之一就是出現(xiàn)了統(tǒng)一建模語言(UML)。UML是面向?qū)ο蠹夹g(shù)領(lǐng)域內(nèi)占主導(dǎo)地位的標(biāo)準(zhǔn)建模語言,它統(tǒng)一了過去相互獨(dú)立的數(shù)十種面向?qū)ο蟮慕UZ言共同存在的局面,通過統(tǒng)一語義和符號(hào)表示,系統(tǒng)地對(duì)軟件工程進(jìn)行描述、構(gòu)造,形成了一個(gè)統(tǒng)一的、公共的、具有廣泛適用性的建模語言。1.1面向?qū)ο笏枷氲幕靖拍蠲嫦驅(qū)ο蠛瓦^去的軟件開發(fā)技術(shù)完全不同,是一種全新的軟件開發(fā)技術(shù)。面向?qū)ο蟮母拍顝膯柺赖浆F(xiàn)在,它已經(jīng)發(fā)展成為一種相對(duì)成熟的編程思想,并且逐步成為軟件開發(fā)領(lǐng)域的主流技術(shù)。面向?qū)ο蟮某绦蛟O(shè)計(jì)(Object-OrientedProgramming,OOP)旨在創(chuàng)建軟件重用代碼,具備更好的模擬現(xiàn)實(shí)世界環(huán)境的能力,這使它被公認(rèn)為是自上而下編程的最佳選擇。它通過給程序中加入擴(kuò)展語句,把函數(shù)“封裝”進(jìn)編程所必需的“對(duì)象”中。面向?qū)ο蟮木幊陶Z言使得復(fù)雜的工作條理清晰、編寫容易。說它是一場(chǎng)革命,不是對(duì)對(duì)象本身而言,而是對(duì)它們處理工作的能力而言。1.1.1什么叫面向?qū)ο竺嫦驅(qū)ο蠹夹g(shù)是一種以對(duì)象為基礎(chǔ),以事件或消息來驅(qū)動(dòng)對(duì)象執(zhí)行處理的程序設(shè)計(jì)技術(shù)。從程序設(shè)計(jì)方法上來講,它是一種自下而上的程序設(shè)計(jì)方法,它不像面向過程程序設(shè)計(jì)那樣一開始就需要使用一個(gè)主函數(shù)來概括出整個(gè)程序,面向?qū)ο蟪绦蛟O(shè)計(jì)往往從問題的一部分著手,一點(diǎn)一點(diǎn)地構(gòu)建出整個(gè)程序。面向?qū)ο笤O(shè)計(jì)是以數(shù)據(jù)為中心,使用類作為表現(xiàn)數(shù)據(jù)的工具,類是劃分程序的基本單位。而函數(shù)在面向?qū)ο笤O(shè)計(jì)中成了類的接口。以數(shù)據(jù)為中心而不是以功能為中心來描述系統(tǒng),相對(duì)來講,更能使程序具有穩(wěn)定性。它將數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝到一起,作為一個(gè)整體進(jìn)行處理,并且采用數(shù)據(jù)抽象和信息隱藏技術(shù),最終將其抽象成一種新的數(shù)據(jù)類型類 類與類之間的聯(lián)系以及類的重用出現(xiàn)了類的繼承、多態(tài)等特性。類的集成度越高,越適合大型應(yīng)用程序的開發(fā)。另外,面向?qū)ο蟪绦虻目刂屏鞒踢\(yùn)行時(shí)是由事件進(jìn)行驅(qū)動(dòng)的,而不再由預(yù)定的順序進(jìn)行執(zhí)行。事件驅(qū)動(dòng)程序的執(zhí)行圍繞消息的產(chǎn)生與處理,靠消息的循環(huán)機(jī)制來實(shí)現(xiàn)。更加重要的是,我們可以利用不斷成熟的各種框架,比如.NET的.NETFramework等,在實(shí)際的編程過程中,使用這些框架能夠迅速地將程序構(gòu)建起來。面向?qū)ο蟮某绦蛟O(shè)計(jì)方法還能夠使程序的結(jié)構(gòu)清晰簡單,能夠大大提高代碼的重用性,有效地減少程序的維護(hù)量,提高軟件的開發(fā)效率。在結(jié)構(gòu)上,面向?qū)ο蟪绦蛟O(shè)計(jì)和結(jié)構(gòu)化程序設(shè)計(jì)也有很大的不同。結(jié)構(gòu)化程序設(shè)計(jì)首先應(yīng)該確定的是程序的流程怎樣走,函數(shù)間的調(diào)用關(guān)系怎樣,也就是函數(shù)間的依賴關(guān)系是什么。一個(gè)主函數(shù)依賴于其子函數(shù),這些子函數(shù)又依賴于更小的子函數(shù),而在程序中,越小的函數(shù)處理的往往是細(xì)節(jié)的實(shí)現(xiàn),這些具體的實(shí)現(xiàn)又常常變化。這樣的結(jié)果,就使程序的核心邏輯依賴于外延的細(xì)節(jié),程序中本來應(yīng)該是比較穩(wěn)定的核心邏輯,也因?yàn)橐蕾囉谝鬃兓牟糠?,而變得不穩(wěn)定起來,一個(gè)細(xì)節(jié)上的小小改動(dòng),也有可能在依賴關(guān)系上引發(fā)一系列變動(dòng)。可以說這種依賴關(guān)系也是過程式設(shè)計(jì)不能很好處理變化的原因之一,而一個(gè)合理的依賴關(guān)系,應(yīng)該是倒過來的,由細(xì)節(jié)的實(shí)現(xiàn)依賴于核心邏輯才對(duì)。而面向?qū)ο蟪绦蛟O(shè)計(jì)是由類的定義和類的使用兩部分組成的,主程序中定義數(shù)個(gè)對(duì)象并規(guī)定它們之間消息傳遞的方式,程序中的一切操作都是通過面向?qū)ο蟮陌l(fā)送消息機(jī)制來實(shí)現(xiàn)的。對(duì)象接收到消息后,啟動(dòng)消息處理函數(shù)完成相應(yīng)的操作。這里以常見的學(xué)生管理系統(tǒng)為例,我們使用結(jié)構(gòu)化程序設(shè)計(jì)方法的時(shí)候,首先在主函數(shù)中確定學(xué)生管理要做哪些事情,分別使用函數(shù)將這些事情表示出來,使用一個(gè)分支選擇程序進(jìn)行選擇,然后再將這些函數(shù)進(jìn)行細(xì)化實(shí)現(xiàn),確定調(diào)用的流程等。而使用面向?qū)ο蠹夹g(shù)來實(shí)現(xiàn)學(xué)生管理系統(tǒng),對(duì)于該系統(tǒng)中的學(xué)生,則先要定義學(xué)生的主要屬性,比如說學(xué)號(hào)、院系等,要對(duì)學(xué)生做什么操作,比如說查詢學(xué)生信息、修改學(xué)生信息等。并且把這些當(dāng)成一個(gè)整體進(jìn)行對(duì)待,形成一個(gè)類,即學(xué)生類。使用這個(gè)類,我們可以創(chuàng)建不同的學(xué)生實(shí)例,也就是創(chuàng)建許多具體的學(xué)生模型,每個(gè)學(xué)生擁有不同的學(xué)號(hào),一些學(xué)生會(huì)在不同的院系。學(xué)生類中的數(shù)據(jù)和操作都是給應(yīng)用程序共享的,我們可以在學(xué)生類的基礎(chǔ)上派生出中文系學(xué)生類、計(jì)算機(jī)系學(xué)生類、金融系學(xué)生類等,這樣就可以實(shí)現(xiàn)代碼的重用。1.1.2對(duì)象對(duì)象(Object)是面向?qū)ο?Object-Oriented,簡稱OO)系統(tǒng)的基本構(gòu)造塊,是一些相關(guān)變量和方法的軟件集。對(duì)象經(jīng)常用于建立現(xiàn)實(shí)世界中我們身邊的一些對(duì)象的模型。對(duì)象是理解面向?qū)ο蠹夹g(shù)的關(guān)鍵。我們可以看看現(xiàn)實(shí)生活中的對(duì)象,比如我們使用的手機(jī)、電腦和打印機(jī)等。我們可以認(rèn)為萬物皆是對(duì)象。根據(jù)《韋氏大詞典》(Merriam-Webster’sCollegiateDictionary)的詞典釋義,對(duì)象有如下兩點(diǎn)釋義。某種可為人感知的事物;思維、感覺或動(dòng)作所能作用的物質(zhì)或精神體。該釋義的第一部分“某種可為人感知的事物”所指的便是我們熟悉的“對(duì)象”,它是可以看到和感知到的“東西”,而且可以占據(jù)一定事物的空間。這個(gè)釋義或許讓我們感覺這是在上政治課,接下來讓我們以學(xué)生管理系統(tǒng)為例,解釋一下這個(gè)釋義的第一部分。我們想象一下學(xué)生管理系統(tǒng)中圍繞學(xué)生管理這個(gè)概念中應(yīng)該有哪些物理對(duì)象。被管理的信息所屬的對(duì)象學(xué)生;對(duì)學(xué)生信息進(jìn)行管理的管理員;對(duì)學(xué)生信息有權(quán)進(jìn)行查詢的校方人員;管理信息的電腦,以及需要在電腦中存儲(chǔ)的學(xué)生信息?;蛟S以上所列舉的還不夠。我們也可能在這個(gè)地方找到了很多的對(duì)象,但是它們并不都是所要?jiǎng)?chuàng)建的學(xué)生管理系統(tǒng)所必需的,不過我們不用擔(dān)心這個(gè),在后面的章節(jié)使用用例進(jìn)行需求分析的時(shí)候,我們會(huì)進(jìn)行詳細(xì)的講解。釋義的第二部分是“思維、感覺或動(dòng)作所能作用的物質(zhì)或精神體”,也就是我們所說的“概念性對(duì)象”,以學(xué)生管理系統(tǒng)為例,可以列舉出如下一些。學(xué)生所在的院系;學(xué)生的學(xué)號(hào);學(xué)生的班級(jí);學(xué)生的成績。在這里也可以列舉出不少這樣的概念性對(duì)象。這些對(duì)象是人們不能看到的、聽到的,但是在描述抽象模型時(shí)和物理對(duì)象時(shí),仍然起著很重要的作用。軟件對(duì)象可以這樣定義:所謂軟件對(duì)象,是一種將狀態(tài)和行為有機(jī)地結(jié)合起來而形成的軟件構(gòu)造模型,它可以用來描述現(xiàn)實(shí)世界中的一個(gè)對(duì)象。也就是說軟件對(duì)象實(shí)際上就是現(xiàn)實(shí)世界對(duì)象的模型,它有狀態(tài)和行為。一個(gè)軟件對(duì)象可以利用一個(gè)或者多個(gè)變量來標(biāo)識(shí)它的狀態(tài)。變量是由用戶標(biāo)識(shí)符來命名的數(shù)據(jù)項(xiàng)。軟件對(duì)象可以利用它的方法來執(zhí)行它的行為。方法是與對(duì)象相關(guān)聯(lián)的函數(shù)(子程序)。我們可以利用軟件對(duì)象來代表現(xiàn)實(shí)世界中的對(duì)象。例如,用一個(gè)飛行試駕程序來代表現(xiàn)實(shí)世界中正在飛行的飛機(jī),或者用機(jī)床數(shù)控程序來代表現(xiàn)實(shí)世界中運(yùn)行的機(jī)床。同樣也可以使用軟件對(duì)象來表示抽象的概念,比如,點(diǎn)擊按鈕事件就是一個(gè)用在GUI窗口系統(tǒng)的公共對(duì)象,它可以代表用戶點(diǎn)擊程序界面中確定按鈕的動(dòng)作。1.1.3類類(Class)是具有相同屬性和操作的一組對(duì)象的組合,也就是說,抽象模型中的“類”描述了一組相似對(duì)象的共同特征,為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述。例如,名為“學(xué)生”的類被用于描述為被學(xué)生管理系統(tǒng)管理的學(xué)生對(duì)象。類的定義要包含以下要素。定義該類對(duì)象的數(shù)據(jù)結(jié)構(gòu)(屬性的名稱和類型);類的對(duì)象在系統(tǒng)中所需要執(zhí)行的各種操作,比如對(duì)數(shù)據(jù)庫的操作。類是對(duì)象集合的再抽象,類與對(duì)象的關(guān)系如同一個(gè)模具和使用這個(gè)模具澆注出來的鑄件一樣,類是創(chuàng)建軟件對(duì)象的模板一種模型。類給出了屬于該類的全部對(duì)象的抽象定義,而對(duì)象是符合這種定義的一個(gè)實(shí)體。類的用途有如下兩點(diǎn)。在內(nèi)存中開辟一個(gè)數(shù)據(jù)區(qū),存儲(chǔ)新對(duì)象的屬性。把一系列行為和對(duì)象關(guān)聯(lián)起來。一個(gè)對(duì)象又被稱作類的一個(gè)實(shí)例,也稱為實(shí)體化(Instantiation)。術(shù)語“實(shí)體化(Instantiation)”是指對(duì)象在類聲明的基礎(chǔ)上創(chuàng)建的過程。比如說,我們聲明了一個(gè)“學(xué)生”類,我們可以在這個(gè)基礎(chǔ)上創(chuàng)建“一個(gè)姓名叫李剛的學(xué)生”這個(gè)對(duì)象。類的確定和劃分沒有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)和方法,基本上依賴于設(shè)計(jì)人員的經(jīng)驗(yàn)、技巧以及對(duì)實(shí)際項(xiàng)目中問題的把握。通常的標(biāo)準(zhǔn)是“尋求共性、抓住特性”,即在一個(gè)大的系統(tǒng)環(huán)境中,尋求事物的共性,將具有共性的事物用一個(gè)類進(jìn)行表述,在用具體的程序?qū)崿F(xiàn)時(shí),具體到某一個(gè)對(duì)象,要抓住對(duì)象的特性。確定一個(gè)類的步驟通常包含以下方面。(1)確定系統(tǒng)的范圍,如學(xué)生管理系統(tǒng),需要確定一下與學(xué)生管理相關(guān)的內(nèi)容。(2)在系統(tǒng)范圍內(nèi)尋找對(duì)象,該對(duì)象通常具有一個(gè)和多個(gè)類似的事物。比如,在學(xué)生管理中,某院系有一個(gè)名叫李剛的學(xué)生,而另一個(gè)院系名叫王芳的人是和李剛類似的,都是學(xué)生。(3)將對(duì)象抽象成為一個(gè)類,按照上面類的定義,確定類的數(shù)據(jù)和操作。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類和對(duì)象的確定非常重要,是軟件開發(fā)的第一步,軟件開發(fā)中類和對(duì)象的確定直接影響到軟件的質(zhì)量。如果劃分得當(dāng),對(duì)于軟件的維護(hù)與擴(kuò)充以及體現(xiàn)軟件的重用性方面,都非常重要。1.1.4消息與事件當(dāng)使用某一個(gè)系統(tǒng)的時(shí)候,我們點(diǎn)擊鼠標(biāo)的左鍵,通常會(huì)顯示相應(yīng)的信息。以學(xué)生管理系統(tǒng)為例,通過鼠標(biāo)點(diǎn)擊“學(xué)生管理系統(tǒng)”界面某菜單的時(shí)候,會(huì)顯示出當(dāng)前的操作人所需要的信息。那么當(dāng)前的程序是如何運(yùn)行的呢?(1)“學(xué)生管理系統(tǒng)”界面的某一個(gè)菜單項(xiàng)發(fā)送鼠標(biāo)點(diǎn)擊事件給相應(yīng)的對(duì)象一個(gè)消息。(2)對(duì)象接收到消息后有所反應(yīng),把操作者需要的信息顯示在界面。(3)界面將相關(guān)信息顯示出來,完成任務(wù)??梢钥吹贸觯谶@個(gè)過程中,我們首先要觸發(fā)一個(gè)事件,然后發(fā)送消息,那么消息是什么呢?所謂消息(Message),是指描述事件發(fā)生的信息,是對(duì)象間相互聯(lián)系和相互作用的方式。一個(gè)消息主要由五部分組成:消息的發(fā)送對(duì)象、消息的接收對(duì)象、消息的傳遞方式、消息內(nèi)容(參數(shù))、消息的返回。傳入消息內(nèi)容的目的有兩個(gè),一個(gè)是讓接收請(qǐng)求的對(duì)象獲取執(zhí)行任務(wù)的相關(guān)信息,另一個(gè)是行為指令。那么什么是事件呢?所謂事件,通常是指一種由系統(tǒng)預(yù)先定義而由用戶或系統(tǒng)發(fā)出的動(dòng)作。事件作用于對(duì)象,對(duì)象識(shí)別事件并作出相應(yīng)的反應(yīng)。與對(duì)象的方法集可以無限擴(kuò)展不同,事件的集合通常是固定的,用戶不能隨便定義新的事件。但是現(xiàn)代高級(jí)語言中可以通過一些其他技術(shù)在類中加入事件。我們通常所熟悉的一些事件,比如Click,鼠標(biāo)左鍵單擊對(duì)象時(shí)發(fā)生的事件;Load,當(dāng)界面被加載到內(nèi)存中時(shí)發(fā)生的事件等。對(duì)象通過對(duì)外提供的方法在系統(tǒng)中發(fā)揮自己的作用,當(dāng)系統(tǒng)中的其他對(duì)象請(qǐng)求這個(gè)對(duì)象執(zhí)行某個(gè)方法時(shí),就向該對(duì)象發(fā)送一個(gè)消息,對(duì)象響應(yīng)這個(gè)請(qǐng)求,完成指定的操作。程序的執(zhí)行取決于事件發(fā)生的順序,由順序產(chǎn)生的消息來驅(qū)動(dòng)程序的執(zhí)行,而不必預(yù)先確定消息產(chǎn)生的順序。1.2面向?qū)ο蟮娜笠胤庋b、繼承、多態(tài)是面向?qū)ο蟪绦虻娜筇卣?,這些特征保證了程序的安全性、可靠性、可重用性和易維護(hù)性。隨著技術(shù)的發(fā)展,把這些思想用于硬件、數(shù)據(jù)庫、人工智能技術(shù)、分布式計(jì)算、網(wǎng)絡(luò)、操作系統(tǒng)等領(lǐng)域,越來越顯示出其優(yōu)越性。1.2.1封裝封裝(Encapsulation)就是把對(duì)象的狀態(tài)和行為綁到一起的機(jī)制,使對(duì)象形成一個(gè)獨(dú)立的整體,并且盡可能地隱藏對(duì)象的內(nèi)部細(xì)節(jié)。封裝有兩個(gè)含義:一是把對(duì)象的全部狀態(tài)和行為結(jié)合在一起,形成一個(gè)不可分割的整體。對(duì)象的私有屬性只能夠由對(duì)象的行為來修改和讀取。二是盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié),與外界的聯(lián)系只能夠通過外部接口來實(shí)現(xiàn)。封裝的信息屏蔽作用反映了事物的相對(duì)獨(dú)立性,我們可以只關(guān)心它對(duì)外所提供的接口,即能夠提供什么樣的服務(wù),而不用去關(guān)注其內(nèi)部的細(xì)節(jié)問題。比如說使用手機(jī),我們關(guān)注的通常是這個(gè)手機(jī)能實(shí)現(xiàn)什么功能,而不太會(huì)去關(guān)心這個(gè)手機(jī)是怎么一步步制造出來的。封裝的結(jié)果使對(duì)象以外的部分不能隨意更改對(duì)象的內(nèi)部屬性或狀態(tài),如果需要更改對(duì)象內(nèi)部的屬性或狀態(tài),則需要通過公共訪問控制器來進(jìn)行。通過公共訪問控制器來限制對(duì)象的私有屬性,有以下好處。避免對(duì)封裝數(shù)據(jù)的未授權(quán)訪問。當(dāng)對(duì)象為維護(hù)一些信息,并且這些信息比較重要,不能夠隨便向外界傳遞,這個(gè)時(shí)候,只需要將這些信息屬性設(shè)置為私有的即可。幫助保護(hù)數(shù)據(jù)的完整性。當(dāng)對(duì)象的屬性設(shè)置為公共訪問的時(shí)候,代碼可以不經(jīng)過對(duì)象所屬類希望遵循的業(yè)務(wù)流程而去修改對(duì)象的值,對(duì)象很容易失去對(duì)其數(shù)據(jù)的控制。我們可以通過訪問控制器來修改私有屬性的值,并且在賦值或取值的時(shí)候檢查屬性值的正確與否。當(dāng)類的私有方法必須修改時(shí),限制了對(duì)整個(gè)應(yīng)用程序內(nèi)的影響。當(dāng)對(duì)象采用一個(gè)公共的屬性去暴露的時(shí)候,我們知道,甚至修改一下這個(gè)公共屬性的名稱,程序都需要修改這個(gè)公共屬性被調(diào)用的地方。但是,通過私有的方式就能夠縮小其影響的范圍,將程序的影響范圍縮小到一個(gè)類中。比如說我們房子就是一個(gè)類的實(shí)例,室內(nèi)的裝飾和擺設(shè)只能被室內(nèi)的居住者欣賞和使用,如果沒有四面墻的遮擋,室內(nèi)的所有活動(dòng)在外人面前將一覽無遺。由于有了封裝,房屋內(nèi)的所有擺設(shè)都可以隨意改變且不影響他人,然而,如果沒有門窗,即使它的空間再寬闊,也沒有實(shí)用的價(jià)值。房屋的門窗,就是封裝對(duì)象暴露在外的屬性和方法,專供人進(jìn)出,以及空氣流通和帶來陽光。但是在實(shí)際項(xiàng)目中,如果一味地強(qiáng)調(diào)封裝,對(duì)象的任何屬性都不允許外部直接讀取,反而會(huì)增加許多無意義的操作,為編程增加負(fù)擔(dān)。為避免這一點(diǎn),在語言的具體使用過程中,應(yīng)該根據(jù)需要和具體情況,來決定對(duì)象屬性的可見性。1.2.2繼承對(duì)于客觀事物的認(rèn)知,既應(yīng)當(dāng)看到其共性,也應(yīng)該看到其特性。如果只考慮事物的共性,不考慮事物的特性,就不能反映出客觀世界中事物之間的層次關(guān)系,從而不能完整地、正確地對(duì)客觀世界進(jìn)行抽象的描述。如果說運(yùn)用抽象的原則就是舍棄對(duì)象的特性,提取其共性,從而得到適合一個(gè)對(duì)象集的類的話,那么在這個(gè)類的基礎(chǔ)上,再重新考慮抽象過程中被舍棄的那一部分對(duì)象的特性,則可以形成一個(gè)新的類,這個(gè)類具有前一個(gè)類的全部特征,是前一個(gè)類的子集,從而形成一種層次結(jié)構(gòu),即繼承結(jié)構(gòu)。以動(dòng)物為例,可以分為哺乳動(dòng)物、爬行動(dòng)物、兩棲動(dòng)物和鳥類等,我們通過抽象的方式實(shí)現(xiàn)一個(gè)動(dòng)物類以后,可以通過繼承的方式分別實(shí)現(xiàn)哺乳動(dòng)物、爬行動(dòng)物、兩棲動(dòng)物、鳥類等類,并且這些類包含動(dòng)物的特性,圖1-1展示了這樣一個(gè)繼承的結(jié)構(gòu)。圖11動(dòng)物類繼承結(jié)構(gòu)示例繼承(Inheritance)是一種連接類與類之間的層次模型。繼承是指特殊類的對(duì)象擁有其一般類的屬性和行為。繼承意味著“自動(dòng)地?fù)碛小保丛谔厥忸愔胁槐刂匦聦?duì)已經(jīng)在一般類中定義過的屬性和行為進(jìn)行定義,而是自動(dòng)地、隱含地?fù)碛衅湟话泐惖膶傩院托袨?。繼承對(duì)類的重用性提供了一種明確表述共性的方法。即一個(gè)特殊類既有自己定義的屬性和行為,又有繼承下來的屬性和行為。盡管繼承下來的屬性和行為在特殊類中是隱式的,但無論在概念上還是在實(shí)際效果上,都是這個(gè)類的屬性和行為。繼承是傳遞的,當(dāng)這個(gè)特殊類被它更下層的特殊類繼承的時(shí)候,它繼承來的和自己定義的屬性和行為又被下一層的特殊類繼承下去。我們有時(shí)把一般類稱為基類,把特殊類稱為派生類。繼承在面向?qū)ο筌浖_發(fā)過程中,有其強(qiáng)有力和獨(dú)特的一面,通過繼承可以實(shí)現(xiàn)以下幾點(diǎn)。使派生類能夠比不使用繼承直接進(jìn)行描述的類更加簡潔。派生類只需要描述那些與基類不相同的地方、特殊的地方,且把這些添加到類中然后繼承就可以了。不使用繼承而去直接描述,需要將基類的屬性和行為全部進(jìn)行描述一遍。能夠重用和擴(kuò)展現(xiàn)有類庫資源。當(dāng)我們使用已經(jīng)封裝好的類庫的時(shí)候,如果需要對(duì)某個(gè)類進(jìn)行擴(kuò)展,通過繼承的方式很容易實(shí)現(xiàn),而不需要再重新編寫,并且擴(kuò)展一個(gè)類的時(shí)候并不需要其源代碼。使軟件易于維護(hù)和修改。當(dāng)要修改或增加某一屬性或行為時(shí),只需要在相應(yīng)的類中進(jìn)行改動(dòng),而它派生的所有類全都自動(dòng)地、隱含地做了相應(yīng)的修改。在軟件開發(fā)過程中,繼承性實(shí)現(xiàn)了軟件模塊的可重用性、獨(dú)立性,縮短了開發(fā)的周期,提高了軟件的開發(fā)效率,同時(shí)使軟件易于維護(hù)和修改。繼承是對(duì)客觀世界的直接反映,通過類的繼承,能夠?qū)崿F(xiàn)對(duì)問題的深入抽象的描述,也反映出人類認(rèn)知問題的發(fā)展過程。多態(tài)多態(tài)是指兩個(gè)或多個(gè)屬于不同類的對(duì)象對(duì)于同一個(gè)消息或方法調(diào)用所做出不同響應(yīng)的能力。面向?qū)ο笤O(shè)計(jì)也借鑒了客觀世界的多態(tài)性,體現(xiàn)在不同的對(duì)象可以根據(jù)相同的消息產(chǎn)生各自不同的動(dòng)作。例如,我們?cè)凇皠?dòng)物”基類中定義了“進(jìn)食”這個(gè)行為,派生類“貓”和“狗”都繼承了動(dòng)物類的進(jìn)食行為,但其進(jìn)食的事物卻不一定相同,貓喜歡吃魚,而狗喜歡啃骨頭。這樣一個(gè)進(jìn)食的消息發(fā)出以后,貓類和狗類的對(duì)象接收到這個(gè)消息后各自執(zhí)行不同的進(jìn)食行為。如圖1-2所示就是多態(tài)性的表現(xiàn)。圖1-2圖形多態(tài)性示例具體到面向?qū)ο蟪绦蛟O(shè)計(jì)來講,多態(tài)性(Polymorphism)是指在兩個(gè)或多個(gè)屬于不同類的對(duì)象中,同一函數(shù)名對(duì)應(yīng)多個(gè)具有相似功能的不同函數(shù),可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù)。繼承性和多態(tài)性的結(jié)合可以生成一系列雖類似但獨(dú)一無二的對(duì)象。由于繼承性,這些對(duì)象共享許多相似的特征;由于多態(tài)性,針對(duì)相同的消息,不同的對(duì)象可以有獨(dú)特的表現(xiàn)方式,實(shí)現(xiàn)個(gè)性化的設(shè)計(jì)。上述面向?qū)ο蠹夹g(shù)的幾個(gè)特征的運(yùn)用,對(duì)提高軟件的開發(fā)效率起著非常重要的作用,通過編寫可重用代碼,編寫可維護(hù)代碼,修改代碼模塊,共享代碼等方法可以充分發(fā)揮其優(yōu)勢(shì)。1.3面向?qū)ο笈c項(xiàng)目設(shè)計(jì)面向?qū)ο笤O(shè)計(jì)是把分析階段得到的需求轉(zhuǎn)變成符合成本和質(zhì)量要求的抽象的系統(tǒng)實(shí)現(xiàn)方案的過程。從面向?qū)ο蠓治龅矫嫦驅(qū)ο笤O(shè)計(jì),是一個(gè)逐漸擴(kuò)充模型的過程。瀑布模型把設(shè)計(jì)進(jìn)一步劃分成概要設(shè)計(jì)和詳細(xì)設(shè)計(jì)兩個(gè)階段,類似地,也可以把面向?qū)ο笤O(shè)計(jì)再細(xì)分為系統(tǒng)設(shè)計(jì)和對(duì)象設(shè)計(jì)。系統(tǒng)設(shè)計(jì)確定實(shí)現(xiàn)系統(tǒng)的策略和目標(biāo)系統(tǒng)的高層結(jié)構(gòu)。對(duì)象設(shè)計(jì)確定問題解決空間中的類、關(guān)聯(lián)、接口形式及實(shí)現(xiàn)操作的算法。1.3.1用面向?qū)ο蟮姆椒ǚ治鲰?xiàng)目需求面向?qū)ο蠓治龅哪康氖钦J(rèn)知客觀世界的系統(tǒng)并對(duì)系統(tǒng)進(jìn)行建模。那么就需要在面向?qū)ο蠓治鲞^程中,根據(jù)客觀世界的具體實(shí)例來構(gòu)造問題域中準(zhǔn)確、具體、嚴(yán)密的分析模型。構(gòu)造分析模型的用途有三種:第一種是用來明確問題域的需求;第二種是為用戶和開發(fā)人員提供明確需求;第三種是為用戶和開發(fā)人員提供一個(gè)協(xié)商的基礎(chǔ),作為后繼的設(shè)計(jì)和實(shí)現(xiàn)的框架。需求分析的結(jié)果應(yīng)以文檔的形式存在。如圖1-3所示就是面向?qū)ο蟮姆治鲞^程。圖1-3面向?qū)ο蟮姆治鲞^程1.獲取需求內(nèi)容陳述系統(tǒng)分析的第一步就是獲取需求內(nèi)容陳述。分析者必須同用戶一塊工作來提煉這些需求,必須搞清楚用戶的真實(shí)意圖是什么,其中的過程涉及對(duì)需求的分析及關(guān)聯(lián)信息的查找。以“學(xué)生管理系統(tǒng)”為例,需求內(nèi)容陳述如下:在學(xué)生管理信息系統(tǒng)中,要為每個(gè)學(xué)生建立個(gè)人信息檔案,包括學(xué)號(hào)、姓名、性別、年齡、入學(xué)時(shí)間、專業(yè)、聯(lián)系電話和家庭住址等個(gè)人信息。系統(tǒng)管理員登錄系統(tǒng)并通過身份驗(yàn)證后,可以執(zhí)行對(duì)學(xué)生個(gè)人信息檔案的添加、刪除、修改和查詢操作。教師登錄系統(tǒng)并通過驗(yàn)證后,可以錄入自己負(fù)責(zé)的科目、學(xué)生的考試成績,也可查詢學(xué)生的個(gè)人信息和成績。學(xué)生登錄系統(tǒng)并通過身份驗(yàn)證后可以查詢自己的個(gè)人所有信息。校長登錄系統(tǒng)并通過身份驗(yàn)證后可以查詢學(xué)校所有學(xué)生的全部信息。系統(tǒng)管理員要完成系統(tǒng)維護(hù)工作,包括日志、管理員權(quán)限、學(xué)生信息、數(shù)據(jù)庫的維護(hù)等工作。2.建立系統(tǒng)的對(duì)象模型結(jié)構(gòu)系統(tǒng)分析的第二步就是建立系統(tǒng)的對(duì)象模型結(jié)構(gòu)。要建立系統(tǒng)的對(duì)象模型結(jié)構(gòu)首先要標(biāo)識(shí)和關(guān)聯(lián)類,因?yàn)轭惖拇_定以及關(guān)聯(lián)影響整個(gè)系統(tǒng)的結(jié)構(gòu)和解決問題的方法;其次是增加類的屬性,進(jìn)一步描述類和關(guān)聯(lián)的基本網(wǎng)絡(luò),在這個(gè)過程中我們可以使用繼承、包等來組織類;最后是將操作增加到類中作為構(gòu)造動(dòng)態(tài)模型和功能模型的副產(chǎn)品。下面就分別進(jìn)行介紹。(1)標(biāo)識(shí)和確定類構(gòu)造對(duì)象模型的第一步是標(biāo)出來自問題域的相關(guān)對(duì)象類,這些對(duì)象類包括物理實(shí)體和概念的描述。所有類在應(yīng)用中都應(yīng)當(dāng)是有意義的,在問題陳述中,并非所有類都是明顯給出的,有些是隱含在問題域或一般知識(shí)中的。通常來說,一個(gè)確定類的過程包括:從需求說明中選取相關(guān)的名詞確定一些類,然后對(duì)這些類進(jìn)行分析,過濾掉不符合條件的類。如圖1-4所示,是一個(gè)確定類的過程。圖1-4確定類的過程我們查找問題陳述中的所有名詞,產(chǎn)生如下的暫定類。軟件 學(xué)生管理系統(tǒng) 系統(tǒng)管理員學(xué)生老師 個(gè)人信息 管理員權(quán)限 學(xué)生的考試成績學(xué)生的班級(jí) 日志 數(shù)據(jù)庫維護(hù) 校長接下來我們根據(jù)下列標(biāo)準(zhǔn),去掉一些不必要的類和不正確的類。消除冗余類。如果存在兩個(gè)類表述了同一個(gè)信息,我們保留最富有描述能力并且和系統(tǒng)緊密相關(guān)的類。如“個(gè)人信息”和“學(xué)生”就是重復(fù)的描述,因?yàn)椤皩W(xué)生”最富有描述性,因此保留它。去除掉與系統(tǒng)不相干的類。與問題沒有關(guān)系或根本無關(guān)的類,在類的確定中應(yīng)當(dāng)去除掉。去除掉模糊類。由于類必須是明確的,有些暫定類中邊界的定義模糊或范圍太廣,如“軟件”就是模糊類,就這個(gè)系統(tǒng)而言,它是指“學(xué)生管理系統(tǒng)”。去除掉屬性。某些名詞描述的是其他對(duì)象的屬性,應(yīng)當(dāng)把這些類從暫定類中刪除掉。但是如果某一個(gè)名詞的獨(dú)立性很重要,就應(yīng)該把它歸屬到類,而不把它作為屬性。如“學(xué)生的考試成績”和“學(xué)生的班級(jí)”屬于學(xué)生信息的屬性,應(yīng)當(dāng)去除。去除掉操作。如果問題陳述中的名詞中有動(dòng)作含義的名詞,則含有這樣描述的操作的名詞就不應(yīng)當(dāng)是類。如“數(shù)據(jù)庫維護(hù)”屬于操作而不是類。在圖書管理信息系統(tǒng)中,根據(jù)上面的標(biāo)準(zhǔn),把“軟件”、“個(gè)人信息”、“學(xué)生的考試信息”、“學(xué)生的班級(jí)”、“數(shù)據(jù)庫維護(hù)”等這些類除去。(2)準(zhǔn)備數(shù)據(jù)字典為所有建模實(shí)體準(zhǔn)備一個(gè)數(shù)據(jù)字典來進(jìn)行描述。數(shù)據(jù)字典應(yīng)當(dāng)準(zhǔn)確描述各個(gè)類的精確含義,描述當(dāng)前問題中類的范圍,包括對(duì)類的成員、用法方面的假設(shè)或限制等。比如,學(xué)生的信息應(yīng)當(dāng)包括姓名、學(xué)號(hào)、年齡、性別、入學(xué)時(shí)間等。(3)確定關(guān)聯(lián)關(guān)聯(lián)是指兩個(gè)或多個(gè)類之間的相互依賴。一種依賴表示一種關(guān)聯(lián),可用各種方式來實(shí)現(xiàn)關(guān)聯(lián)。關(guān)聯(lián)常用描述性動(dòng)詞或動(dòng)詞詞組來表示,其中有物理位置的表示、傳導(dǎo)的動(dòng)作、通信、所有者關(guān)系、條件的滿足等。從問題陳述中抽取所有可能的關(guān)聯(lián)表述,把它們記下來,但不要過早地細(xì)化這些表述。系統(tǒng)中所有可能的關(guān)聯(lián),大多數(shù)是直接抽取問題中的動(dòng)詞詞組而得到的。在陳述中,有些動(dòng)詞詞組表述的關(guān)聯(lián)是不明顯的。最后,還有一些關(guān)聯(lián)與客觀世界或人的假設(shè)有關(guān),必須同用戶一起核實(shí)這種關(guān)聯(lián),因?yàn)檫@種關(guān)聯(lián)在問題陳述中找不到。學(xué)生管理信息系統(tǒng)問題陳述中的關(guān)聯(lián)如下。每個(gè)學(xué)生建立一個(gè)個(gè)人檔案。只有系統(tǒng)管理員有權(quán)對(duì)學(xué)生的信息進(jìn)行添加、刪除、修改。學(xué)生包括各個(gè)專業(yè)的學(xué)生。一個(gè)學(xué)生有多個(gè)科目的成績。一個(gè)班級(jí)有多個(gè)學(xué)生。系統(tǒng)管理員完成系統(tǒng)維護(hù)工作。維護(hù)包括日志、管理員權(quán)限、學(xué)生信息、數(shù)據(jù)庫的維護(hù)等工作。系統(tǒng)提供個(gè)人信息的安全保證。使用下列標(biāo)準(zhǔn)去掉不必要和不正確的關(guān)聯(lián)。不相干的關(guān)聯(lián)或?qū)崿F(xiàn)階段的關(guān)聯(lián)應(yīng)當(dāng)被刪除。刪除所有問題域之外的關(guān)聯(lián)或涉及實(shí)現(xiàn)結(jié)構(gòu)中的關(guān)聯(lián)。某些動(dòng)作應(yīng)當(dāng)被刪除。關(guān)聯(lián)應(yīng)該描述應(yīng)用域的結(jié)構(gòu)性質(zhì)而不是瞬時(shí)事件,因此對(duì)一些瞬時(shí)事件的描述也應(yīng)當(dāng)被刪除。派生關(guān)聯(lián)應(yīng)當(dāng)被刪除。省略那些可以用其他關(guān)聯(lián)來定義的關(guān)聯(lián),因?yàn)檫@種關(guān)聯(lián)是冗余的。(4)確定屬性屬性是個(gè)體對(duì)象的性質(zhì),屬性通常用修飾性的名詞詞組來表示。形容詞常常表示具體的可枚舉的屬性值,屬性不可能在問題陳述中完全表述出來,必須借助于應(yīng)用域的知識(shí)及對(duì)客觀世界的知識(shí)才可以找到它們。只考慮與具體應(yīng)用直接相關(guān)的屬性,不要考慮那些超出問題范圍的屬性。首先找出重要屬性,避免那些只用于實(shí)現(xiàn)的屬性,要為各個(gè)屬性取個(gè)有意義的名字。按下列標(biāo)準(zhǔn)刪除不必要的和不正確的屬性??梢宰鳛閷?duì)象的屬性。若實(shí)體的獨(dú)立存在比它的值重要,那么這個(gè)實(shí)體不是屬性而是對(duì)象。例如,在郵政目錄中,“城市”可以看作是一個(gè)屬性,然而在人口普查中,“城市”則被看作是對(duì)象。在具體應(yīng)用中,具有自身性質(zhì)的實(shí)體一定是對(duì)象。對(duì)象的限定詞。若屬性值取決于某種具體上下文,則可考慮把該屬性重新表述為一個(gè)限定詞。對(duì)象的名稱。名稱常常作為限定詞而不是對(duì)象的屬性,當(dāng)名稱不依賴于上下文關(guān)系時(shí),名稱即為一個(gè)對(duì)象屬性,尤其是它不唯一時(shí)。對(duì)象的標(biāo)識(shí)符。在考慮對(duì)象模糊性時(shí),引入對(duì)象標(biāo)識(shí)符來表示。在對(duì)象模型中不列出這些對(duì)象標(biāo)識(shí)符,它是隱含在對(duì)象模型中的,只列出存在于應(yīng)用域的屬性。對(duì)象的內(nèi)部值。若屬性描述了對(duì)外不透明的對(duì)象的內(nèi)部狀態(tài),則應(yīng)從對(duì)象模型中刪除該屬性。細(xì)化的細(xì)節(jié)。忽略那些不可能對(duì)大多數(shù)操作有影響的屬性。(5)使用繼承來細(xì)化類使用繼承來共享公共屬性,以此來對(duì)類進(jìn)行組織,一般可以使用下列兩種方式來進(jìn)行。自底向上通過把現(xiàn)有類的共同性質(zhì)一般化為父類,尋找具有相似屬性、關(guān)系或操作的類來發(fā)現(xiàn)繼承。例如,“博士生”和“本科生”是類似的,可以一般化為“大學(xué)生”。這些一般化結(jié)果常常是基于客觀世界邊界的現(xiàn)有分類,只要可能,盡量使用現(xiàn)有概念。自頂向下將現(xiàn)有的類細(xì)化為更具體的子類。具體化常??梢詮膽?yīng)用域中明顯看出來。在應(yīng)用域中各枚舉情況是最常見的具體化的來源。例如,按鈕可以有普通按鈕、單選按鈕、多選按鈕等,這就可以把按鈕類具體細(xì)化為各種具體按鈕的子類。當(dāng)同一關(guān)聯(lián)名出現(xiàn)多次且意義也相同時(shí),應(yīng)盡量具體化為相關(guān)聯(lián)的類。在類層次中,可以為具體的類分配屬性和關(guān)聯(lián)。各屬性和關(guān)聯(lián)都應(yīng)分配給最一般的適合的類,有時(shí)也加上一些修正。應(yīng)用域中各枚舉情況是最常見的具體化的來源。(6)完善對(duì)象模型對(duì)象建模不可能一次就能保證模型是完全正確的,軟件開發(fā)的整個(gè)過程就是一個(gè)不斷。如下為幾種可能丟失對(duì)象的情況及解決辦法。同一類中存在毫無關(guān)系的屬性和操作,則分解這個(gè)類,使各部分相互關(guān)聯(lián)。一般化體系不清楚,則可能分離扮演兩種角色的類。存在無目標(biāo)類的操作,則找出并加上失去目標(biāo)的類。存在名稱及目的相同的冗余關(guān)聯(lián),則通過一般化創(chuàng)建丟失的父類,把關(guān)聯(lián)組織在一起。對(duì)于多余類還需要進(jìn)行查找,如果類中缺少屬性、操作和關(guān)聯(lián),則可刪除這個(gè)類。對(duì)于丟失的關(guān)聯(lián)的查找,如果丟失了操作的訪問路徑,則加入新的關(guān)聯(lián)以回答查詢。3.建立對(duì)象的動(dòng)態(tài)模型進(jìn)行分析的第三步是建立對(duì)象的動(dòng)態(tài)模型,建立對(duì)象的動(dòng)態(tài)模型的過程一般包含下列幾個(gè)步驟。(1)準(zhǔn)備腳本動(dòng)態(tài)分析從尋找事件開始,然后確定各對(duì)象的可能事件順序。在分析階段不考慮算法的執(zhí)行,算法是實(shí)現(xiàn)模型的一部分。(2)確定事件確定所有外部事件。事件包括所有來自或發(fā)往用戶的信息、外部設(shè)備的信號(hào)、輸入、轉(zhuǎn)換和動(dòng)作,可以發(fā)現(xiàn)正常事件,但不能遺漏條件和異常事件。(3)準(zhǔn)備事件跟蹤表把腳本表示成一個(gè)事件跟蹤表,即不同對(duì)象之間的事件排序表,對(duì)象為表中的列,給每個(gè)對(duì)象分配一個(gè)獨(dú)立的列。(4)構(gòu)造狀態(tài)圖對(duì)各對(duì)象類建立狀態(tài)圖,反映對(duì)象接收和發(fā)送的事件,每個(gè)事件跟蹤都對(duì)應(yīng)于狀態(tài)圖中的一條路徑。4.建立系統(tǒng)功能模型進(jìn)行分析的第四步是建立對(duì)象的功能模型,功能模型用來說明值是如何計(jì)算的,標(biāo)明值與值之間的依賴關(guān)系及相關(guān)的功能。數(shù)據(jù)流圖有助于表示功能依賴關(guān)系,其中的處理在狀態(tài)圖的活動(dòng)和動(dòng)作中進(jìn)行標(biāo)識(shí),其中的數(shù)據(jù)流對(duì)應(yīng)于對(duì)象圖中的對(duì)象或?qū)傩浴?1)確定輸入值、輸出值先列出輸入、輸出值,輸入、輸出值是系統(tǒng)與外界之間的事件的參數(shù)。(2)建立數(shù)據(jù)流圖數(shù)據(jù)流圖說明輸出值是怎樣從輸入值得來的,數(shù)據(jù)流圖通常按層次組織。5.確定類的操作在建立對(duì)象模型時(shí),確定了類、關(guān)聯(lián)、結(jié)構(gòu)和屬性,還沒有確定操作。只有建立了動(dòng)態(tài)模型和功能模型之后,才可能最后確定類的操作。1.3.2用面向?qū)ο蟮姆椒ㄔO(shè)計(jì)系統(tǒng)前面已提到過,面向?qū)ο笤O(shè)計(jì)是把分析階段得到的需求轉(zhuǎn)變成符合成本和質(zhì)量要求的抽象的系統(tǒng)實(shí)現(xiàn)方案的過程。從面向?qū)ο蠓治龅矫嫦驅(qū)ο笤O(shè)計(jì)是一個(gè)逐漸擴(kuò)充模型的過程。1.面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則面向?qū)ο笤O(shè)計(jì)的準(zhǔn)則包括模塊化、抽象、信息隱藏、低耦合和高內(nèi)聚等,下面我們對(duì)這些特征進(jìn)行一一介紹。(1)模塊化面向?qū)ο箝_發(fā)方法很自然地支持了把系統(tǒng)分解成模塊的設(shè)計(jì)原則:對(duì)象就是模塊。它是把數(shù)據(jù)結(jié)構(gòu)和操作這些數(shù)據(jù)的方法緊密地結(jié)合在一起所構(gòu)成的模塊。類的設(shè)計(jì)要很好地支持模塊化這一準(zhǔn)則,這樣使系統(tǒng)能夠有更好的維護(hù)性。(2)抽象面向?qū)ο蠓椒ú粌H支持對(duì)過程進(jìn)行抽象,而且支持對(duì)數(shù)據(jù)進(jìn)行抽象。抽象方法的好壞以及抽象的層次都對(duì)系統(tǒng)的設(shè)計(jì)有很大的影響。(3)信息隱藏在面向?qū)ο蠓椒ㄖ校畔㈦[藏是通過對(duì)象的封裝性來進(jìn)行實(shí)現(xiàn)的。對(duì)象暴露接口的多少以及接口的好壞都對(duì)系統(tǒng)設(shè)計(jì)有很大的影響。(4)低耦合在面向?qū)ο蠓椒ㄖ校瑢?duì)象是最基本的模塊,因此,耦合主要是指不同對(duì)象之間相互關(guān)聯(lián)的緊密程度。低耦合是設(shè)計(jì)的一個(gè)重要標(biāo)準(zhǔn),因?yàn)檫@有助于使得系統(tǒng)中某一部分的變化對(duì)其他部分的影響降到最低程度。低耦合的程序有助于類的維護(hù),也是衡量類好壞的一個(gè)很重要的指標(biāo)。(5)高內(nèi)聚在面向?qū)ο蠓椒ㄖ校邇?nèi)聚也是必須滿足的條件,高內(nèi)聚是指在一個(gè)對(duì)象類中應(yīng)盡量多地匯集邏輯上相關(guān)的計(jì)算資源。如果一個(gè)模塊只負(fù)責(zé)一件事情,就說明這個(gè)模塊有很高的內(nèi)聚度;如果一個(gè)模塊負(fù)責(zé)了很多毫不相關(guān)的事情,則說明這個(gè)模塊的內(nèi)聚度很低。內(nèi)聚度高的模塊通常很容易理解,很容易被復(fù)用、擴(kuò)展和維護(hù)。較低的耦合度和較高的內(nèi)聚度,也即我們常說的“低耦合、高內(nèi)聚”,是所有優(yōu)秀軟件的共同特征。2.面向?qū)ο笤O(shè)計(jì)的啟發(fā)規(guī)則 在面向?qū)ο笤O(shè)計(jì)中,我們可以通過使用一些實(shí)用的規(guī)則來指導(dǎo)我們進(jìn)行面向?qū)ο蟮脑O(shè)計(jì)。通常這些面向?qū)ο笤O(shè)計(jì)的啟發(fā)規(guī)則包含以下的內(nèi)容。(1)設(shè)計(jì)的結(jié)果應(yīng)該清晰易懂使設(shè)計(jì)結(jié)果清晰、易懂、易讀是提高軟件可維護(hù)性和可重用性的重要措施。顯然,人們不會(huì)重用那些他們不理解的設(shè)計(jì)。如果要使設(shè)計(jì)的結(jié)果清晰易懂,一般要做到如下幾個(gè)方面。用詞一致。用詞不一致會(huì)產(chǎn)生理解不一致,增加理解的負(fù)擔(dān)。使用已經(jīng)存在的函數(shù)或方法。已經(jīng)存在的函數(shù)或方法有助于減少函數(shù)或方法的數(shù)量。減少消息模式的數(shù)量。減少消息模式的數(shù)量會(huì)減少很多不必要的記憶。避免模糊的定義。模糊的定義會(huì)給設(shè)計(jì)和閱讀帶來麻煩。(2)一般到具體結(jié)構(gòu)的深度應(yīng)適當(dāng)通常來說,從一般到具體的抽象過程,抽象得越深,對(duì)于程序的可移植性也就越好,但是抽象層次過多會(huì)給編寫和維護(hù)帶來很大的麻煩,一般來講,適度的抽象能夠更好地提高軟件的開發(fā)效率和維護(hù)工作。具體的情況需要系統(tǒng)分析員根據(jù)具體的情況進(jìn)行抽象。(3)盡量設(shè)計(jì)小而簡單的類系統(tǒng)設(shè)計(jì)應(yīng)當(dāng)盡量設(shè)計(jì)小而簡單的類,這樣便于開發(fā)和管理程序。為了保持類的設(shè)計(jì)簡單,通常應(yīng)該注意以下幾點(diǎn)。類中避免包含過多的屬性。每一個(gè)類應(yīng)當(dāng)有自己明確的定義。盡量簡化對(duì)象之間的合作關(guān)系。對(duì)外不要提供太多的操作。(4)使用簡單的消息協(xié)議簡單的消息協(xié)議有助于幫助記憶和測(cè)試,一般來講,消息中參數(shù)的個(gè)數(shù)不要超過三個(gè)。(5)使用簡單的函數(shù)或方法通常來講,面向?qū)ο笤O(shè)計(jì)出來的類中的函數(shù)或方法要設(shè)計(jì)得盡可能的小,有一些書上建議一個(gè)函數(shù)或方法一般只有三至五行源程序即可,可以用僅含一個(gè)動(dòng)詞和一個(gè)賓語的簡單句子來描述它的功能。(6)把設(shè)計(jì)變動(dòng)減至最小通常,設(shè)計(jì)的質(zhì)量越高,設(shè)計(jì)結(jié)果保持不變的時(shí)間也越長。即使出現(xiàn)必須修改設(shè)計(jì)的情況,也應(yīng)該使修改的范圍盡可能小。提高設(shè)計(jì)質(zhì)量是系統(tǒng)設(shè)計(jì)工作的一大挑戰(zhàn)。3.系統(tǒng)設(shè)計(jì)系統(tǒng)設(shè)計(jì)是問題求解及建立解答的高級(jí)策略。必須制定解決問題的基本方法,系統(tǒng)的高層結(jié)構(gòu)形式包括子系統(tǒng)的分解、系統(tǒng)的固有并發(fā)性、子系統(tǒng)如何分配給硬軟件、數(shù)據(jù)存儲(chǔ)管理、資源協(xié)調(diào)、軟件控制實(shí)現(xiàn)、定義人機(jī)交互接口等等。系統(tǒng)設(shè)計(jì)一般是先從高層入手,然后細(xì)化。系統(tǒng)設(shè)計(jì)要決定整個(gè)結(jié)構(gòu)及風(fēng)格,這種結(jié)構(gòu)為后面設(shè)計(jì)階段更詳細(xì)地設(shè)計(jì)策略提供了基礎(chǔ)。下面介紹整個(gè)系統(tǒng)設(shè)計(jì)的一般步驟。(1)分解系統(tǒng)系統(tǒng)中主要的組成部分稱為子系統(tǒng),子系統(tǒng)既不是一個(gè)對(duì)象也不是一個(gè)功能,而是類、關(guān)聯(lián)、操作、事件和約束的集合。(2)確定并發(fā)性分析模型、現(xiàn)實(shí)世界及硬件中的不少對(duì)象均是并發(fā)的。(3)處理器及任務(wù)分配必須分配給各并發(fā)子系統(tǒng)單個(gè)的硬件單元,要么是一個(gè)一般的處理器,要么是一個(gè)具體的功能單元。(4)數(shù)據(jù)存儲(chǔ)管理系統(tǒng)中的內(nèi)部數(shù)據(jù)和外部數(shù)據(jù)的存儲(chǔ)管理是一項(xiàng)重要的任務(wù)。通常各數(shù)據(jù)存儲(chǔ)可以將數(shù)據(jù)結(jié)構(gòu)、文件、數(shù)據(jù)庫組合在一起,不同數(shù)據(jù)的存儲(chǔ)要在費(fèi)用、訪問時(shí)間、容量及可靠性之間做出折中考慮。(5)全局資源的處理必須確定全局資源,并且制定訪問全局資源的策略。(6)選擇軟件控制機(jī)制分析模型中所有的交互行為都表示為對(duì)象之間的事件。系統(tǒng)設(shè)計(jì)必須從多種方法中選擇某種方法來實(shí)現(xiàn)軟件的控制。(7)人機(jī)交互接口設(shè)計(jì)1.4用面向?qū)ο笏枷虢⑾到y(tǒng)模型在面向?qū)ο蟮拈_發(fā)和設(shè)計(jì)中,借鑒了建筑行業(yè)中的建模思想。在建筑行業(yè)中,建模是一項(xiàng)經(jīng)過檢驗(yàn)并被人們廣泛接受的工程技術(shù)。人們?cè)诮⒎课莺痛髲B等建筑物的時(shí)候,首先創(chuàng)建建筑物的模型,建筑物的模型能幫助用戶得到實(shí)際建筑物的整體印象,并且可以通過建立數(shù)學(xué)模型來分析各種因素對(duì)建筑物造成的影響,比如建筑物的地面壓力、地震等。面向?qū)ο蟮慕R悦嫦驅(qū)ο箝_發(fā)者的觀點(diǎn)創(chuàng)建所需要的系統(tǒng)。事實(shí)上,選擇創(chuàng)建什么樣的模型,對(duì)如何解決問題和如何形成解決方案有著深遠(yuǎn)的影響。1.4.1瀑布模型瀑布模型也被稱為生存周期模型,其核心思想是按照相應(yīng)的工序?qū)栴}進(jìn)行簡化,將系統(tǒng)功能的實(shí)現(xiàn)與系統(tǒng)的設(shè)計(jì)工作分開,便于項(xiàng)目之間的分工與協(xié)作,即采用結(jié)構(gòu)化的分析與設(shè)計(jì)方法將邏輯實(shí)現(xiàn)與物理實(shí)現(xiàn)分開。瀑布模型將軟件的生命周期劃分為軟件計(jì)劃、需求分析和定義、軟件設(shè)計(jì)、軟件實(shí)現(xiàn)、軟件測(cè)試、軟件運(yùn)行和維護(hù)六個(gè)階段,并且規(guī)定了它們自上而下的次序,如同瀑布一樣下落,每一個(gè)階段都是依次銜接的。采用瀑布模型的軟件開發(fā)過程如圖1-5所示。圖1-5采用瀑布模型的軟件開發(fā)過程瀑布模型是最早出現(xiàn)的軟件開發(fā)模型,在軟件工程中占有重要的地位,它提供了軟件開發(fā)的基本框架。其過程是從上一項(xiàng)活動(dòng)接收該項(xiàng)活動(dòng)的工作對(duì)象作為輸入,利用這一輸入實(shí)施該項(xiàng)活動(dòng)應(yīng)完成的內(nèi)容,給出該項(xiàng)活動(dòng)的工作成果,并作為輸出傳給下一項(xiàng)活動(dòng)。同時(shí)評(píng)審該項(xiàng)活動(dòng)的實(shí)施,若確認(rèn),則繼續(xù)下一項(xiàng)活動(dòng);否則返回到前面,甚至更前面的活動(dòng)。瀑布模型為項(xiàng)目提供了按階段劃分的檢查點(diǎn),這樣有利于軟件開發(fā)過程中人員的組織及管理。瀑布模型讓你在當(dāng)前一階段完成后,才去關(guān)注后續(xù)階段,這樣有利于開發(fā)大型的項(xiàng)目。然而軟件開發(fā)的實(shí)踐表明,瀑布模型也存在一定的缺陷。只有在項(xiàng)目生命周期的后期才能看到結(jié)果。由于開發(fā)模型呈線性,所以當(dāng)開發(fā)成果尚未經(jīng)過測(cè)試時(shí),用戶是無法看到軟件效果的。這樣不能在開發(fā)過程中及時(shí)得到反饋,增加了項(xiàng)目開發(fā)的風(fēng)險(xiǎn)。在軟件開發(fā)前期未發(fā)現(xiàn)的錯(cuò)誤傳到后面的開發(fā)活動(dòng)中,進(jìn)而可能會(huì)造成整個(gè)軟件項(xiàng)目開發(fā)失敗。通過過多的強(qiáng)制完成日期和里程碑來跟蹤各個(gè)項(xiàng)目階段。在每個(gè)項(xiàng)目的開發(fā)階段,瀑布模型是通過強(qiáng)制固定的完成日期和里程碑進(jìn)行項(xiàng)目跟蹤的,這使得在項(xiàng)目開發(fā)過程中缺乏足夠的靈活性,特別是對(duì)于需求不穩(wěn)定的項(xiàng)目更加麻煩。在軟件需求分析階段,要完全地確定系統(tǒng)用戶的所有需求是一件比較困難的事情,甚至可以說完全確定是不太可能的。盡管瀑布模型存在一定的缺陷,但是它對(duì)很多類型的項(xiàng)目而言依然是有效的,特別是在進(jìn)行一些大型的項(xiàng)目的開發(fā)時(shí)。如果能夠正確使用,可以節(jié)省大量的時(shí)間和金錢。對(duì)于所開發(fā)的項(xiàng)目而言,是否使用這一模型主要取決于能否理解客戶的需求以及在項(xiàng)目的進(jìn)程中這些需求的變化程度,對(duì)于能夠在前期確定需求的項(xiàng)目,瀑布模型還是有一定價(jià)值的。1.4.2噴泉模型噴泉模型是一種以對(duì)象為驅(qū)動(dòng)、以用戶需求為動(dòng)力的模型,主要用于描述面向?qū)ο蟮能浖_發(fā)過程。該模型認(rèn)為軟件開發(fā)過程中自下而上周期的各階段是相互重疊和多次反復(fù)的,類似一個(gè)噴泉,水噴上去又可以落下來。各個(gè)開發(fā)階段沒有特定的次序要求,并且可以交互進(jìn)行,可以在某個(gè)開發(fā)階段中隨時(shí)補(bǔ)充其他任何開發(fā)階段中的遺漏。采用噴泉模型的軟件開發(fā)過程如圖1-6所示。圖1-6采用噴泉模型的軟件開發(fā)過程噴泉模型主要用于面向?qū)ο蟮能浖?xiàng)目,軟件的某個(gè)部分通常被重復(fù)多次,相關(guān)對(duì)象在每次迭代中隨之加入漸進(jìn)的軟件成分。各活動(dòng)之間無明顯邊界,例如,設(shè)計(jì)和實(shí)現(xiàn)之間沒有明顯的邊界,這也稱為“噴泉模型的無間隙性”。由于對(duì)象概念的引入、表達(dá)分析、設(shè)計(jì)及實(shí)現(xiàn)等活動(dòng)只用對(duì)象類和關(guān)系,從而可以較容易地實(shí)現(xiàn)活動(dòng)的迭代和無間隙性。噴泉模型不像瀑布模型那樣,需要分析活動(dòng)結(jié)束后才開始設(shè)計(jì)活動(dòng),設(shè)計(jì)活動(dòng)結(jié)束后才開始編碼活動(dòng)。該模型的各個(gè)階段沒有明顯的界限,開發(fā)人員可以同步進(jìn)行開發(fā)。其優(yōu)點(diǎn)是可以提高軟件項(xiàng)目的開發(fā)效率,節(jié)省開發(fā)時(shí)間,適應(yīng)于面向?qū)ο蟮能浖_發(fā)過程。由于噴泉模型在各個(gè)開發(fā)階段是重疊的,因此在開發(fā)過程中需要大量的開發(fā)人員,不利于項(xiàng)目的管理。此外這種模型要求嚴(yán)格管理文檔,使得審核的難度加大,尤其是面對(duì)可能隨時(shí)加入各種信息、需求與資料的情況。1.4.3基于組件的開發(fā)模型基于構(gòu)件的開發(fā)模型是利用模塊化方法將整個(gè)系統(tǒng)模塊化,并在一定構(gòu)件模型的支持下復(fù)用構(gòu)件庫中的一個(gè)或多個(gè)軟件構(gòu)件,通過組合手段高效率、高質(zhì)量地構(gòu)造應(yīng)用軟件系統(tǒng)的過程?;跇?gòu)件的開發(fā)模型融合了螺旋模型的許多特征,本質(zhì)上是演化形的,開發(fā)過程是迭代的?;跇?gòu)件的開發(fā)模型由軟件計(jì)劃、需求分析和定義、軟件快速原型、原型評(píng)審以及軟件設(shè)計(jì)和實(shí)現(xiàn)五個(gè)階段組成,采用這種開發(fā)模型的軟件開發(fā)過程如圖1-7所示。圖1-7采用基于構(gòu)件的開發(fā)模型的軟件開發(fā)過程構(gòu)件作為重要的軟件技術(shù)和工具得到了極大的發(fā)展,這些新技術(shù)和工具有Microsoft的DCOM、Sun的EJB以及OMG的CORBA等?;跇?gòu)件的開發(fā)活動(dòng)從標(biāo)識(shí)候選構(gòu)件開始,通過搜查已有構(gòu)件庫,確認(rèn)所需要的構(gòu)件是否已經(jīng)存在。如果已經(jīng)存在,則從構(gòu)件庫中提取出來復(fù)用;否則采用面向?qū)ο蠓椒ㄩ_發(fā)它。之后利用提取出來的構(gòu)件通過語法和語義檢查后將這些構(gòu)件通過膠合代碼組裝到一起以實(shí)現(xiàn)系統(tǒng),這個(gè)過程是迭代的?;跇?gòu)件的開發(fā)方法使得軟件開發(fā)不再是一切從頭開始,開發(fā)的過程就是構(gòu)件組裝的過程,維護(hù)的過程就是構(gòu)件升級(jí)、替換和擴(kuò)充的過程。其優(yōu)點(diǎn)是構(gòu)件組裝模型導(dǎo)致了軟件的復(fù)用,提高了軟件開發(fā)的效率。構(gòu)件可由一方定義其規(guī)格說明,被另一方實(shí)現(xiàn)。然后供給第三方使用,構(gòu)件組裝模型允許多個(gè)項(xiàng)目同時(shí)開發(fā),降低了費(fèi)用,提高了可維護(hù)性,可實(shí)現(xiàn)分步提交軟件產(chǎn)品。由于采用自定義的組裝結(jié)構(gòu)標(biāo)準(zhǔn),缺乏通用的組裝結(jié)構(gòu)標(biāo)準(zhǔn),因而引入了較大的風(fēng)險(xiǎn),可重用性和軟件高效性不易協(xié)調(diào),需要精干的有經(jīng)驗(yàn)的分析和開發(fā)人員,一般開發(fā)人員插不上手??蛻舻臐M意度低,并且由于過分依賴于構(gòu)件,所以構(gòu)件庫的質(zhì)量影響著產(chǎn)品質(zhì)量。1.4.4XP開發(fā)模型敏捷方法是近幾年興起的一種輕量級(jí)的開發(fā)方法,它強(qiáng)調(diào)適應(yīng)性而非預(yù)測(cè)性,強(qiáng)調(diào)以人為中心,而不以流程為中心,以及對(duì)變化的適應(yīng)和對(duì)人性的關(guān)注,其特點(diǎn)是,它是一個(gè)輕載、基于時(shí)間、緊湊、并行并基于構(gòu)件的軟件過程。在所有的敏捷方法中,XP(eXtremeProgramming)方法是最引人注目的一種輕型開發(fā)方法。它規(guī)定了一組核心價(jià)值和方法,消除了大多數(shù)重量型開發(fā)過程中的不必要產(chǎn)物,建立了一個(gè)漸進(jìn)型開發(fā)過程。該方法將開發(fā)階段的四個(gè)活動(dòng)(分析、設(shè)計(jì)、編碼和測(cè)試)混合在一起,在全過程中采用迭代增量開發(fā)、反饋修正和反復(fù)測(cè)試的方法。它把軟件的生命周期劃分為用戶場(chǎng)景、體系結(jié)構(gòu)、發(fā)布計(jì)劃、迭代、驗(yàn)證測(cè)試和小型發(fā)布六個(gè)階段,采用這種開發(fā)模型的軟件開發(fā)過程如圖1-8所示。圖1-8采用XP方法的軟件開發(fā)過程XP開發(fā)模型通過對(duì)傳統(tǒng)軟件開發(fā)的標(biāo)準(zhǔn)方法進(jìn)行重新審視,提出了由一組規(guī)則組成的一些簡便易行的過程。由于這些規(guī)則是通過在實(shí)踐中觀察使軟件高效或緩慢的因素而得出的,因此它既考慮了保持開發(fā)人員的活力和創(chuàng)造性,又考慮了開發(fā)過程的有組織、有重點(diǎn)和持續(xù)性。XP開發(fā)模型是面向客戶的開發(fā)模型,重點(diǎn)強(qiáng)調(diào)用戶的滿意程度。開發(fā)過程中對(duì)需求改變的適應(yīng)能力較高,即使在開發(fā)的后期,也可較高程度地適應(yīng)用戶的改變。XP開發(fā)模型與傳統(tǒng)模型相比具有很大的不同,其核心思想是交流(Communication)、簡單(Simplicity)、反饋(Feedback)和進(jìn)取(Aggressiveness)。XP開發(fā)小組不僅包括開發(fā)人員,還包括管理人員和客戶。該模
溫馨提示
- 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. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《會(huì)計(jì)從業(yè)總賬管理》課件
- 《廣場(chǎng)規(guī)劃設(shè)計(jì)》課件
- 寒假自習(xí)課 25春初中道德與法治八年級(jí)下冊(cè)教學(xué)課件 第三單元 第六課 第4課時(shí) 國家監(jiān)察機(jī)關(guān)
- 短信營銷合同三篇
- 農(nóng)學(xué)啟示錄模板
- 理發(fā)店前臺(tái)接待總結(jié)
- 兒科護(hù)士的工作心得
- 探索化學(xué)反應(yīng)奧秘
- 收銀員的勞動(dòng)合同三篇
- 營銷策略總結(jié)
- DB21-T 2931-2018羊肚菌日光溫室栽培技術(shù)規(guī)程
- 貴州省黔東南州2023-2024學(xué)年九年級(jí)上學(xué)期期末文化水平測(cè)試化學(xué)試卷
- 《空調(diào)零部件介紹》課件
- 2024年度醫(yī)院內(nèi)分泌與代謝科述職報(bào)告課件
- 手術(shù)室無菌操作流程
- 農(nóng)業(yè)機(jī)械控制系統(tǒng)硬件在環(huán)測(cè)試規(guī)范
- 翁潭電站大王山輸水隧洞施工控制網(wǎng)設(shè)計(jì)說明書
- 隆胸術(shù)培訓(xùn)課件
- 鋼筋焊接培訓(xùn)課件
- 行政內(nèi)勤培訓(xùn)課件
- 化纖企業(yè)(化學(xué)纖維紡織企業(yè))安全生產(chǎn)操作規(guī)程
評(píng)論
0/150
提交評(píng)論