- UML 建模、設計與分析:從新手到高手
- 夏麗華
- 5856字
- 2019-12-09 14:44:18
1.5 面向對象開發
面向對象(Object Oriented,OO)是軟件開發方法,它是一個依賴于幾個基本原則的思想庫,目前已經席卷了整個軟件界。面向對象是一種對現實世界理解和抽象的方法,是計算機編程技術發展到一定階段后的產物,它強調在軟件開發過程中面向客觀世界或問題域中的事物,采用人類在認識客觀世界的過程中普遍運用的思維方法,直觀、自然地描述客觀世界中的有關事物。目前,面向對象的概念和應用已超越了程序設計和軟件開發,擴展到如數據庫系統、交互式界面、分布式系統、網絡管理結構、CAD技術、人工智能等領域。
1.5.1 面向對象的概念
面向對象不僅是一些具體的軟件開發技術與策略,而且是一整套關于如何看待軟件系統與現實世界的關系,用什么觀點來研究問題并進行求解,以及如何進行系統構造的軟件方法學。
面向對象的核心是對象,它是系統中用來描述客觀事物的一個實體,它是構成系統的一個基本單位。一個對象由一組屬性和對這組屬性進行操作的一組服務組成。從更抽象的角度來說,對象是問題域或實現域中某些事物的一個抽象,它反映該事物在系統中需要保存的信息和發揮的作用;它是一組屬性和有權對這些屬性進行操作的一組服務的封裝體??陀^世界是由對象和對象之間的聯系組成的。
面向對象的軟件工程方法的基礎是面向對象編程語言。一般認為,誕生于1967年的Simula-67是第一種面向對象的編程語言。盡管該語言對后來許多面向對象語言的設計產生了很大的影響,但它并沒有后續版本。繼而,20世紀80年代初,Smalltalk語言掀起了一場“面向對象”運動。隨后便誕生了面向對象的C++、Eiffel和CLOS等語言。盡管當時面向對象的編程語言在實際使用中具有一定的局限性,但它仍被廣泛關注,一批批面向對象編程書籍層出不窮。直到今天,面向對象編程語言數不勝數,在眾多領域發揮著各自的作用,如C++、Java、C#、VB.NET和C++.NET等。隨著面向對象技術的不斷完善,面向對象技術逐漸在軟件工程領域得到了應用。
面向對象的軟件工程方法包括面向對象分析(OOA)、面向對象設計(OOD)、面向對象編程(OOP)等內容。
1.面向對象分析
OOA是應用面向對象方法進行系統分析的。OOA是面向對象方法從編程領域向分析領域發展的產物。從根本上講,面向對象是一種方法論,不僅僅是一種編程技巧和編程風格,而且是一套可用于軟件開發全過程的軟件工程方法。OOA是其中第一個環節。OOA的基本任務是運用面向對象方法,從問題域中獲取需要的類和對象,以及它們之間的各種關系。
2.面向對象設計
OOD指面向對象設計,在軟件設計生命周期中發生于OOA之后。在面向對象的軟件工程中,OOD是軟件開發過程中的一個大階段,其目標是建立可靠的、可實現的系統模型;其過程是完善OOA的成果,細化分析。其與OOA的關系為:OOA表達了“做什么”,而OOD則表達了“怎么做”,即分析只解決系統“做什么”,不涉及“怎么做”,而設計則解決“怎么做”的問題。
3.面向對象編程
OOP就是使用某種面向對象的語言,實現系統中的類和對象,并使得系統能夠正常運行。在理想的OO開發過程中,OOP只是簡單地使用編程語言實現了OOA和OOD分析和設計模型。
1.5.2 面向對象開發的概述
面向對象開發方法的原則是,鼓勵軟件開發者在軟件生命周期內應用其概念來工作和思考。只有較好地識別、組織和理解了應用領域的內在概念,才能有效表達出數據結構和函數的細節。
面向對象開發只有到了最后幾個階段,才不是獨立于編程語言的概念過程。所以,可以將面向對象開發看作是一種思維方式,而不是一種編程技術。它的最大好處在于幫助規劃人員、開發者和客戶清晰地表達出抽象的概念,并將這些概念互相傳達。它可以充當規約、分析、文檔、接口以及編程的一種媒介。
為了加深讀者對面向對象開發的理解,下面將它與傳統軟件開發作比較。面向對象的開發方法把完整的信息系統看成對象的集合,用這些對象來完成所需要的任務。對象能根據情況執行一定的行為,并且每個對象都有自己的數據。而傳統開發方法則把系統看成一些與數據交互的過程,這些數據與過程隔離保存在不同文件中,當程序運行時,就創建或修改數據文件。下圖顯示了面向對象開發與傳統軟件開發之間的區別。

