天天看點

幹貨!詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析前言架構化的軟體開發方法簡介面向對象的軟體開發方法簡介面向對象開發中的核心思想和概念類、類型UML語言簡介總結

前言

目前在軟體開發領域有兩種主流的開發方法:結構化開發和面向對象開發。結構化開發是一種比較傳統的開發方法,早期的進階程式設計語言,如Basic、C. Fortran和Pascal等,都是支援結構化開發的程式設計語言。随着軟體開發技術的逐漸發展,為了進一步提高軟體的可重用性、可擴充性和可維護性,面向對象的程式設計語言及面向對象設計理論應運而生,Java語言就是一種純面向對象的程式設計語言。

幹貨!詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析前言架構化的軟體開發方法簡介面向對象的軟體開發方法簡介面向對象開發中的核心思想和概念類、類型UML語言簡介總結

一般說來,軟體開發都會經曆以下生命周期:

  • 軟體分析:分析問題領域,了解使用者的需求。
  • 軟體設計: 确定軟體的總體架構,把整個軟體系統劃分成大大小小的多個子系統,設計每個子系統的具體結構。
  • 軟體編碼:用標明的程式設計語言來編寫程式代碼,實作在設計階段勾畫出的軟體藍圖。
  • 軟體測試:測試軟體是否能實作特定的功能,以及測試軟體的運作性能。
  • 軟體部署:為使用者安裝軟體系統,幫助使用者正确地使用軟體。
  • 軟體維護:修複軟體中存在的Bug,當使用者需求發生變化時( 增加新的功能,或者修改已有功能的實作方式),修改相應的軟體。

為了提高軟體開發效率,降低軟體開發成本,一個優良的軟體系統應該具備以下特點:

  • 可重用性:減少軟體中的重複代碼,避免重複程式設計。
  • 可擴充性:當軟體必須增加新的功能時,能夠在現有系統結構的基礎上,友善地建立新的子系統,不需要改變軟體系統現有的結構,也不會影響已經存在的子系統。
  • 可維護性:當使用者需求發生變化時,隻需要修改局部的子系統的少量程式代碼,不會牽一發而動全身, 修改軟體系統中多個子系統的程式代碼。

架構化的軟體開發方法簡介

結構化開發方法主要是按照功能來劃分軟體結構的,它把軟體系統的功能看作是根據給定的輸入資料,進行相應的運算,然後輸出結果,如下圖所示。

幹貨!詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析前言架構化的軟體開發方法簡介面向對象的軟體開發方法簡介面向對象開發中的核心思想和概念類、類型UML語言簡介總結

進行結構化設計時,首先考慮整個軟體系統的功能,然後按照子產品劃分的一些基本原則(比如内聚性和松耦合)等,對功能進行分解,把整個軟體系統劃分成多個子產品,每個子產品實作特定的子功能。為了提高軟體的内聚性,在子產品中還會把功能分解到更小的子子產品中。在完成所有的子產品設計後,把這些子產品拼裝起來,就構成了整個軟體系統。軟體系統可看作是多個子系統的集合,每個子系統都是具有輸入/輸出功能的子產品,如下圖所示。

幹貨!詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析前言架構化的軟體開發方法簡介面向對象的軟體開發方法簡介面向對象開發中的核心思想和概念類、類型UML語言簡介總結

結構化設計屬于自頂向下的設計,在設計階段就不得不考慮如何實作系統的功能,因為分解功能的過程其實就是實作功能的過程。結構化設計的局限性在于不能靈活地适應使用者不斷變化的需求。當使用者需求發生變化,比如要求修改現有軟體功能的實作方式或者要求追加新的功能時,就需要自頂向下地修改子產品的結構,有時候甚至整個軟體系統的設計被完全推翻。

在進行結構化程式設計時,程式的主體是方法,方法是最小的功能子產品,每個方法都是具有輸入/輸出功能的子系統,方法的輸入資料來自于方法參數、全局變量和常量,方法的輸出資料包括方法傳回值,以及指針類型的方法參數。一組相關的方法組合成大的功能子產品。

面向對象的軟體開發方法簡介

