早期發展
早期的計算機編程是基于面向過程的方法,例如實現算術運算1+1+2 = 4,通過設計一個算法就可以解決當時的問題。随着計算機技術的不斷提高,計算機被用于解決越來越複雜的問題。一切事物皆對象,通過面向對象的方式,将現實世界的事物抽象成對象,現實世界中的關系抽象成類、繼承,幫助人們實現對現實世界的抽象與數字建模。通過面向對象的方法,更利于用人理解的方式對複雜系統進行分析、設計與編程。同時,面向對象能有效提高編程的效率,通過封裝技術,消息機制可以像搭積木一樣快速開發出一個全新的系統。面向對象是指一種程序設計範型,同時也是一種程序開發的方法。對象是類的具體化實現。它将對象作為程序的基本單元,将程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性。
面向對象的思想已經涉及到軟件開發的各個方面。如,面向對象的分析(OOA,Object Oriented Analysis),面向對象的設計(OOD,Object Oriented Design)、以及我們經常說的面向對象的編程實現(OOP,Object Oriented Programming)。
背景
面向對象是在結構化設計方法出現很多問題的情況下應運而生的。結構化設計方法求解問題的基本策略是從功能的角度審視問題域。它将應用程序看成實現某些特定任務的功能模塊,其中子過程是實現某項具體操作的底層功能模塊。在每個功能模塊中,用數據結構描述待處理數據的組織形式,用算法描述具體的操作過程。面對日趨複雜的應用系統,這種開發思路在下面幾個方面逐漸暴露了一些弱點。
1.審視問題域的視角
在現實世界中存在的客體是問題域中的主角,所謂客體是指客觀存在的對象實體和主觀抽象的概念,他是人類觀察問題和解決問題的主要目标。例如,對于一個學校學生管理系統來說,無論是簡單還是複雜,始終是圍繞學生和老師這兩個客體實施。在自然界,每個客體都具有一些屬性和行為,例如學生有學号、姓名、性别等屬性,以及上課、考試、做實驗等行為。因此,每個個體都可以用屬性和行為來描述。
通常人類觀察問題的視角是這些客體,客體的屬性反應客體在某一時刻的狀态,客體的行為反映客體能從事的操作。這些操作附在客體之上并能用來設置、改變和獲取客體的狀态。任何問題域都有一系列的客體,因此解決問題的基本方式是讓這些客體之間相互驅動、相互作用,最終使每個客體按照設計者的意願改變其屬性狀态。
結構化設計方法所采用的設計思路不是将客體作為一個整體,而是将依附于客體之上的行為抽取出來,以功能為目标來設計構造應用系統。這種做法導緻在進行程序設計的時候,不得不将客體所構成的現實世界映射到由功能模塊組成的解空間中,這種變換過程,不僅增加了程序設計的複雜程度,而且背離了人們觀察問題和解決問題的基本思路。另外,再仔細思考會發現,在任何一個問題域中,客體是穩定的,而行為是不穩定的。例如,不管是國家圖書館,還是學校圖書館,還是國際圖書館,都會含有圖書這個客體,但管理圖書的方法可能是截然不同的。結構化設計方法将審視問題的視角定位于不穩定的操作之上,并将描述客體的屬性和行為分開,使得應用程序的日後維護和擴展相當困難,甚至一個微小的變動,都會波及到整個系統。面對問題規模的日趨擴大、環境的日趨複雜、需求變化的日趨加快,将利用計算機解決問題的基本方法統一到人類解決問題的習慣方法之上,徹底改變軟件設計方法與人類解決問題的常規方式扭曲的現象迫在眉睫,這是提出面向對象的首要原因。
2.抽象級别
抽象是人類解決問題的基本法寶。良好的抽象策略可以控制問題的複雜程度,增強系統的通用性和可擴展性。抽象主要包括過程抽象和數據抽象。結構化設計方法應用的是過程抽象。所謂過程抽象是将問題域中具有明确功能定義的操作抽取出來,并将其作為一個實體看待。這種抽象級别對于軟件系統結構的設計顯得有些武斷,并且穩定性差,導緻很難準确無誤地設計出系統的每一個操作環節。一旦某個客體屬性的表示方式發生了變化,就有可能牽扯到已有系統的很多部分。而數據抽象是較過程抽象更高級别的抽象方式,将描述客體的屬性和行為綁定在一起,實現統一的抽象,從而達到對現實世界客體的真正模拟。
3.封裝體
封裝是指将現實世界中存在的某個客體的屬性與行為綁定在一起,并放置在一個邏輯單元内。該邏輯單元負責将所描述的屬性隐藏起來,外界對客體内部屬性的所有訪問隻能通過提供的用戶接口實現。這樣做既可以實現對客體屬性的保護作用,又可以提高軟件系統的可維護性。隻要用戶接口不改變,任何封裝體内部的改變都不會對軟件系統的其他部分造成影響。結構化設計方法沒有做到客體的整體封裝,隻是封裝了各個功能模塊,而每個功能模塊可以随意地對沒有保護能力客體屬性實施操作,并且由于描述屬性的數據與行為被分割開來,所以一旦某個客體屬性的表達方式發生了變化,或某個行為效果發生了改變,就有可能對整個系統産生影響。
4.可重用性
可重用性标識着軟件産品的可複用能力,是衡量一個軟件産品成功與否的重要标志。當今的軟件開發行業,人們越來越追求開發更多的、更有通用性的可重用構件,從而使軟件開發過程徹底改善,即從過去的語句級編寫發展到現在的構件組裝,從而提高軟件開發效率,推動應用領域迅速擴展。然而,結構化程序設計方法的基本單位是模塊,每個模塊隻是實現特定功能的過程描述,因此,它的可重用單位隻能是模塊。例如,在C語言編寫程序時使用大量的标準函數。但對于今天的軟件開發來說,這樣的重用力度顯得微不足道,而且當參與操作的某些數據類型發生變化時,就不能夠再使用那些函數了。因此,渴望更大力度的可重用構件是如今應用領域對軟件開發提出的新需求。
上述弱點驅使人們尋求一種新的程序設計方法,以适應現代社會對軟件開發的更高要求,面向對象由此産生。
基本概念
對象的含義是指具體的某一個事物,即在現實生活中能夠看得見摸得着的事物。在面向對象程序設計中,對象所指的是計算機系統中的某一個成分。在面向對象程序設計中,對象包含兩個含義,其中一個是數據,另外一個是動作。對象則是數據和動作的結合體。對象不僅能夠進行操作,同時還能夠及時記錄下操作結果。
方法是指對象能夠進行的操作,方法同時還有另外一個名稱,叫做函數。方法是類中的定義函數,其具體的作用就是對對象進行描述操作。
繼承簡單地說就是一種層次模型,這種層次模型能夠被重用。層次結構的上層具有通用性,但是下層結構則具有特殊性。在繼承的過程中類則可以從最頂層的部分繼承一些方法和變量。類除了可以繼承以外同時還能夠進行修改或者添加。通過這樣的方式能夠有效提高工作效率。在這裡舉一個例子,當類X繼承了類Y後,此時的類X則是一個派生類,而類Y屬于一個基類。 繼承是從一般演繹到特殊的過程,可以減少知識表示的冗餘内容,知識庫的維護和修正都非常方便。更有利于衍生複雜的系統。
類是具有相同特性(數據元素)和行為(功能)的對象的抽象。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象,類實際上就是一種數據類型。類具有屬性,它是對象的狀态的抽象,用數據結構來描述類的屬性。類具有操作,它是對象的行為的抽象,用操作名和實現該操作的方法來描述。 類映射的每一個對象都具有這些數據和操作方法,類的繼承具有層次性和結構性,高層次對象封裝複雜行為,具體細節對該層次知識保持透明,可以減小問題求解的複雜度。
封裝是将數據和代碼捆綁到一起,對象的某些數據和代碼可以是私有的,不能被外界訪問,以此實現對數據和代碼不同級别的訪問權限。防止了程序相互依賴性而帶來的變動影響,面向對象的封裝比傳統語言的封裝更為清晰、更為有力。有效實現了兩個目标:對數據和行為的包裝和信息隐藏。
多态是指不同事物具有不同表現形式的能力。多态機制使具有不同内部結構的對象可以共享相同的外部接口,通過這種方式減少代碼的複雜度。一個接口,多種方式。
動态綁定指的是将一個過程調用與相應代碼鍊接起來的行為。動态綁定是指與給定的過程調用相關聯的代碼隻有在運行期才可知的一種綁定,它是多态實現的具體形式。
消息傳遞:對象之間需要相互溝通,溝通的途徑就是對象之間收發信息。消息内容包括接收消息的對象的标識,需要調用的函數的标識,以及必要的信息。消息傳遞的概念使得對現實世界的描述更容易。
面向對象的方法就是利用抽象、封裝等機制,借助于對象、類、繼承、消息傳遞等概念進行軟件系統構造的軟件開發方法。
特征
⑴對象唯一性。
每個對象都有自身唯一的标識,通過這種标識,可找到相應的對象。在對象的整個生命期中,它的标識都不改變,不同的對象不能有相同的标識。
⑵抽象性。
抽象性是指将具有一緻的數據結構(屬性)和行為(操作)的對象抽象成類。一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其他一些無關内容。任何類的劃分都是主觀的,但必須與具體的應用有關。
⑶繼承性。
繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關系。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的内容作為自己的内容,并加入若幹新的内容。
繼承性是面向對象程序設計語言不同于其它語言的最重要的特點,是其他語言所沒有的。
在類層次中,子類隻繼承一個父類的數據結構和方法,則稱為單重繼承。
在類層次中,子類繼承了多個父類的數據結構和方法,則稱為多重繼承。
多重繼承,JAVA、VB、NET、Objective-C均僅支持單繼承,注意在C++多重繼承時,需小心二義性。
在軟件開發中,類的繼承性使所建立的軟件具有開放性、可擴充性,這是信息組織與分類的行之有效的方法,它簡化了對象、類的創建工作量,增加了代碼的可重用性。
采用繼承性,提供了類的規範的等級結構。通過類的繼承關系,使公共的特性能夠共享,提高了軟件的重用性。
⑷多态性(多形性)
多态性是指相同的操作或函數、過程可作用于多種類型的對象上并獲得不同的結果。不同的對象,收到同一消息可以産生不同的結果,這種現象稱為多态性。
多态性允許每個對象以适合自身的方式去響應共同的消息。
多态性增強了軟件的靈活性和重用性。
開發方法
OOA方法
面向對象的分析方法(OOA),是在一個系統的開發過程中進行了系統業務調查以後,按照面向對象的思想來分析問題。OOA與結構化分析有較大的區别。OOA所強調的是在系統調查資料的基礎上,針對OO方法所需要的素材進行的歸類分析和整理,而不是對管理業務現狀和方法的分析。
(一)處理複雜問題的原則
抽象(abstraction)是指為了某一分析目的而集中精力研究對象的某一性質,它可以忽略其它與此目的無關的部分。在使用這一概念時,我們承認客觀世界的複雜性,也知道事物包括有多個細節,但此時并不打算去完整地考慮它。抽象是我們科學地研究和處理複雜問題的重要方法。抽象機制被用在數據分析方面,稱之為數據抽象。數據抽象是OOA的核心。數據抽象把一組數據對象以及作用其上的操作組成一個程序實體。使得外部隻知道它是如何做和如何表示的。在應用數據抽象原理時,系統分析人員必須确定對象的屬性以及處理這些屬性的方法,并借助于方法獲得屬性。在OOA中屬性和方法被認為是不可分割的整體。抽象機制有時也被用在對過程的分解方面,被稱之為過程抽象。恰當的過程抽象可以對複雜過程的分解和确定以及描述對象發揮積極的作用。
封裝(encapsulation)即信息隐蔽。它是指在确定系統的某一部分内容時,應考慮到其它部分的信息及聯系都在這一部分的内部進行,外部各部分之間的信息聯系應盡可能的少。
繼承(inheritance)是指能直接獲得已有的性質和特征而不必重複定義它們。OOA可以一次性地指定對象的公共屬性和方法,然後再特化和擴展這些屬性及方法為特殊情況,這樣可大大地減輕在系統實現過程中的重複勞動。在共有屬性的基礎之上,繼承者也可以定義自己獨有的特性。
相關(association)是指把某一時刻或相同環境下發生的事物聯系在一起。
消息通信(communicationwithmessage)是指在對象之間互相傳遞信息的通信方式。
組織方法,在分析和認識世界時,可綜合采用如下三種組織方法(methodOforganization):
1、特定對象與其屬性之間的區别。
2、整體對象與相應組成部分對象之間的區别。
3、不同對象類的構成及其區别等。
比例(scale)是一種運用整體與部分原則,輔助處理複雜問題的方法。
行為範疇(categoriesOfbehavior)是針對被分析對象而言的,它們主要包括:1。基于直接原因的行為。2。時變性行為。3。功能查詢性行為。
(二)OOA方法的基本步驟
在用OOA具體地分析一個事物時,大緻上遵循如下五個基本步驟:
第一步,确定對象和類。這裡所說的對象是對數據及其處理方式的抽象,它反映了系統保存和處理現實世界中某些事物的信息的能力。類是多個對象的共同屬性和方法集合的描述,它包括如何在一個類中建立一個新對象的描述。
第二步,确定結構(structure)。結構是指問題域的複雜性和連接關系。類成員結構反映了泛化-特化關系,整體-部分結構反映整體和局部之間的關系。
第三步,确定主題(subject)。主題是指事物的總體概貌和總體分析模型。
第四步,确定屬性(attribute)。屬性就是數據元素,可用來描述對象或分類結構的實例,可在圖中給出,并在對象的存儲中指定。
第五步,确定方法(method)。方法是在收到消息後必須進行的一些處理方法:方法要在圖中定義,并在對象的存儲中指定。對于每個對象和結構來說,那些用來增加、修改、删除和選擇一個方法本身都是隐含的(雖然它們是要在對象的存儲中定義的,但并不在圖上給出),而有些則是顯示的。
OOD方法
面向對象的設計方法(OOD)是OO方法中一個中間過渡環節。其主要作用是對OOA分析的結果作進一步的規範化整理,以便能夠被OOP直接接受。在OOD的設計過程中,要展開的主要有如下幾項工作。
(一)對象定義規格的求精過程
對于OOA所抽象出來的對象-&-類以及彙集的分析文檔,OOD需要有一個根據設計要求整理和求精的過程,使之更能符合OOP的需要。這個整理和求精過程主要有兩個方面:一是要根據面向對象的概念模型整理分析所确定的對象結構、屬性、方法等内容,改正錯誤的内容,删去不必要和重複的内容等。二是進行分類整理,以便于下一步數據庫設計和程序處理模塊設計的需要。整理的方法主要是進行歸類,對類一&一對象、屬性、方法和結構、主題進行歸類。
(二)數據模型和數據庫設計
數據模型的設計需要确定類-&-對象屬性的内容、消息連接的方式、系統訪問、數據模型的方法等。最後每個對象實例的數據都必須落實到面向對象的庫結構模型中。
(三)優化
OOD的優化設計過程是從另一個角度對分析結果和處理業務過程的整理歸納,優化包括對象和結構的優化、抽象、集成。
對象和結構的模塊化表示OOD提供了一種範式,這種範式支持對類和結構的模塊化。這種模塊符合一般模塊化所要求的所有特點,如信息隐蔽性好,内部聚合度強和模塊之間耦合度弱等。
集成化使得單個構件有機地結合在一起,相互支持。
Booch方法
Booch最先描述了面向對象的軟件開發方法的基礎問題,指出面向對象開發是一種根本不同于傳統的功能分解的設計方法。面向對象的軟件分解更接近人對客觀事務的理解,而功能分解隻通過問題空間的轉換來獲得。
Coad方法
Coad方法是1989年Coad和Yourdon提出的面向對象開發方法。該方法的主要優點是通過多年來大系統開發的經驗與面向對象概念的有機結合,在對象、結構、屬性和操作的認定方面,提出了一套系統的原則。該方法完成了從需求角度進一步進行類和類層次結構的認定。盡管Coad方法沒有引入類和類層次結構的術語,但事實上已經在分類結構、屬性、操作、消息關聯等概念中體現了類和類層次結構的特征。
OMT方法
OMT方法是1991年由JamesRumbaugh等5人提出來的,其經典着作為“面向對象的建模與設計”。
該方法是一種新興的面向對象的開發方法,開發工作的基礎是對真實世界的對象建模,然後圍繞這些對象使用分析模型來進行獨立于語言的設計,面向對象的建模和設計促進了對需求的理解,有利于開發得更清晰、更容易維護的軟件系統。該方法為大多數應用領域的軟件開發提供了一種實際的、高效的保證,努力尋求一種問題求解的實際方法。
UML語言
軟件工程領域在1995年~1997年取得了前所未有的進展,其成果超過軟件工程領域過去15年的成就總和,其中最重要的成果之一就是統一建模語言(UML)的出現。UML将是面向對象技術領域内占主導地位的标準建模語言。
UML不僅統一了Booch方法、OMT方法、OOSE方法的表示方法,而且對其作了進一步的發展,最終統一為大衆接受的标準建模語言。UML是一種定義良好、易于表達、功能強大且普遍适用的建模語言。它融入了軟件工程領域的新思想、新方法和新技術。它的作用域不限于支持面向對象的分析與設計,還支持從需求分析開始的軟件開發全過程。
模型
對象模型
對象模型表示了靜态的、結構化的系統數據性質,描述了系統的靜态結構,它是從客觀世界實體的對象關系角度來描述,表現了對象的相互關系。該模型主要關心系統中對象的結構、屬性和操作,它是分析階段三個模型的核心,是其他兩個模型的框架。
⒈對象和類
⑴對象。
對象建模的目的就是描述對象。
⑵類。
通過将對象抽象成類,我們可以使問題抽象化,抽象增強了模型的歸納能力。
⑶屬性。
屬性指的是類中對象所具有的性質(數據值)。
⑷操作和方法。
操作是類中對象所使用的一種功能或變換。類中的各對象可以共享操作,每個操作都有一個目标對象作為其隐含參數。
方法是類的操作的實現步驟。
⒉關聯和鍊
關聯是建立類之間關系的一種手段,而鍊則是建立對象之間關系的一種手段。
⑴關聯和鍊的含義。
鍊表示對象間的物理與概念聯結,關聯表示類之間的一種關系,鍊是關聯的實例,關聯是鍊的抽象。
⑵角色。
角色說明類在關聯中的作用,它位于關聯的端點。
⑶受限關聯。
受限關聯由兩個類及一個限定詞組成,限定詞是一種特定的屬性,用來有效的減少關聯的重數,限定詞在關聯的終端對象集中說明。
限定提高了語義的精确性,增強了查詢能力,在現實世界中,常常出現限定詞。
⑷關聯的多重性。
關聯的多重性是指類中有多少個對象與關聯的類的一個對象相關。重數常描述為“一”或“多”。
⒊類的層次結構
⑴聚集關系。
聚集是一種“整體-部分”關系。在這種關系中,有整體類和部分類之分。聚集最重要的性質是傳遞性,也具有逆對稱性。
聚集可以有不同層次,可以把不同分類聚集起來得到一顆簡單的聚集樹,聚集樹是一種簡單表示,比畫很多線來将部分類聯系起來簡單得多,對象模型應該容易地反映各級層次。
⑵一般化關系。
一般化關系是在保留對象差異的同時共享對象相似性的一種高度抽象方式。它是“一般---具體”的關系。一般化類稱為你類,具體類又能稱為子類,各子類繼承了父類的性質,而各子類的一些共同性質和操作又歸納到你類中。因此,一般化關系和繼承是同時存在的。一般化關系的符号表示是在類關聯的連線上加一個小三角形。
⒋對象模型
⑴模闆。模闆是類、關聯、一般化結構的邏輯組成。
⑵對象模型。
對象模型是由一個或若幹個模闆組成。模闆将模型分為若幹個便于管理的子塊,在整個對象模型和類及關聯的構造塊之間,模闆提供了一種集成的中間單元,模闆中的類名及關聯名是唯一的。
動态模型
動态模型是與時間和變化有關的系統性質。該模型描述了系統的控制結構,它表示了瞬間的、行為化的系統控制
性質,它關心的是系統的控制,操作的執行順序,它表示從對象的事件和狀态的角度出發,表現了對象的相互行為。
該模型描述的系統屬性是觸發事件、事件序列、狀态、事件與狀态的組織。使用狀态圖作為描述工具。它涉及到事件、狀态、操作等重要概念。
⒈事件
事件是指定時刻發生的某件事。
⒉狀态
狀态是對象屬性值的抽象。對象的屬性值按照影響對象顯着行為的性質将其歸并到一個狀态中去。狀态指明了對象對輸入事件的響應。
⒊狀态圖
狀态圖是一個标準的計算機概念,他是有限自動機的圖形表示,這裡把狀态圖作為建立動态模型的圖形工具。
狀态圖反映了狀态與事件的關系。當接收一事件時,下一狀态就取決于當前狀态和所接收的該事件,由該事件引起的狀态變化稱為轉換。
狀态圖是一種圖,用結點表示狀态,結點用圓圈表示;圓圈内有狀态名,用箭頭連線表示狀态的轉換,上面标記事件名,箭頭方向表示轉換的方向。
功能模型
功能模型描述了系統的所有計算。功能模型指出發生了什麼,動态模型确定什麼時候發生,而對象模型确定發生的客體。功能模型表明一個計算如何從輸入值得到輸出值,它不考慮計算的次序。功能模型由多張數據流圖組成。數據流圖用來表示從源對象到目标對象的數據值的流向,它不包含控制信息,控制信息在動态模型中表示,同時數據流圖也不表示對象中值的組織,值的組織在對象模型中表示。
數據流圖中包含有處理、數據流、動作對象和數據存儲對象。
⒈處理
數據流圖中的處理用來改變數據值。最低層處理是純粹的函數,一張完整的數據流圖是一個高層處理。
⒉數據流
數據流圖中的數據流将對象的輸出與處理、處理與對象的輸入、處理與處理聯系起來。在一個計算機中,用數據流來表示一中間數據值,數據流不能改變數據值。
⒊動作對象
動作對象是一種主動對象,它通過生成或者使用數據值來驅動數據流圖。
⒋數據存儲對象
數據流圖中的數據存儲是被動對象,它用來存儲數據。它與動作對象不一樣,數據存儲本身不産生任何操作,它隻響應存儲和訪問的要求。
實例分析
面向對象分析的目的是對客觀世界的系統進行建模。本節以上面介紹的模型概念為基礎,結合“銀行網絡系統”的具體實例來構造客觀世界問題的準确、嚴密的分析模型。
分析模型有三種用途:用來明确問題需求;為用戶和開發人員提供明确需求;為用戶和開發人員提供一個協商的基礎,作為後繼的設計和實現的框架。
(一)面向對象的分析
系統分析的第一步是:陳述需求。分析者必須同用戶一塊工作來提煉需求,因為這樣才表示了用戶的真實意圖,其中涉及對需求的分析及查找丢失的信息。下面以“銀行網絡系統”為例,用面向對象方法進行分析。
銀行網絡系統問題陳述:設計支持銀行網絡的軟件,銀行網絡包括人工出納站和分行共享的自動出納機。每個分理處用分理處計算機來保存各自的帳戶,處理各自的事務;各自分理處的出納站與分理處計算機通信,出納站錄入帳戶和事務數據;自動出納機與分行計算機通信,分行計算機與撥款分理處結帳,自動出納機與用戶接口接受現金卡,與分行計算機通信完成事務,發放現金,打印收據;系統需要記錄保管和安全措施;系統必須正确處理同一帳戶的并發訪問;每個分處理為自己的計算機準備軟件,銀行網絡費用根據顧客和現金卡的數目分攤給各分理處。
(二)建立對象模型
首先标識和關聯,因為它們影響了整體結構和解決問題的方法,其次是增加屬性,進一步描述類和關聯的基本網絡,使用繼承合并和組織類,最後操作增加到類中去作為構造動态模型和功能模型的副産品。
⒈确定類
構造對象模型的第一步是标出來自問題域的相關的對象類,對象包括物理實體和概念。所有類在應用中都必須有意義,在問題陳述中,并非所有類都是明顯給出的。有些是隐含在問題域或一般知識中的。
查找問題陳述中的所有名詞,産生如下的暫定類。
軟件銀行網絡出納員自動出納機分行
分處理分處理計算機帳戶事務出納站
事務數據分行計算機現金卡用戶現金
收據系統顧客費用帳戶數據
訪問安全措施記錄保管
根據下列标準,去掉不必要的類和不正确的類。
⑴冗餘類:若兩個類表述了同一個信息,保留最富有描述能力的類。如"用戶"和"顧客"就是重複的描述,因為"顧客"最富有描述性,因此保留它。
⑵不相幹的類:除掉與問題沒有關系或根本無關的類。例如,攤派費用超出了銀行網絡的範圍。
⑶模糊類:類必須是确定的,有些暫定類邊界定義模糊或範圍太廣,如"記錄保管"就模糊類,它是"事務"中的一部分。
⑷屬性:某些名詞描述的是其他對象的屬性,則從暫定類中删除。如果某一性質的獨立性很重要,就應該把他歸屬到類,而不把它作為屬性。
⑸操作:如果問題陳述中的名詞有動作含義,則描述的操作就不是類。但是具有自身性質而且需要獨立存在的操作應該描述成類。如我們隻構造電話模型,"撥号"就是動态模型的一部分而不是類,但在電話撥号系統中,"撥号"是一個重要的類,它日期、時間、受話地點等屬性。
在銀行網絡系統中,模糊類是"系統"、"安全措施"、"記錄保管"、"銀行網絡"等。屬于屬性的有:"帳戶數據"、"收據"、"現金"、"事務數據"。屬于實現的如:"訪問"、"軟件"等。這些均應除去。
⒉準備數據字典
為所有建模實體準備一個數據字典。準确描述各個類的精确含義,描述當前問題中的類的範圍,包括對類的成員、用法方面的假設或限制。
⒊确定關聯
兩個或多個類之間的相互依賴就是關聯。一種依賴表示一種關聯,可用各種方式來實現關聯,但在分析模型中應删除實現的考慮,以便設計時更為靈活。關聯常用描述性動詞或動詞詞組來表示,其中有物理位置的表示、傳導的動作、通信、所有者關系、條件的滿足等。從問題陳述中抽取所有可能的關聯表述,把它們記下來,但不要過早去細化這些表述。
下面是銀行網絡系統中所有可能的關聯,大多數是直接抽取問題中的動詞詞組而得到的。在陳述中,有些動詞詞組表述的關聯是不明顯的。最後,還有一些關聯與客觀世界或人的假設有關,必須同用戶一起核實這種關聯,因為這種關聯在問題陳述中找不到。
銀行網絡問題陳述中的關聯:
·銀行網絡包括出納站和自動出納機;
·分行共享自動出納機;
·分理處提供分理處計算機;
·分理處計算機保存帳戶;
·分理處計算機處理帳戶支付事務;
·分理處擁有出納站;
·出納站與分理處計算機通信;
·出納員為帳戶錄入事務;
·自動出納機接受現金卡;
·自動出納機與用戶接口;
·自動出納機發放現金;
·自動出納機打印收據;
·系統處理并發訪問;
·分理處提供軟件;
·費用分攤給分理處。
隐含的動詞詞組:
·分行由分理處組成;
·分理處擁有帳戶;
·分行擁有分行計算機;
·系統提供記錄保管;
·系統提供安全;
·顧客有現金卡。
基于問題域知識的關聯:
·分理處雇傭出納員;
·現金卡訪問帳戶。
使用下列标準去掉不必要和不正确的關聯:
⑴若某個類已被删除,那麼與它有關的關聯也必須删除或者用其它類來重新表述。在例中,我們删除了"銀行網絡",相關的關聯也要删除。
⑵不相幹的關聯或實現階段的關聯:删除所有問題域之外的關聯或涉及實現結構中的關聯。如"系統處理并發訪問"就是一種實現的概念。
⑶動作:關聯應該描述應用域的結構性質而不是瞬時事件,因此應删除"自動出納機接受現金卡","自動出納機與用戶接口"等。
⑷派生關聯:省略那些可以用其他關聯來定義的關聯。因為這種關聯是冗餘的。
⒋确定屬性
屬性是個體對象的性質,屬性通常用修飾性的名詞詞組來表示.形容詞常常表示具體的可枚舉的屬性值,屬性不可能在問題陳述中完全表述出來,必須借助于應用域的知識及對客觀世界的知識才可以找到它們。隻考慮與具體應用直接相關的屬性,不要考慮那些超出問題範圍的屬性。首先找出重要屬性,避免那些隻用于實現的屬性,要為各個屬性取有意義的名字。按下列标準删除不必要的和不正确的屬性:
⑴對象:若實體的獨立存在比它的值重要,那麼這個實體不是屬性而是對象。如在郵政目錄中,"城市"是一個屬性,然而在人口普查中,"城市"則被看作是對象。在具體應用中,具有自身性質的實體一定是對象。
⑵定詞:若屬性值取決于某種具體上下文,則可考慮把該屬性重新表述為一個限定詞。
⑶名稱:名稱常常作為限定詞而不是對象的屬性,當名稱不依賴于上下文關系時,名稱即為一個對象屬性,尤其是它不惟一時。
⑷标識符:在考慮對象模糊性時,引入對象标識符表示,在對象模型中不列出這些對象标識符,它是隐含在對象模型中,隻列出存在于應用域的屬性。
⑸内部值:若屬性描述了對外不透明的對象的内部狀态,則應從對象模型中删除該屬性。
⑹細化:忽略那些不可能對大多數操作有影響的屬性。
⒌使用繼承來細化類
使用繼承來共享公共機構,以次來組織類,可以用兩種方式來進行。
⑴自底向上通過把現有類的共同性質一般化為父類,尋找具有相似的屬性,關系或操作的類來發現繼承。例如"遠程事務"和"出納事務"是類似的,可以一般化為"事務"。有些一般化結構常常是基于客觀世界邊界的現有分類,隻要可能,盡量使用現有概念。對稱性常有助于發現某些丢失的類。
⑵自頂向下将現有的類細化為更具體的子類。具體化常常可以從應用域中明顯看出來。應用域中各枚舉字情況是最常見的具體化的來源。例如:菜單,可以有固定菜單,頂部菜單,彈出菜單,下拉菜單等,這就可以把菜單類具體細化為各種具體菜單的子類。當同一關聯名出現多次且意義也相同時,應盡量具體化為相關聯的類,例如"事務"從"出納站"和"自動出納機"進入,則"錄入站"就是"出納站"和"自動出納站"的一般化。在類層次中,可以為具體的類分配屬性和關聯。各屬性和都應分配給最一般的适合的類,有時也加上一些修正。
應用域中各枚舉情況是最常見的具體化的來源。
⒍完善對象模型
對象建模不可能一次就能保證模型是完全正确的,軟件開發的整個過程就是一個不斷完善的過程。模型的不同組成部分多半是在不同的階段完成的,如果發現模型的缺陷,就必須返回到前期階段去修改,有些細化工作是在動态模型和功能模型完成之後才開始進行的。
⑴幾種可能丢失對象的情況及解決辦法:
·同一類中存在毫無關系的屬性和操作,則分解這個類,使各部分相互關聯;
·一般化體系不清楚,則可能分離扮演兩種角色的類
·存在無目标類的操作,則找出并加上失去目标的類;
·存在名稱及目的相同的冗餘關聯,則通過一般化創建丢失的父類,把關聯組織在一起。
⑵查找多餘的類。
類中缺少屬性,操作和關聯,則可删除這個類。
⑶查找丢失的關聯。
丢失了操作的訪問路徑,則加入新的關聯以回答查詢。
⑷網絡系統的具體情況作如下的修改:
①現金卡有多個獨立的特性。把它分解為兩個對象:卡片權限和現金卡。
a.卡片權限:它是銀行用來鑒别用戶訪問權限的卡片,表示一個或多個用戶帳戶的訪問權限;各個卡片權限對象中可能具有好幾個現金卡,每張都帶有安全碼,卡片碼,它們附在現金卡上,表現銀行的卡片權限。
b.現金卡:它是自動出納機得到表示碼的數據卡片,它也是銀行代碼和現金卡代碼的數據載體。
②"事務"不能體現對帳戶之間的傳輸描述的一般性,因它隻涉及一個帳戶,一般來說,在每個帳戶中,一個"事務"包括一個或多個"更新",一個"更新"是對帳戶的一個動作,它們是取款,存款,查詢之一。一個"更新"中所有"更新"應該是一個原子操作。
③"分理處"和"分離處理機"之間,"分行"和"分行處理機"之間的區别似乎并不影響分析,計算機的通信處理實際上是實現的概念,将"分理處計算機"并入到"分理處",将"分行計算機"并入到"分行"。
(三)建立動态模型
⒈準備腳本
動态分析從尋找事件開始,然後确定各對象的可能事件順序。在分析階段不考慮算法的執行,算法是實現模型的一部分。
⒉确定事件
确定所有外部事件。事件包括所有來自或發往用戶的信息、外部設備的信号、輸入、轉換和動作,可以發現正常事件,但不能遺漏條件和異常事件。
⒊準備事件跟蹤表
把腳本表示成一個事件跟蹤表,即不同對象之間的事件排序表,對象為表中的列,給每個對象分配一個獨立的列。
⒋構造狀态圖
對各對象類建立狀态圖,反映對象接收和發送的事件,每個事件跟蹤都對應于狀态圖中一條路徑。
(四)建立功能建模
功能模型用來說明值是如何計算的,表明值之間的依賴關系及相關的功能,數據流圖有助于表示功能依賴關系,其中的處理應于狀态圖的活動和動作,其中的數據流對應于對象圖中的對象或屬性。
⒈确定輸入值、輸出值
先列出輸入、輸出值,輸入、輸出值是系統與外界之間的事件的參數。
⒉建立數據流圖
數據流圖說明輸出值是怎樣從輸入值得來的,數據流圖通常按層次組織。
(五)确定操作
在建立對象模型時,确定了類、關聯、結構和屬性,還沒有确定操作。隻有建立了動态模型和功能模型之後,才可能最後确定類的操作。
程序設計
基本思想
面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)的主要思想是把構成問題的各個事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描叙一個事物在整個解決問題的步驟中的行為。面向對象程序設計中的概念主要包括:對象、類、數據抽象、繼承、動态綁定、數據封裝、多态性、消息傳遞。通過這些概念面向對象的思想得到了具體的體現。
傳統的結構化設計方法的基本點是面向過程,系統被分解成若幹個過程。而面向對象的方法是采用構造模型的觀點,在系統的開發過程中,各個步驟的共同的目标是建造一個問題域的模型。在面向對象的設計中,初始元素是對象,然後将具有共同特征的對象歸納成類,組織類之間的等級關系,構造類庫。在應用時,在類庫中選擇相應的類。
面對對象程序設計是盡可能地在模拟人類的思維。通過這樣的方式能夠讓開發的軟件更加符合人類的認知,人們使用起來也能夠更加順手。并且通過應用軟件能夠切實地解決現實生活中的問題。面向對象程序設計使得描述問題的問題空間和問題的解決方法空間組合在一起,并且盡可能地保持一緻。能夠将客觀世界中的抽象問題轉化為具體的問題對象。
面向對象的思維更符合人認識和思考問題的方式,面向對象的概念和應用已經超越了軟件開發和程序設計,擴展到多個的領域,其中一個應用的分支就是面向對象的知識表示法。這種表示法把組成客觀世界的實體抽象為數據和對數據的操作,并使用類把數據和對數據的操作封裝成為一個不可分割、互相依存的整體。面向對象表示的知識更接近客觀世界,表示方案更加自然,易于理解。面向對象技術良好的模塊性,面向對象的系統良好的可維護性、可擴充性和可重用性等特點,正符合人們組織和管理知識庫的需求。
實現
(一)程序設計語言
⒈選擇面向對象語言
采用面向對象方法開發軟件的基本目的和主要優點是通過重用提高軟件的生産率。因此,應該優先選用能夠最完善、最準确地表達問題域語義的面向對象語言。
在選擇編程語言時,應該考慮的其他因素還有:對用戶學習面向對象分析、設計和編碼技術所能提供的培訓操作;在使用這個面向對象語言期間能提供的技術支持;能提供給開發人員使用的開發工具、開發平台,對機器性能和内存的需求,集成已有軟件的容易程度。
⒉程序設計風格
⑴提高重用性。
⑵提高可擴充性。
⑶提高健壯性。
(二)類的實現
在開發過程中,類的實現是核心問題。在用面向對象風格所寫的系統中,所有的數據都被封裝在類的實例中。而整個程序則被封裝在一個更高級的類中。在使用既存部件的面向對象系統中,可以隻花費少量時間和工作量來實現軟件。隻要增加類的實例,開發少量的新類和實現各個對象之間互相通信的操作,就能建立需要的軟件。
一種方案是先開發一個比較小、比較簡單的來,作為開發比較大、比較複雜的類的基礎。
⑴“原封不動”重用。
⑵進化性重用。
一個能夠完全符合要求特性的類可能并不存在。
⑶“廢棄性”開發。
不用任何重用來開發一個新類。
⑷錯誤處理。
一個類應是自主的,有責任定位和報告錯誤。
(三)應用系統的實現
應用系統的實現是在所有的類都被實現之後的事。實現一個系統是一個比用過程性方法更簡單、更簡短的過程。有些實例将在其他類的初始化過程中使用。而其餘的則必須用某種主過程顯式地加以說明,或者當作系統最高層的類的表示的一部分。
在C++和C中有一個main()函數,可以使用這個過程來說明構成系統主要對象的那些類的實例。
(四)面向對象測試
⑴算法層。
⑵類層。
測試封裝在同一個類中的所有方法和屬性之間的相互作用。
⑶模闆層。
測試一組協同工作的類之間的相互作用。
⑷系統層。
把各個子系統組裝成完整的面向對象軟件系統,在組裝過程中同時進行測試。
分類
面向對象方法的提取類似決策樹的構思,從簡到繁,先剔除其他無關信息,再經過多次篩選找出有用的地物類别,實現地物的分層提取。經過多尺度分割後,需要對分割後的單個對象進行劃分,選擇合适的參數或者規則将對象與其他對象區分開來,以實現各種地物的分類。
面向對象分類提取信息的方法較傳統分類方法更具有優勢,前者充分考慮高分辨率影像的各種類型的特征,包括光譜、形狀和紋理等空間特征。而後者是通過選擇訓練樣本,軟件自動建立判别函數對其他未識别的樣本進行判斷。相比而言,面向對象方法在這方面更具有針對性,目标更明确,針對的就是分割後的圖斑,因此分類的結果精度更高。但如何應用好面向對象的方法,需要研究者掌握其相關的軟件操作和機理,比如分割尺度的設定、特征空間的選擇。
使用面向對象分類的過程中,易受人的主觀因素影響。比如特征空間的構建、特征體系的建立,在分類的後處理中也同樣涉及了人機交互修正。因此,面向對象的方法雖然智能,但如果能盡量減少人工的參與,可能會提升該方法的智能化水平。
易混概念
“面向對象”和“基于對象”
面向對象的三大特點(封裝,繼承,多态)缺一不可。通常“基于對象”是使用對象,但是無法利用現有的對象模闆産生新的對象類型,繼而産生新的對象,也就是說“基于對象”沒有繼承的特點。而“多态”表示為父類類型的子類對象實例,沒有了繼承的概念也就無從談論“多态”。很多流行技術都是基于對象的,它們使用一些封裝好的對象,調用對象的方法,設置對象的屬性。但是它們無法讓程序員派生新對象類型。他們隻能使用現有對象的方法和屬性。所以當你判斷一個新的技術是否是面向對象的時候,通常可以使用後兩個特性來加以判斷。“面向對象”和“基于對象”都實現了“封裝”的概念,但是面向對象實現了“繼承和多态”,而“基于對象”沒有實現這些,的确很饒口。
“面向過程”和“面向對象”
面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了;面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描叙某個事物在整個解決問題的步驟中的行為。
可以拿生活中的實例來理解面向過程與面向對象,例如五子棋,面向過程的設計思路就是首先分析問題的步驟:1、開始遊戲,2、黑子先走,3、繪制畫面,4、判斷輸赢,5、輪到白子,6、繪制畫面,7、判斷輸赢,8、返回步驟2,9、輸出最後結果。把上面每個步驟用不同的方法來實現。
如果是面向對象的設計思想來解決問題。面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分為1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤系統,負責繪制畫面,3、規則系統,負責判定諸如犯規、輸赢等。第一類對象(玩家對象)負責接受用戶輸入,并告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的變化就要負責在屏幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。
可以明顯地看出,面向對象是以功能來劃分問題,而不是步驟。同樣是繪制棋局,這樣的行為在面向過程的設計中分散在了多個步驟中,很可能出現不同的繪制版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,繪圖隻可能在棋盤對象中出現,從而保證了繪圖的統一。