過程通過接收輸入的數據,對它進行處理,隨后保存數據或輸出數據。面向對象則是通過接收消息來更新它的內部數據。這些差別雖然看起來簡單,但對整個系統的分析、設計和實現來說卻非常重要。

任何一種開發方法,在開發系統之前,開發人員都會對此項目進行分析。系統需求分析就是對系統需求的研究、了解和說明。系統需求定義了系統要為從事業務活動的用戶完成的任務。這些需求一般用圖表來描述。對圖表進行規范化后就構成了該系統的基本需求模型。系統分析過程中建立的模型被稱為邏輯模型,因為它僅描述了系統的需求,所以不涉及如何實現此需求。系統設計就是建立一個新模型,該模型展示了組成軟件系統所使用的技術。系統設計過程中建立的模型也稱為物理模型。
在傳統的結構化分析和設計中,開發人員也使用圖形模型,如數據流圖(DFD)用來表示輸入、輸出和處理,還要建立實體關系圖(ERD),以表示有關存儲數據的詳細信息。它的設計模型主要由結構圖等構成。
在OO開發中,因為需要描述不同的對象,所以OO開發中建立的模型不同于傳統模型。例如,OO開發不僅需要用數據和方法來描述建模,還需要用模型來描述對象之間的交互。OO開發中使用UML來構造模型。
OO開發方法不僅在模型上與傳統的開發方法不同,系統開發生命周期也不同。系統開發生命周期是開發一個項目的管理框架,它列出了開發系統時的每個階段和在每個階段所要完成的任務。幾個主要的階段有計劃、分析、設計、實現和支持。系統開發生命周期最初用在傳統的系統開發中,但它也能用在OO開發中。OO開發人員經常使用迭代開發方法來分析、設計和實現。
迭代開發方法就是先分析、設計,編寫部分程序完成系統需求的一部分,然后再分析、設計、編程完成其他需求。下圖演示了迭代開發方法。
迭代開發方法和早期瀑布開發方法形成了鮮明對比。在瀑布開發方法中,在開始設計前要完成所有的需求分析,然后在需求分析的基礎上進行系統設計,編程工作要在系統分析和設計完成后才進行。雖然傳統開發方法也使用了迭代開發方法,但是因為每個迭代過程都涉及改進和增加模塊的功能,而且在OO開發過程中每次迭代只需增加一個類,所以OO開發比傳統開發更適用于迭代開發。
OO方法在建造系統模型和描述系統如何工作方面和傳統的編程方法不同,但在系統開發生命周期和項目管理中,OO開發仍然和傳統系統開發有相似之處。
1.5.3 面向對象的主要特征
為了進一步理解面向對象的內涵,還需要進一步了解面向對象的主要特征。