面向對象的開發方法把軟體系統看成是各種對象的集合,對象就是最小的子系統,一組相關的對象能夠組合成更複雜的子系統。面向對象的開發方法具有以下優點:

  • 把軟體系統看成是各種對象的集合,這更接近人類認識世界的自然思維方式。
  • 軟體需求的變動往往是功能的變動,而功能的執行者一對象一般不會有大的變化。這使得按照對象設計出來的系統結構比較穩定。
  • 對象包括屬性 (資料)和行為(方法),對象把資料及方法的具體實作方式一起封裝起來,這使得方法和與之相關的資料不再分離,提高了每個子系統的相對獨立性,進而提高了軟體的可維護性。
  • 支援封裝、抽象、繼承和多态等各種特征,提高了軟體的可重用性、可維護性和可擴充性。這些特征将在後面的章節中詳述。
廣義地講,面向對象程式設計是結構化程式設計的一種改進實作方式。傳統的面向過程的結構化程式設計的最小子系統是功能子產品,而面向對象程式設計的最小子系統是對象。

對象模型

在面向對象的分析和設計階段,緻力于建立模拟問題領域的對象模型。建立對象模型既包括自底向上的抽象過程,也包括自頂向下的分解過程。

(1)自底向上的抽象。

建立對象模型的第一步是從問題領域的陳述入手。分析需求的過程與對象模型的形成過程一緻,開發人員與使用者的交談是從使用者熟悉的問題領域中的事物(具體執行個體)開始的,這就使使用者與開發人員之間有了共同語言,使得開發人員能徹底搞清使用者需求,然後再建立正确的對象模型。開發人員需要進行以下自底向上的抽象思維:

  • 把問題領域中的事物抽象為具有特定屬性和行為的對象。比如一個模拟動物園的程式中,存在各種小動物對象,比如各種小貓、小狗等。
  • 把具有相同屬性和行為的對象抽象為類。比如盡管各種小貓、小狗等對象各自不同,但是它們具有相同的屬性和行為,是以可以将各種小貓對象抽象為小貓類,而各種小狗對象抽象為小狗類。
  • 當多個類之間存在一些共性(具有相同屬性和行為)時,把這些共性抽象到父類中。比如在前面的例子中,小貓類和小狗類又可以進一步歸于哺乳動物類。

(2)自頂向下的分解。

在建立對象模型的過程中,也包括自頂向下的分解。例如對于計算機系統,首先識别出主機對象、顯示器對象、鍵盤對象和列印機對象等。接着對這些對象再進一步分解,例如主機對象由處理器對象、記憶體對象、硬碟對象和主機闆對象等組成。系統的進一步分解因有具體的對象為依據,是以分解過程比較明确,而且也相對容易。是以面向對象模組化也具有自頂向下開發方法的優點,既能有效地控制系統的複雜性,又同時避免了結構化開發方法中功能分解的困難和不确定性。

UML:可視化模組化語言

面向對象的分析與設計方法,在20世紀80年代末至90年代中發展到一個高潮。但是,諸多流派在思想和術語上有很多不同的提法,對術語和概念的運用也各不相同,統一是繼續發展的必然趨勢。需要用一種統一的符号來描述在軟體分析和設計階段勾畫出來的對象模型,統一.模組化語言(Unified Modeling Language, UML)應運而生。

UML是一種定義良好、易于表達、功能強大且普遍适用的可視化模組化語言。它吸取了諸多流派的優點,而且有進一步的發展,最終成為大衆所共同接受的标準模組化語言。

面向對象開發中的核心思想和概念

在面向對象的軟體開發過程中,開發者的主要任務就是先建立模拟問題領域的對象模型,然後通過程式代碼來實作對象模型。到底如何建立對象模型,如何用程式代碼實作對象模型,并且能保證軟體系統的可重用、可擴充和可維護性呢?

問題領域、對象、屬性、狀态、行為、方法、實作

問題領域是指軟體系統所模拟的真實世界中的系統。随着計算機技術的發展和普及,軟體系統滲透到社會的各個方面,幾乎可用來模拟任意一種問題領域,如學校、醫院、商場、銀行、電影攝制組和太陽系等。

對象是對問題領域中事物的抽象。對象具有以下特性:

(1)萬物皆為對象。問題領域中的實體和概念都可以抽象為對象。例如在學校領域,對象包括學生、成績單、教師、課程和教室等:在銀行領域,對象包括銀行賬戶、出納員、支票、匯率、現金和驗鈔機等;在商場領域,對象包括客戶、商品、訂單、發票、倉庫和營業員等:在電影攝制組領域,對象包括演員、導演、電影、道具和化妝師等;在太陽系領域,對象包括太陽、月亮、地球、火星和木星等;在用Java語言建立的圖形使用者界面中,視窗、滾動面闆、按鈕、清單、菜單和文本框等也都是對象。

(2)每個對象都是唯一-的。對象的唯一性來自于真實世界中事物的唯一性。世界上不存在兩片一模一樣的葉子,是以在軟體系統中用來模拟每片葉子的對象也具有唯一性。例如學校領域的學生小張、學生小王、小張的成績單和小王的成績單,這些都是唯一的對象。在Java虛拟機提供的運作時環境中,保證每個對象的唯一性的手段是為它在記憶體中配置設定唯一的位址。

(3)對象具有屬性和行為。例如小張,性别女,年齡15,身高1.6米,體重40kg, 能夠學習、唱歌和打羽毛球。小張的屬性包括:姓名、性别、年齡、身高和體重。小張的行為包括:學習、唱歌和打羽毛球。例如一部手機:品牌名稱是諾基亞,價格是2000元,銀白色,能夠拍照、打電話和收發短信等。這隻手機的屬性包括:品牌類型type、 價格price 和顔色color,行為包括拍照takePhoto()、 打電話call)、 收短信sendMessage(和發短信receiveMessage()。

同一個類的所有執行個體具有相同屬性,表明它們的屬性的含義相同,但是它們的狀态不一定相同,也就是屬性取值不一定相同。例如演員小紅、小白和小黃,都有姓名、性别、年齡、身高和體重這些屬性,但是他們的屬性取值不同。

同一個類的所有執行個體包括類本身的所有執行個體,以及其子類的所有執行個體。類的所有執行個體具有相同行為,意味着它們具有一些相同的功能。類本身的所有執行個體按同樣的方式實作相同的功能,而子類與父類之間,以及子類之間的執行個體則可能采用不同的方式來實作相同的功能。

類、類型

類是一組具有相同屬性和行為的對象的抽象。類及類的關系構成了對象模型的主要内容。如下圖所示,對象模型用來模拟問題領域,Java 程式實作對象模型,Java程式運作在Java虛拟機提供的運作時環境中,Java虛拟機運作在計算機機器上。

計算機受其存儲單元的限制,隻能表示和操作一些基本的資料類型,比如整數、字元和浮點數。對象模型中的類可以看作是開發人員自定義的資料類型,Java 虛拟機的運作時環境封裝了把自定義的資料類型映射到計算機的内置資料類型的過程,使得開發人員不必受到計算機的内置資料類型的限制,對任意一種問題領域,都可以友善地根據識别對象、再進行分類(建立任意的資料類型)的思路來建立對象模型。

幹貨!詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析前言架構化的軟體開發方法簡介面向對象的軟體開發方法簡介面向對象開發中的核心思想和概念類、類型UML語言簡介總結

消息、服務

軟體系統的複雜功能是由各種對象向電視機對象發送一個“開機”消息。電視機對象接受到這個“開機”消息,執行相應的開機操作。此外,遙控器還能向電視機發送其他消息,例如選擇頻道、調節音量、播放VCD和關機等。

幹貨!詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析前言架構化的軟體開發方法簡介面向對象的軟體開發方法簡介面向對象開發中的核心思想和概念類、類型UML語言簡介總結

每個對象都具有特定的功能,相對于其他對象而言,它的功能就是為其他對象提供的服務。例如電視機具有的功能包括:開機、關機、選擇頻道、調節音量和播放VCD等。遙控器為了獲得電視機的服務,需要向電視機提出獲得特定服務的請求,提出請求的過程稱為發送消息。對象提供的服務是由對象的方法來實作的,是以發送消息實際上也就是調用一個對象的方法。

接口

既然每個對象是服務提供者,那麼如何對外提供服務呢?對象通過接口對外提供服務。例如電視機的紅外線接收器就是為遙控器提供的接口。再比如在日常生活中經常接觸的電源插口,如果把整個供電系統看作-一個對象,那麼它提供的主要服務就是供電。如何提供這一服務呢? 很簡單,隻要在住宅裡布置好線路,提供一些電源插口,各種電器就能從電源插口中獲得電源了。電源插口就是供電系統為各種電器提供的接口。此外,滑鼠上的按鈕、鍵盤上的按鈕、洗衣機上的按鈕、電燈的開關都是為使用者提供的接口。

在現實世界中,接口也是實體,比如電源插口、洗衣機上的按鈕和電燈的開關。而在面向對象的範疇中,接口是一個抽象的概念,是指系統對外提供的所有服務。系統的接口描述系統能夠提供哪些服務,但是不包含服務的實作細節。這裡的系統既可以指整個軟體系統,也可以指一個子系統。對象是最小的子系統,每個對象都是服務提供者,是以每個對象都有接口。

在Java語言中,接口有兩種意思:

  • 一是指以上介紹的概念性的接口,即指系統對外提供的所有服務,在對象中表現為public類型的方法的聲明。
  • ​二是指用interface 關鍵字定義的實實在在的接口,也稱為接口類型,它用于明确地描述系統對外提供的所有服務,它能夠更加清晰地把系統的實作細節與接口分離。

封裝

封裝是指隐藏對象的屬性和實作細節,僅僅對外公開接口。封裝能為軟體系統帶來以下優點:

(1)便于使用者正确、友善地了解和使用系統,防止使用者錯誤修改系統的屬性。還是以供電系統為例,過去房屋牆壁的.上方都是電線,現在的房屋裡電線都“不見”了,在牆壁上隻露出了一些電源插口。為什麼要把電線藏起來呢?理由很簡單,暴露在外面的電線不安全、也不美觀。

再比如電視機系統,盡管它本身的實作很複雜,但使用者使用起來卻非常簡單,隻要通過遙控器上的幾個按鈕就能享受電視機提供的服務。電視機的實作細節被藏在它的大殼子裡,沒有必要向使用者公開。

(2)有助于建立各個系統之間的松耦合關系,提高系統的獨立性。當某一個系統的實作發生變化,隻要它的接口不變,就不會影響到其他的系統。

(3)提高軟體的可重用性,每個系統都是-一個相對獨立的整體,可以在多種環境中得到重用。例如幹電池就是- -個可重用的獨立系統,在相機、手電筒、電動刮胡刀和玩具賽車中都能發揮作用。

(4)降低了建構大型系統的風險,即使整個系統不成功,個别的獨立子系統有可能依然是有價值的。例如相機損壞了,它的幹電池依然有用,可以安裝到手電筒中。

一個設計良好的系統會封裝所有的實作細節,把它的接口與實作清晰地隔離開來,系統之間隻通過接口進行通信。面向對象的程式設計語言主要是通過通路控制機制來進行封裝的,這種機制能控制對象的屬性和方法的可通路性。在Java語言中提供了4種通路控制級别:

  • public:對外公開,通路級别最高。
  • protected:隻對同一個包中的類或者子類公開。
  • 預設:隻對同一個包中的類公開。
  • private:不對外公開,隻能在對象内部通路,通路級别最低。

繼承

在父類和子類之間同時存在着繼承和擴充關系。子類繼承了父類的屬性和方法,同時,子類中還可以擴充出新的屬性和方法,并且還可以覆寫父類中方法的實作方式。覆寫也是專用術語,是指在子類中重新實作父類中的方法。

從每個對象都是服務提供者的角度來了解,子類會提供和父類相同的服務,此外子類還可以提供父類所沒有的服務,或者覆寫父類中服務的實作方式。例如手機,早期生産的手機具有打電話的功能,但不具有拍照功能,現在的一些新款手機繼承了打電話的功能,而且增加了拍照功能。

繼承與擴充同時提高了系統的可重用性和可擴充性。例如,手機和計算機之是以能迅猛地更新換代,具備越來越多的功能,就是因為當廠商在生産新型号的手機和計算機時,他們不必從頭生産,而是在原有手機和計算機的基礎上進行更新。

繼承與擴充導緻面向對象的軟體開發領域中架構類軟體系統的發展。從頭建構一個複雜軟體系統的工作量巨大,為了提高開發效率,有一些組織開發了一些通用的軟體架構。有了這些軟體架構,新的軟體系統就不必從頭開發,隻需要在這些通用軟體架構的基礎上進行擴充。

幹貨!詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析前言架構化的軟體開發方法簡介面向對象的軟體開發方法簡介面向對象開發中的核心思想和概念類、類型UML語言簡介總結

目前在Java領域比較流行的架構軟體包括:

  • ​JavaEE:Oracle公司制定的分布式分層的企業應用的軟體架構,它把企業應用分為客戶層、JavaWeb層、應用服務層和資料庫層。在JavaWeb層的擴充點主要是Servlet類和JSP,應用服務層的擴充點主要是EJB元件。
  • Struts: Apache開放源代碼組織為JavaWeb應用建立的通用架構,采用模型一視圖一控制器(Model-View-Controller, MVC)設計模式,它的最主要的擴充點是控制器層的Action類。
  • JSF:Oracle公司為JavaWeb應用的界面建立的通用架構。
  • Spring: Spring 開放源代碼組織為企業應用的服務層建立的通用架構。

UML語言簡介

1997年,對象管理組織(Object Management Group, OMG)釋出了統一模組化語言(Unified Modeling Language, UML)。UML的目标之一就是為開發團隊提供标準、通用的面向對象設計語言。UML提供了一套IT專業人員期待多年的統一的标準 模組化符号。通過使用UML,這些人員能夠閱讀和交流系統架構圖和設計規劃圖,就像建築人多年來使用建築設計圖一樣。

幹貨!詳解Java面向對象開發方法,看清華大牛帶你深入淺出剖析前言架構化的軟體開發方法簡介面向對象的軟體開發方法簡介面向對象開發中的核心思想和概念類、類型UML語言簡介總結

UML采用一些标準圖形元素來直覺地表示對象模型,是以它是一種可視化的面向對象的模組化語言。UML主要包含以下一些框圖:

  • 用例圖(Use Case Diagram):從使用者角度描述系統功能。
  • 類框圖(Class Diagram):描述對象模型中類及類之間的關系。
  • 狀态轉換圖( State Transition Diagram):描述對象所有可能的狀态,以及導緻狀态轉換的轉移條件。隻需要為個别具有複雜的狀态轉換過程的類提供狀态轉換圖。
  • 時序圖(Sequence Diagram)和協作圖(Cooperation Diagram): 描述對象之間的互動關系。其中時序圖顯示對象之間的動态協作關系,它強調對象之間消息發送的時間順序,同時顯示對象之間的互動;協作圖能直覺地顯示對象之間的協作關系。這兩種圖合稱為互動圖。
  • 元件圖(Component Diagram): 描述系統中各個軟體元件之間的依賴關系,還可以描述軟體元件的源代碼的組織結構。
  • 部署圖(Deployment Diagram):定義系統中軟硬體的實體體系結構。它可以顯示實際的計算機和裝置(用節點表示),以及它們之間的連接配接關系,在節點中,還可以顯示軟體元件在硬體環境中的布局。

在以上框圖中,其中用例圖、類框圖、元件圖和部署圖等4個圖形,構成了系統的靜态模型;而狀态轉換圖、時序圖和協作圖則構成了系統的動态模型。是以,UML的主要框圖也可以歸納為靜态模型和動态模型兩大類。

總結

本篇結合實際例子,探讨了如何運用面向對象思維來建構可維護、可重用和可擴充的軟體系統。面向對象的核心思想和概念包括:抽象、封裝、接口、多态和繼承,靈活運用這些理論武器,就會使得軟體系統像用積木搭起來的系統一 樣,可以友善地進行組裝、拆卸和重用。

喜歡文章請多多點贊評論轉發,關注筆者,後續會再帶來更豐富的學習内容更新,你們的支援就是筆者最大的動力!!!