1.抽象
抽象(Abstract)是忽略事物中與當前目標無關的非本質特征,更充分地注意與當前目標有關的本質特征,從而找出事物的共性,并把具有共性的事物劃為一類,得到一個抽象的概念。
例如,在設計一個學生管理系統的過程中以學生李華為例,就只關心他的學號、班級、成績等,而忽略他的身高、體重等信息。因此,抽象性是對事物的抽象概括和描述,實現了客觀世界向計算機世界的轉化。將客觀事物抽象成對象及類是比較難的過程,也是面向對象方法的第一步。例如,將學生抽象成對象及類的過程如下圖所示。
2.封裝
封裝是面向對象的一個重要原則。封裝指將對象屬性和操作結合在一起,構成一個獨立的對象。它的內部信息是隱蔽的,不允許外界直接存取對象的屬性,而只能通過指定的接口與對象聯系。
封裝使得對象屬性和操作緊密結合在一起,這反映了事物的狀態特性和動作與事物不可分割的特征。系統中把對象看成其屬性和操作的結合體,就使對象能夠集中而完整地描述一個事物,避免了將數據和功能分離開進行處理,從而使得系統的組成與現實世界中的事物具有良好的對應性。
封裝的信息隱蔽作用反映出事物的獨立性。這樣使得對于對象外部而言,只需要注意對象對外呈現的行為,而不必關心其內部的工作細節。封裝可以使軟件系統的錯誤局部化,從而大大降低查錯和排錯的難度。另一方面,當修改對象內部時,由于它只通過操作接口對外部提供服務,因此大大減少了內部修改對外部的影響。
3.繼承
繼承是指子類可以擁有父類的全部屬性和操作。繼承是OO方法的一個重要概念,并且是OO技術可以提高軟件開發效率的一個重要原因。
建造系統模型時,可以根據所涉及的事物的共性抽象出一些基本類,在此基礎上再根據事物的個性抽象出新的類。新類既具有父類的全部屬性和操作,又具有自己獨特的屬性和操作。父類與子類的關系為一般與特殊的關系。
繼承機制具有特殊的意義。由于子類可以自動擁有父類的全部屬性和操作,這樣使得定義子類時,不必重復定義那些在父類中已經定義過的屬性和操作,只需要聲明該類是某個父類的子類,將精力集中在定義子類所特有的屬性和操作上。這樣就提高了軟件的可重用性。
繼承具有傳遞性。如果子類B繼承了類A,而子類C又繼承了類B,則子類C可以繼承類A和類B的所有屬性和操作。這樣,子類C的對象除了具有該類的所有特性外,還具有全部父類的所有特性。
如果限定每個子類只能單獨繼承一個父類的屬性和操作,則這種繼承稱為單繼承。在有些情況下,一個子類可以同時繼承多個父類的屬性和操作,這種繼承稱為多重繼承。
4.多態性
在面向對象的開發中,多態性是指在父類中定義的屬性和操作被子類繼承后,可以具有不同的數據類型或表現出不同的行為。例如,定義一個父類“幾何圖形”時,為其定義了一個繪圖操作。當子類“橢圓”和“矩形”都繼承了幾何圖形類的繪圖操作時,該操作根據不同的類對象將執行不同的操作。在“橢圓”類對象調用繪圖操作時,該操作將繪制一個橢圓,而當“矩形”類對象執行該操作時,將繪制一個矩形。這樣,當系統的其他部分請求繪制一個幾何圖形時,同樣的“繪圖”操作消息因為接收消息的對象不同,將執行不同的操作。
在父類與子類的類層次結構中,利用多態性可以使不同層次的類共享一個方法名,而各自有不同的操作。當一個對象接收到一個請求消息時,采取的操作將根據該對象所屬的類決定。
在繼承父類的屬性和操作的名稱時,子類也可以根據自己的情況重新定義該方法。這種情況稱為重載。重載是實現多態性的方法之一。
5.關聯
在現實世界中,事物不是孤立的、互相無關的,而是彼此之間存在著各種各樣的聯系。例如,在一個學校中,有教師、學生、教室等事物,它們之間存在著某種特定的聯系。在面向對象的方法中,用關聯來表示類或對象集合之間的這種關系。在面向對象中,常把對象之間的連接稱為鏈接,而把存在對象連接的類之間的聯系稱為關聯。
如果在OOA和OOD階段定義了一個關聯,那么在實現階段必須通過某種數據結構來實現它。關聯還具有多重性,多重性表示關聯的對象之間數量上的約束,有一對一、一對多、多對多等不同的情況。
6.聚合
現實世界中既有簡單的事物,也有復雜的事物。當人們認識比較復雜的事物時,常用的思維方法為:把復雜的事物分解成若干個比較簡單的事物。在面向對象的技術中,像這樣將一個復雜的對象分解為幾個簡單對象的方法稱為聚合。
聚合是面向對象方法的基本概念之一。它指定了系統的構造原則,即一個復雜的對象可以分解為多個簡單對象。同時,它也表示為對象之間的關系:一個對象可以是另一個對象的組成部分,同時,該對象也可以由其他對象構成。
7.消息
消息是指對象之間在交互中所傳遞的通信信息。當系統中的其他對象需要請求該對象執行某個操作時,就向其發送消息,該對象接收消息并完成指定的操作,然后把操作結果返回到請求服務的對象。
一個消息一般應該含有如下信息:接收消息的對象、請求該對象提供的服務、輸入信息和響應信息。
消息在面向對象的程序中具體表現為函數調用,或其他類似于函數調用的機制。對于一個順序系統,由于其不存在并發執行多個任務的情況,其操作是按順序執行的,因此其消息實現目前主要為函數調用。而在并發程序和分布式程序中,消息則為進程間的通信機制和遠程調用過程等其他通信機制。
1.5.4 面向對象的層
面向對象的開發中,通常把面向對象系統中相互聯系的所有對象分成3層:數據訪問層、業務邏輯層和表示層,區分層次的目的是遵循“高內聚、低耦合”的思想。它們的作用如下。
1.數據訪問層
主要是針對原始數據(數據庫或者文本文件等存放數據的形式)進行操作的層,而不是指原始數據。也就是說,是對數據的操作,而不是數據庫,具體為業務邏輯層或表示層提供數據服務。
2.業務邏輯層
主要是針對具體問題的操作,也可以理解成對數據層的操作,對數據業務進行邏輯處理。如果說數據層是積木,那邏輯層就是對這些積木的搭建。

3.表示層
簡單來說,表示就是展現給用戶的界面,即用戶在使用一個系統時的所見所得,像菜單、按鈕和輸入框等都屬于這一層。下圖是在圖書管理系統中添加學生信息和借書信息操作時的三層過程。
從上圖中可以看出,管理員和圖形用戶界面(表示層)交流,圖形用戶界面一般由包含表示對象的窗口組成,窗口中包含按鈕、菜單、工具欄的窗體。用戶不能直接和業務邏輯層交互,而是通過鼠標和鍵盤對用戶界面進行操作,使表示層與業務邏輯層交互。
當業務邏輯層中的對象需要保存實現持久化時,就需要使用數據庫實現對象的持久性,即保存對象中的數據。每個過程需要為每個邏輯類定義一個單獨的數據訪問層,以便處理數據和保存有用的信息。
提示
這3層構成了系統的物理模型。在構造系統模型過程中,開發人員會使用UML作為建造模型的工具。下節將介紹與此對應的3種模型。
1.5.5 面向對象的模型
UML中提供了3種面向對象的模型,使用這3種模型從不同的視角來描述系統,它們分別是描述系統內部對象及其關系的類模型,描述對象生命歷史的狀態模型,以及描述對象之間交互行為的交互模型。每種模型都會在開發的所有階段中得到應用,并隨著開發過程的進行獲得更多的細節。對系統的完整描述,需要所有這3種視角的模型。
1.類模型
類模型(Class Model)描述了系統內部對象及其關系的靜態結構。類模型界定了軟件開發的上下文,包含類圖。類圖(Class Diagram)的節點是類,弧表示類間的關系。
2.狀態模型
狀態模型(State Model)描述了對象隨著時間發生變化的那些方面。狀態模型使用狀態圖確定并實現控制。狀態圖(State Diagram)的節點是狀態,弧是由事件引發的狀態間的轉移。
3.交互模型
交互模型(Interaction Model)描述系統中的對象如何協作,以完成更廣泛的任務。交互模型自用例開始,用例的概念隨后會用順序圖和活動圖詳細描述。用例(Use Case)關注系統的功能,即系統為用戶做了哪些事情。順序圖(Sequence Diagram)顯示交互的對象以及發生交互的時間順序?;顒訄D(Activity Diagram)描述重要的處理步驟。
上述的3個模型描述了一套完整系統的相互獨立的部分,但它們又是交叉相連的。類模型是最基本的,因為在描述何時以及如何發生變化之前,要先描述是哪些內容正在發生變化。
- iOS Game Programming Cookbook
- DBA攻堅指南:左手Oracle,右手MySQL
- Web前端開發技術:HTML、CSS、JavaScript(第3版)
- MATLAB實用教程
- PHP+MySQL+Dreamweaver動態網站開發實例教程
- Python貝葉斯分析(第2版)
- Learn React with TypeScript 3
- Hands-On Swift 5 Microservices Development
- Mastering Ext JS
- Elasticsearch for Hadoop
- C#應用程序設計教程
- Odoo 10 Implementation Cookbook
- 微課學人工智能Python編程
- C++程序設計教程
- Developing Java Applications with Spring and Spring Boot