怎样用uml类图生成java类_JAVA:面向对象编程的底层逻辑,深度剖析
什么是面向?qū)ο?/h2>
在目前的軟件開(kāi)發(fā)領(lǐng)域有兩種主流的開(kāi)發(fā)方法,分別是結(jié)構(gòu)化開(kāi)發(fā)方法和面向?qū)ο箝_(kāi)發(fā)方法。早期的編程語(yǔ)言如C、Basic、Pascal等都是結(jié)構(gòu)化編程語(yǔ)言,隨著軟件開(kāi)發(fā)技術(shù)的逐漸發(fā)展,人們發(fā)現(xiàn)面向?qū)ο罂梢蕴峁└玫目芍赜眯浴⒖蓴U(kuò)展性和可維護(hù)性,于是催生了大量的面向?qū)ο蟮木幊陶Z(yǔ)言,如C++、Java、C#和Ruby等。
面向?qū)ο蟪绦蛟O(shè)計(jì)即OOP,是Object-Oriented Programming的縮寫。面向?qū)ο缶幊碳夹g(shù)是一種起源于20世紀(jì)60年代的Simula語(yǔ)言,其自身理論已經(jīng)十分完善,并被多種面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言(Object-Oriented Programming Langunianling,OOPL)實(shí)現(xiàn)。由于很多原因,國(guó)內(nèi)大部分程序設(shè)計(jì)人員并沒(méi)有很深的OOP以及OOPL理論,很多人從一開(kāi)始學(xué)習(xí)到工作很多年都只是接觸到C/C++、Java等靜態(tài)類型語(yǔ)言,而對(duì)純粹的OOP思想以及動(dòng)態(tài)類型語(yǔ)言知之甚少。
對(duì)象的產(chǎn)生通常基于兩種基本方式,分別是以原型對(duì)象為基礎(chǔ)產(chǎn)生新對(duì)象和以類為基礎(chǔ)產(chǎn)生新對(duì)象。
1.基于原型
原型模型是以一個(gè)有代表性的對(duì)象為基礎(chǔ)來(lái)產(chǎn)生各種新的對(duì)象,并由此繼續(xù)產(chǎn)生更符合實(shí)際應(yīng)用的對(duì)象。而原型—委托也是OOP中的對(duì)象抽象,是代碼共享機(jī)制中的一種。
2.基于類
一個(gè)類提供了一個(gè)或多個(gè)對(duì)象的通用性描敘。從形式化的觀點(diǎn)看,類與類型有關(guān),因此,一個(gè)類相當(dāng)于是從該類中產(chǎn)生的實(shí)例的集合。
Java的面向?qū)ο缶幊?/h2>
面向?qū)ο缶幊谭椒▽W(xué)是Java編程的指導(dǎo)思想。在使用Java進(jìn)行編程時(shí),應(yīng)該首先利用對(duì)象建模技術(shù)(OMT)來(lái)分析目標(biāo)問(wèn)題,抽象出相關(guān)對(duì)象的共性,對(duì)它們進(jìn)行分類,并分析各類之間的關(guān)系;然后再用類來(lái)描述同一類對(duì)象,歸納出類之間的關(guān)系。Coad和Yourdon在對(duì)象建模技術(shù)、面向?qū)ο缶幊毯椭R(shí)庫(kù)系統(tǒng)的基礎(chǔ)之上設(shè)計(jì)了一整套面向?qū)ο蟮姆椒?#xff0c;具體來(lái)說(shuō)分為面向?qū)ο蠓治?OOA)和面向?qū)ο笤O(shè)計(jì)(OOD)。對(duì)象建模技術(shù)、面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計(jì)共同構(gòu)成了系統(tǒng)設(shè)計(jì)的過(guò)程,如圖1所示。
圖1 系統(tǒng)設(shè)計(jì)處理流程
UML統(tǒng)一建模語(yǔ)言
在進(jìn)行對(duì)象建模、面向?qū)ο蠓治龊驮O(shè)計(jì)的過(guò)程中,需要使用建模語(yǔ)言來(lái)描述分析的過(guò)程和結(jié)果。統(tǒng)一建模語(yǔ)言即UML,是Unified Modeling Langunianling的縮寫。UML是為了實(shí)現(xiàn)上述目標(biāo)而設(shè)計(jì)的一種標(biāo)準(zhǔn)通用的設(shè)計(jì)語(yǔ)言。
1.UML圖的類型
UML為我們提供了多種類型的模型描述圖,當(dāng)在某種給定的方法學(xué)中使用這些圖時(shí),人們就能更容易理解和交流設(shè)計(jì)思想。UML圖可以分為如下3種類型。
(1)靜態(tài)圖。
靜態(tài)圖即Static Diagram,其功能是描述了不發(fā)生任何變化的軟件元素的邏輯結(jié)構(gòu),描繪了類、對(duì)象和數(shù)據(jù)結(jié)構(gòu)及其存在于它們之間的關(guān)系。
(2)動(dòng)態(tài)圖。
動(dòng)態(tài)圖即Dynamic Diagram,其功能是展示軟件實(shí)體在運(yùn)行期間的的變化,主要描繪了執(zhí)行流程、實(shí)體改變狀態(tài)的方式。
(3)物理圖。
物理圖即Physical Diagram,其功能是顯示軟件實(shí)體不變化的物理結(jié)構(gòu),主要用來(lái)描繪庫(kù)文件、字節(jié)文件和數(shù)據(jù)文件等,以及存在于它們之間的相互關(guān)系。
2.類圖和對(duì)象圖
在Java中,通常使用類圖和對(duì)象圖來(lái)表示項(xiàng)目?jī)?nèi)程序類的結(jié)構(gòu)和各元素間的對(duì)應(yīng)關(guān)系。在下面的內(nèi)容中,將簡(jiǎn)要介紹類圖和對(duì)象圖的基本知識(shí)。
(1)類圖。
類圖表示不同的實(shí)體間的相互關(guān)系,顯示了系統(tǒng)的靜態(tài)結(jié)構(gòu)。類圖可用于表示邏輯類,邏輯類通常是指事物的種類,比如球隊(duì)、電影之類的抽象描述。類圖還可以用于表示實(shí)現(xiàn)類,實(shí)現(xiàn)類就是程序員要編寫的類。實(shí)現(xiàn)類圖與邏輯類圖可能會(huì)用來(lái)描述一些相同的類。然而,實(shí)現(xiàn)類圖與邏輯類圖不會(huì)使用相同的描述屬性。
類圖通常用矩形表示,并在矩形內(nèi)將類分為3個(gè)部分。其中最上面的部分顯示類的名稱,中間部分顯示類的屬性,最下面的部分顯示類的方法,例如圖2所示的格式。
圖2 典型類圖結(jié)構(gòu)
注意
在現(xiàn)實(shí)應(yīng)用中,最常用、最簡(jiǎn)單的類圖就是一個(gè)在里面顯示了類名的長(zhǎng)方形。在大多數(shù)的UML中,多數(shù)類只要有一個(gè)能夠清楚表達(dá)的命名就可以了。
在類名部分還可以顯示類的構(gòu)造類型,類的構(gòu)造型在雙角括符號(hào)“? ?”之間指定,并放在類的名稱上面。常見(jiàn)的構(gòu)造類型包括如下3類。
- 實(shí)現(xiàn)類:直接顯示類的名稱。
- 接口:在類名上方的雙角括符號(hào)“? ?”內(nèi)顯示。
- 工具類:在類名上方的雙角括符號(hào)“? ?”內(nèi)顯示。
如果類名用斜體表示,或者在類名下面,則表示這個(gè)類是一個(gè)抽象類。
在屬性和方法的前面可以用修飾符“+”或“-”,其功能是表示屬性或方法的作用域,具體說(shuō)明如下所示。
- 修飾符“-”:表示屬性或方法是私有的(private)。
- 修飾符“#”:表示屬性或方法是保護(hù)的(protected)。
- 修飾符“+”:表示屬性或方法是公用的(public)。
通常在類的屬性或方法參數(shù)名稱的冒號(hào)后,顯示了屬性的類型或方法的參數(shù)的類型。方法的返回值類型顯示在方法后面的冒號(hào)之后。
例如圖3顯示了一個(gè)Lei類的類圖結(jié)構(gòu)。
圖3 Lei類的類圖結(jié)構(gòu)
(2)對(duì)象圖。
對(duì)象圖的功能是用來(lái)表示類的實(shí)例化對(duì)象。通常用一個(gè)兩層的矩形結(jié)構(gòu)來(lái)表示對(duì)象圖,其中上層標(biāo)識(shí)對(duì)象名和類名,下層標(biāo)識(shí)對(duì)象的實(shí)例化屬性值。例如在下面的代碼中,創(chuàng)建了一個(gè)Lei類的對(duì)象mm。
Lei mm = new Lei("mm", 'F', 24);上述mm對(duì)象的對(duì)象圖如圖4所示。
圖4 對(duì)象圖示例
在同一個(gè)應(yīng)用項(xiàng)目中,類之間可能存在如下多種類別的相互關(guān)系。
- 繼承:即inheritance,是指一個(gè)類從其父類派生而來(lái),繼承了父類的屬性和方法。基于類的繼承叫做一般化(generalization),基于接口的繼承,叫做實(shí)現(xiàn)(realization)。
- 關(guān)聯(lián):即association,類之間的關(guān)聯(lián)大多用來(lái)表示變量實(shí)例持有對(duì)其他對(duì)象的引用,這種關(guān)系是半永久的,并沒(méi)有包含關(guān)系。
- 依賴:即dependency,是不同類實(shí)例之間的暫時(shí)相互關(guān)系。
- 聚合:即aggregation,是關(guān)聯(lián)的一種特殊形式,代表著一種整體和部分的關(guān)系。并且里面的部分可以作為其他整體的部分,而部分和整體之間也沒(méi)有生命期的依賴。
- 組合:即composition,是聚合的一種特殊形式。組合的關(guān)聯(lián)性比聚合更強(qiáng),而部分只能作為唯一的一個(gè)整體的部分,而且部分的生命周期依賴于整體的生命周期。
UML是一種設(shè)計(jì)語(yǔ)言,它的目的不是表現(xiàn)細(xì)節(jié),而是表現(xiàn)結(jié)構(gòu),僅僅展示必要的細(xì)節(jié)。所以UML不可能與源代碼一一對(duì)應(yīng),只是在結(jié)構(gòu)上存在了某種對(duì)應(yīng)關(guān)系。
3.序列圖和狀態(tài)圖
除了前面介紹的類圖和對(duì)象圖外,在Java中還可以使用序列圖和狀態(tài)圖來(lái)表示項(xiàng)目?jī)?nèi)程序類的結(jié)構(gòu)和各元素間的對(duì)應(yīng)關(guān)系。在下面的內(nèi)容中,將對(duì)序列圖和狀態(tài)圖的基本知識(shí)進(jìn)行簡(jiǎn)要介紹。
(1)序列圖。
序列圖顯示具體用例(或用例的一部分)的詳細(xì)流程,它不但顯示了流程中不同對(duì)象之間的交互關(guān)系,而且還可以很詳細(xì)地顯示對(duì)不同對(duì)象的各種調(diào)用。在序列圖中有如下兩個(gè)維度。
- 垂直維度:以發(fā)生的時(shí)間順序顯示消息/調(diào)用的序列。
- 水平維度:顯示對(duì)象實(shí)例之間的交互。
對(duì)象之間的交互存在如下5種關(guān)系。
- 調(diào)用:即call,一個(gè)對(duì)象調(diào)用另一個(gè)對(duì)象(或本身)的方法。
- 返回:即return,返回一個(gè)值作為方法調(diào)用的結(jié)果。
- 發(fā)送:即send,一個(gè)對(duì)象給另一個(gè)對(duì)象(或本身)異步發(fā)送一個(gè)消息。
- 創(chuàng)建:即create,一個(gè)對(duì)象實(shí)例化另一個(gè)對(duì)象。
- 銷毀:即destroy,一個(gè)對(duì)象銷毀另一個(gè)對(duì)象(或本身)。
繪制序列圖的方法非常簡(jiǎn)單,通常用圖頂部的框表示類的實(shí)例對(duì)象,框中的類實(shí)例名稱和類名稱之間用空格/冒號(hào)/空格來(lái)分隔。如果某個(gè)類實(shí)例向另一個(gè)類實(shí)例發(fā)送了處理消息,則繪制一條具有指向接收類實(shí)例的開(kāi)箭頭的連線,并把處理的名稱放在連線上面。對(duì)于某些特別重要的消息,可以繪制一條具有指向發(fā)起類實(shí)例的開(kāi)箭頭的虛線,將返回值標(biāo)注在虛線上。有助于序列圖的閱讀。
(2)狀態(tài)圖。
狀態(tài)圖表示某個(gè)類所處的不同狀態(tài)和該類的狀態(tài)轉(zhuǎn)換信息。每個(gè)類都有狀態(tài),但不是每個(gè)類都應(yīng)該有一個(gè)狀態(tài)圖。只有當(dāng)行為的改變和狀態(tài)有關(guān)時(shí)才創(chuàng)建狀態(tài)圖。一般只描述在系統(tǒng)活動(dòng)期間具有3個(gè)或更多潛在狀態(tài)的類的狀態(tài)圖。
狀態(tài)圖中的符號(hào)集包括如下5個(gè)基本元素。
- 初始起點(diǎn):使用實(shí)心圓來(lái)繪制。
- 狀態(tài)轉(zhuǎn)換:使用帶箭頭的線段來(lái)繪制。
- 當(dāng)前狀態(tài):使用圓角矩形來(lái)繪制。
- 判斷點(diǎn):使用空心圓來(lái)繪制。
- 一個(gè)或者多個(gè)終止點(diǎn):使用內(nèi)部包含實(shí)心圓的圓來(lái)繪制。
在繪制狀態(tài)圖時(shí),首先需要繪制起點(diǎn)和一條指向該類的初始狀態(tài)的轉(zhuǎn)換線段。狀態(tài)本身可以在圖上的任意位置繪制,然后只需使用狀態(tài)轉(zhuǎn)換線條將它們連接起來(lái)。
對(duì)象建模技術(shù)
對(duì)象建模技術(shù)源于通用電氣公司的一套系統(tǒng)開(kāi)發(fā)技術(shù),是以面向?qū)ο蟮乃枷霝榛A(chǔ),通過(guò)對(duì)問(wèn)題進(jìn)行抽象而構(gòu)造出一組相關(guān)的模型。通過(guò)對(duì)象建模技術(shù),可以全面地描述問(wèn)題領(lǐng)域的結(jié)構(gòu)。對(duì)象建模技術(shù)把分析時(shí)收集到的信息構(gòu)造在如下3類模型中。
- 功能模型:功能模型定義系統(tǒng)做什么。
- 對(duì)象模型:對(duì)象模型定義系統(tǒng)對(duì)誰(shuí)做。
- 動(dòng)態(tài)模型:動(dòng)態(tài)模型定義系統(tǒng)如何做。
通過(guò)上述3個(gè)模型,可以從不同的角度對(duì)系統(tǒng)進(jìn)行描述,首先分別著重于系統(tǒng)的某個(gè)側(cè)面,然后整體組合起來(lái)構(gòu)成對(duì)系統(tǒng)的完整描述。
1.功能模型
功能模型的功能是實(shí)現(xiàn)系統(tǒng)內(nèi)部數(shù)據(jù)的傳送和處理。功能模型能夠說(shuō)明,從輸入數(shù)據(jù)能夠計(jì)算出什么樣的輸出數(shù)據(jù),但是,沒(méi)有考慮參加計(jì)算的數(shù)據(jù)按什么時(shí)序來(lái)執(zhí)行。功能模型由多個(gè)數(shù)據(jù)流圖組成,它們指明從外部輸入,通過(guò)操作和內(nèi)部存儲(chǔ),直到外部輸出的整個(gè)數(shù)據(jù)流情況。功能模型還包括了對(duì)象模型內(nèi)部數(shù)據(jù)間的限制。功能模型中的數(shù)據(jù)流圖往往形成一個(gè)層次結(jié)構(gòu),一個(gè)數(shù)據(jù)流圖的過(guò)程可以由下一層的數(shù)據(jù)流圖作進(jìn)一步的說(shuō)明。UML中通常使用用例圖和活動(dòng)圖來(lái)描述功能模型。
建立功能模型的主要步驟如下所示。
(1)確定輸入和輸出值。
(2)用數(shù)據(jù)流圖表示功能的依賴性。
(3)具體說(shuō)明每個(gè)具體功能。
(4)確定限制。
(5)確定功能優(yōu)化的準(zhǔn)則。
上述操作的具體實(shí)現(xiàn)流程如圖5所示。
圖5 功能模型處理流程
2.對(duì)象模型
對(duì)象模型的功能是描述系統(tǒng)的靜態(tài)結(jié)構(gòu),包括類和對(duì)象,它們的屬性和操作,以及它們之間的關(guān)系。構(gòu)造對(duì)象模型的主要目的是,發(fā)掘與項(xiàng)目應(yīng)用密切相關(guān)的概念。對(duì)象模型用包含對(duì)象和對(duì)象之間關(guān)系的圖來(lái)表示,在UML中通常使用類圖和對(duì)象圖來(lái)描述對(duì)象模型。
使用OMT建立對(duì)象模型的主要步驟如下所示。
(1)確定對(duì)象類。
(2)定義數(shù)據(jù)詞典,并利用它來(lái)描述類的屬性和類之間的關(guān)系。
(3)用繼承來(lái)組織和簡(jiǎn)化類的結(jié)構(gòu)和類之間的關(guān)系。
(4)測(cè)試訪問(wèn)路徑。
(5)根據(jù)對(duì)象之間的關(guān)系和對(duì)象的功能將對(duì)象分組建立模塊。
上述操作的具體實(shí)現(xiàn)流程如圖6所示。
圖6 對(duì)象模型處理流程
3.動(dòng)態(tài)模型
動(dòng)態(tài)模型主要用于控制系統(tǒng)的邏輯,考察在任何時(shí)候?qū)ο蠹捌潢P(guān)系的改變,描述這些涉及時(shí)序和改變的狀態(tài)。通常使用狀態(tài)圖和事件跟蹤圖來(lái)描述動(dòng)態(tài)模型。
狀態(tài)圖是狀態(tài)和事件以及它們之間的關(guān)系所形成的網(wǎng)絡(luò),側(cè)重于描述每一類對(duì)象的動(dòng)態(tài)行為。而事件跟蹤圖則側(cè)重于說(shuō)明系統(tǒng)執(zhí)行過(guò)程中的一個(gè)特點(diǎn)場(chǎng)景,描述完成系統(tǒng)某個(gè)功能的一個(gè)事件序列。
對(duì)象到對(duì)象的單個(gè)消息叫做一個(gè)事件。在系統(tǒng)的一個(gè)特定環(huán)境下發(fā)生的一系列事件叫做一個(gè)場(chǎng)景。場(chǎng)景通常起始于一個(gè)系統(tǒng)外部的輸入事件,結(jié)束于一個(gè)系統(tǒng)外部的輸出事件。在一個(gè)場(chǎng)景中,一系列事件和交換事件的對(duì)象都可以放在一個(gè)事件跟蹤圖中表示。UML使用狀態(tài)圖和序列圖來(lái)描述動(dòng)態(tài)模型,序列圖對(duì)應(yīng)于事件跟蹤圖。
建立動(dòng)態(tài)模型的主要步驟如下所示。
(1)預(yù)制典型的交互序列場(chǎng)景。
(2)確定對(duì)象之間的事件,為每個(gè)場(chǎng)景建立事件跟蹤圖。
(3)為每個(gè)系統(tǒng)預(yù)制一個(gè)事件流圖。
(4)為具有重要?jiǎng)討B(tài)行為的類建立狀態(tài)圖。
(5)檢驗(yàn)不同狀態(tài)圖中共享的事件的一致性和完整性。
上述操作的具體實(shí)現(xiàn)流程如圖7所示。
圖7 動(dòng)態(tài)模型處理流程
面向?qū)ο蠓治?/h2>
面向?qū)ο蠓治鰧儆谲浖_(kāi)發(fā)過(guò)程中的問(wèn)題定義階段。傳統(tǒng)的系統(tǒng)分析產(chǎn)生一組面向過(guò)程的文檔,定義目標(biāo)系統(tǒng)的功能;面向?qū)ο蠓治鰟t產(chǎn)生一種描述系統(tǒng)功能和問(wèn)題領(lǐng)域的基本特征的綜合文檔。
1.面向?qū)ο蠓治龅脑瓌t
Java中面向?qū)ο蟮姆治鲂枰裱旅娴脑瓌t。
(1)抽象。
從許多事物中舍棄個(gè)別的、非本質(zhì)的特征,抽取共同的、本質(zhì)性的特征,這就是抽象。抽象是形成概念的必要手段。抽象原則具有如下兩點(diǎn)意義。
- 盡管問(wèn)題域中的事物是很復(fù)雜的,但是分析員并不需要了解和描述它們的一切,只需要分析研究其中與系統(tǒng)目標(biāo)有關(guān)的事物及其本質(zhì)性特征。
- 通過(guò)舍棄個(gè)體事物在細(xì)節(jié)上的差異,抽取其共同特征而得到一批事物的抽象概念。
抽象是面向?qū)ο蠓椒ㄖ惺褂米顬閺V泛的原則,抽象原則包括過(guò)程抽象和數(shù)據(jù)抽象兩個(gè)方面。
- 過(guò)程抽象:任何一個(gè)完成確定功能的操作序列,使用者都可以把它看成一個(gè)單一的實(shí)體,盡管實(shí)際上它可能是由一系列更低級(jí)的操作完成的。
- 數(shù)據(jù)抽象:根據(jù)施加于數(shù)據(jù)之上的操作來(lái)定義數(shù)據(jù)類型,并限定數(shù)據(jù)的值只能由這些操作來(lái)修改和觀察。數(shù)據(jù)抽象是面向?qū)ο蠓治龅暮诵脑瓌t。它強(qiáng)調(diào)把數(shù)據(jù)(屬性)和操作(服務(wù))結(jié)合為一個(gè)不可分的對(duì)象,對(duì)象的外部只需要知道它做什么,而不必知道它如何做。
(2)封裝。
封裝就是把對(duì)象的屬性和服務(wù)結(jié)合為一個(gè)不可分的系統(tǒng)單位,并盡可能隱蔽對(duì)象的內(nèi)部細(xì)節(jié)。
(3)繼承。
特殊類的對(duì)象擁有的其一般類的全部屬性與服務(wù),這是特殊類對(duì)一般類的繼承。在面向?qū)ο蠓治鲋羞\(yùn)用繼承原則,就是在每個(gè)由一般類和特殊類形成的結(jié)構(gòu)中,把一般類的對(duì)象實(shí)例和所有特殊類的對(duì)象實(shí)例都共同具有的屬性和服務(wù),一次性地在一般類中進(jìn)行顯式定義。在特殊類中不再重復(fù)地定義一般類中已定義的東西,但是在語(yǔ)義上,特殊類卻自動(dòng)地、隱含地?fù)碛兴囊话泐?以及所有更上層的一般類)中定義的全部屬性和服務(wù)。繼承原則的好處是:使系統(tǒng)模型比較清晰。
(4)分類。
分類就是把具有相同屬性和服務(wù)的對(duì)象劃分為一類,用類作為這些對(duì)象的抽象描述。分類原則實(shí)際上是抽象原則運(yùn)用于對(duì)象描述時(shí)的一種表現(xiàn)形式。
(5)聚合。
聚合的原則是:把一個(gè)復(fù)雜的事物看成若干比較簡(jiǎn)單的事物的組裝體,從而簡(jiǎn)化對(duì)復(fù)雜事物的描述。
(6)關(guān)聯(lián)。
通過(guò)一個(gè)事物聯(lián)想到另外的事物,能使人發(fā)生聯(lián)想的原因是事物之間確實(shí)存在著某些聯(lián)系。
(7)消息通信。
這一原則要求對(duì)象之間只能通過(guò)消息進(jìn)行通信,而不允許在對(duì)象之外直接地存取對(duì)象內(nèi)部的屬性。通過(guò)消息進(jìn)行通信是由于封裝原則引起的。在OOA中要求用消息連接表示出對(duì)象之間的動(dòng)態(tài)聯(lián)系。
(8)粒度控制。
考慮某部分的細(xì)節(jié)時(shí)暫時(shí)撇開(kāi)其余的部分,這就是粒度控制原則。
2.面向?qū)ο蠓治龅碾A段
面向?qū)ο蠓治龅倪^(guò)程分為兩個(gè)階段,分別是問(wèn)題領(lǐng)域分析和應(yīng)用分析,這兩個(gè)階段的具體說(shuō)明如下所示。
(1)問(wèn)題領(lǐng)域分析階段。
問(wèn)題領(lǐng)域分析是軟件開(kāi)發(fā)的基本組成部分,目的是使開(kāi)發(fā)人員了解問(wèn)題領(lǐng)域的結(jié)構(gòu),建立大致的系統(tǒng)實(shí)現(xiàn)環(huán)境。問(wèn)題領(lǐng)域分析給出一組抽象概念作為特定系統(tǒng)需求開(kāi)發(fā)的參考。問(wèn)題領(lǐng)域分析實(shí)際上是一種學(xué)習(xí)過(guò)程。軟件開(kāi)發(fā)人員在這個(gè)階段應(yīng)該盡可能地理解當(dāng)前系統(tǒng)中與應(yīng)用有關(guān)的知識(shí),放寬考慮的范圍,盡可能地標(biāo)識(shí)與應(yīng)用有關(guān)的概念。有了廣泛的問(wèn)題領(lǐng)域知識(shí),涉及具體的應(yīng)用時(shí),就可以更快地進(jìn)入狀態(tài),掌握應(yīng)用的核心知識(shí)。而且,在用戶改變對(duì)目標(biāo)系統(tǒng)的需求時(shí),廣泛的分析可以幫助我們預(yù)測(cè)出目標(biāo)系統(tǒng)在哪些方面會(huì)發(fā)生哪些變化。在分析過(guò)程中,應(yīng)該標(biāo)識(shí)出系統(tǒng)的基本概念(對(duì)象、類、方法、關(guān)系等)、識(shí)別問(wèn)題領(lǐng)域的特征,并把這些概念集成到問(wèn)題領(lǐng)域的模型中。問(wèn)題領(lǐng)域的模型必須包含概念之間的關(guān)系,以及每個(gè)概念的全部信息。標(biāo)識(shí)出來(lái)的相關(guān)概念應(yīng)該根據(jù)信息內(nèi)容來(lái)有機(jī)地融合到問(wèn)題領(lǐng)域的綜合視圖中。
(2)應(yīng)用分析階段。
應(yīng)用分析是依據(jù)在問(wèn)題領(lǐng)域分析時(shí)建立起來(lái)的問(wèn)題領(lǐng)域模型來(lái)進(jìn)行的。應(yīng)用分析時(shí),把問(wèn)題領(lǐng)域模型用于當(dāng)前特定的應(yīng)用之中。首先,通過(guò)收集到的用戶信息來(lái)對(duì)問(wèn)題領(lǐng)域進(jìn)行取舍,把用戶需求作為限制條件來(lái)使用,以縮減問(wèn)題領(lǐng)域的信息量。因此,問(wèn)題領(lǐng)域分析的視野大小直接影響到應(yīng)用分析保留的信息量。一般來(lái)說(shuō),問(wèn)題領(lǐng)域分析階段產(chǎn)生的模型并不需要用程序設(shè)計(jì)語(yǔ)言來(lái)表示,而應(yīng)用分析階段產(chǎn)生的影響條件則需要用某種程序設(shè)計(jì)語(yǔ)言來(lái)表示。模型識(shí)別的要求可以針對(duì)一個(gè)應(yīng)用,也可以針對(duì)多個(gè)應(yīng)用。通常我們著重考慮兩個(gè)方面,即應(yīng)用視圖和類視圖。在類視圖中,必須對(duì)每個(gè)類的屬性和操作進(jìn)行細(xì)化,并表示出類之間的相互作用關(guān)系。
3.面向?qū)ο蠓治龅木唧w目標(biāo)
面向?qū)ο蠓治鲂枰瓿扇缦聝蓚€(gè)目標(biāo)。
(1)形式化地說(shuō)明所面對(duì)的應(yīng)用問(wèn)題,最終形成軟件系統(tǒng)基本構(gòu)成的對(duì)象,以及系統(tǒng)所必須遵從的、由應(yīng)用環(huán)境所決定的規(guī)則和約束條件。
(2)明確地規(guī)定構(gòu)成系統(tǒng)的對(duì)象如何協(xié)同工作和完成指定的功能。
通過(guò)面向?qū)ο蠓治鏊⒌南到y(tǒng)模型是以概念為中心的,因此稱為概念模型。概念模型由一組相關(guān)的類組成。面向?qū)ο蠓治隹梢酝ㄟ^(guò)自頂向下地逐層分解來(lái)建立系統(tǒng)模型,也可以自底向上地從已經(jīng)定義的類出發(fā),逐步構(gòu)造新的類。
概念模型的構(gòu)造和評(píng)審由如下5個(gè)層次構(gòu)成。
- 類和對(duì)象層。
- 屬性層。
- 服務(wù)層。
- 結(jié)構(gòu)層。
- 主題層。
上述5個(gè)層次不是構(gòu)成軟件系統(tǒng)的層次,而是分析過(guò)程中的層次。當(dāng)5個(gè)層次的工作全部完成時(shí),面向?qū)ο蠓治龅娜蝿?wù)也就完成了。
注意
在實(shí)際編程操作中,面向?qū)ο蠓治龅哪繕?biāo)是得出問(wèn)題領(lǐng)域的功能模型、對(duì)象模型和動(dòng)態(tài)模型,并用相應(yīng)的UML圖將它們表示出來(lái)。
面向?qū)ο笤O(shè)計(jì)
經(jīng)過(guò)前面的分析處理后,接下來(lái)就可以進(jìn)行具體設(shè)計(jì)了。面向?qū)ο笤O(shè)計(jì)的任務(wù)是對(duì)面向?qū)ο蠓治龅慕Y(jié)果進(jìn)行規(guī)范化整理,以便能夠被面向?qū)ο缶幊讨苯咏邮堋T诮酉聛?lái)的內(nèi)容中,將簡(jiǎn)要介紹面向?qū)ο笤O(shè)計(jì)的基本知識(shí)。
1.面向?qū)ο笤O(shè)計(jì)概述
面向?qū)ο笤O(shè)計(jì)是一種軟件設(shè)計(jì)方法,是一種工程化規(guī)范。面向?qū)ο笤O(shè)計(jì)中主要的操作如下所示。
- 確定需要的類。
- 給每個(gè)類提供一組完整的操作。
- 明確地使用繼承來(lái)表現(xiàn)共同點(diǎn)。
所以說(shuō),面向?qū)ο笤O(shè)計(jì)就是一個(gè)根據(jù)需求決定所需的類、類的操作,以及類之間關(guān)聯(lián)的過(guò)程。
從面向?qū)ο蠓治龅矫嫦驅(qū)ο笤O(shè)計(jì)是一個(gè)逐步擴(kuò)充模型的過(guò)程。面向?qū)ο蠓治鲆詫?shí)際問(wèn)題為中心,可以不考慮與軟件實(shí)現(xiàn)相關(guān)的任何問(wèn)題,主要考慮“做什么”的問(wèn)題;面向?qū)ο笤O(shè)計(jì)則是面向軟件實(shí)現(xiàn)的實(shí)際開(kāi)發(fā)活動(dòng),主要考慮“怎么做”的問(wèn)題。
面向?qū)ο笤O(shè)計(jì)的目標(biāo)是管理程序內(nèi)部各部分的相互依賴關(guān)系。為了達(dá)到這個(gè)目標(biāo),面向?qū)ο笤O(shè)計(jì)要求將程序分成塊,然后分別將各個(gè)塊隱藏在接口(interface)的后面,讓它們只通過(guò)接口相互交流。比如說(shuō),如果用面向?qū)ο笤O(shè)計(jì)的方法來(lái)設(shè)計(jì)一個(gè)客戶端—服務(wù)器應(yīng)用,那么服務(wù)器和客戶端之間不應(yīng)該有直接的依賴,而是應(yīng)該讓服務(wù)器的接口和客戶端的接口相互依賴。
2.面向?qū)ο笤O(shè)計(jì)的原則
面向?qū)ο笤O(shè)計(jì)所要遵循的原則如下所示。
(1)模塊化。
面向?qū)ο箝_(kāi)發(fā)方法很自然地支持了把系統(tǒng)分解成模塊的設(shè)計(jì)原則:對(duì)象就是模塊。它是把數(shù)據(jù)結(jié)構(gòu)和操作這些數(shù)據(jù)的方法緊密地結(jié)合在一起所構(gòu)成的模塊。
(2)抽象。
面向?qū)ο蠓椒ú粌H支持過(guò)程抽象,而且支持?jǐn)?shù)據(jù)抽象。
(3)信息隱藏。
在面向?qū)ο蠓椒ㄖ?#xff0c;信息隱藏通過(guò)對(duì)象的封裝性來(lái)實(shí)現(xiàn)。
(4)低聯(lián)系。
在面向?qū)ο蠓椒ㄖ?#xff0c;對(duì)象是最基本的模塊,因此,聯(lián)系主要指不同對(duì)象之間相互關(guān)聯(lián)的緊密程度。低聯(lián)系是設(shè)計(jì)的一個(gè)重要標(biāo)準(zhǔn),因?yàn)檫@有助于使得系統(tǒng)中某一部分的變化對(duì)其他部分的影響降到最低。
3.面向?qū)ο笤O(shè)計(jì)的任務(wù)
面向?qū)ο笤O(shè)計(jì)有如下3個(gè)任務(wù)。
(1)對(duì)象定義規(guī)格的求精。
對(duì)于面向?qū)ο蠓治鏊橄蟪鰜?lái)的對(duì)象、類,以及匯集的分析文檔,面向?qū)ο笤O(shè)計(jì)需要有一個(gè)根據(jù)設(shè)計(jì)要求整理和求精的過(guò)程,使之更能符合面向?qū)ο缶幊痰男枰?#xff0c;具體實(shí)施如下。
- 根據(jù)面向?qū)ο蟮母拍钅P驼矸治鏊_定的對(duì)象結(jié)構(gòu)、屬性、方法等內(nèi)容,改正錯(cuò)誤的內(nèi)容,刪去不必要和重復(fù)的內(nèi)容等。
- 進(jìn)行分類整理,以便于下一步數(shù)據(jù)庫(kù)設(shè)計(jì)和程序處理模塊設(shè)計(jì)的需要,整理的方法主要是進(jìn)行歸類,對(duì)類、對(duì)象、屬性、方法和結(jié)構(gòu)、主題進(jìn)行歸類。
(2)數(shù)據(jù)模型和數(shù)據(jù)庫(kù)設(shè)計(jì)。
數(shù)據(jù)模型的設(shè)計(jì)需要確定類、對(duì)象屬性的內(nèi)容、消息連接的方式、系統(tǒng)訪問(wèn)、數(shù)據(jù)模型的方法等。最后,每個(gè)對(duì)象實(shí)例的數(shù)據(jù)都必須落實(shí)到面向?qū)ο蟮膸?kù)結(jié)構(gòu)模型中。
(3)優(yōu)化。
面向?qū)ο笤O(shè)計(jì)的優(yōu)化設(shè)計(jì)過(guò)程是從另一個(gè)角度對(duì)分析結(jié)果和處理業(yè)務(wù)過(guò)程的整理歸納,優(yōu)化包括對(duì)象和結(jié)構(gòu)的優(yōu)化、抽象、集成。
4.面向?qū)ο笤O(shè)計(jì)的過(guò)程和步驟
面向?qū)ο笤O(shè)計(jì)的過(guò)程,是通過(guò)利用設(shè)計(jì)階段中的4個(gè)層次來(lái)建立系統(tǒng)的問(wèn)題領(lǐng)域、用戶界面、任務(wù)管理和數(shù)據(jù)管理的過(guò)程。
(1)問(wèn)題領(lǐng)域。
問(wèn)題領(lǐng)域包括與我們所面對(duì)的應(yīng)用問(wèn)題直接相關(guān)的所有類和對(duì)象。主要是根據(jù)需求的變化來(lái)對(duì)面向?qū)ο蠓治鲭A段產(chǎn)生的模型中的類和對(duì)象、結(jié)構(gòu)、屬性和操作進(jìn)行組合和分解,根據(jù)面向?qū)ο笤O(shè)計(jì)原則來(lái)增加必要的類、屬性和關(guān)系。
(2)用戶界面。
通常在面向?qū)ο蠓治鲭A段給出了所需的屬性和操作,在面向?qū)ο笤O(shè)計(jì)階段必須根據(jù)需求把交互的細(xì)節(jié)加入用戶界面的設(shè)計(jì)中,包括有效的人機(jī)交互所必需的實(shí)際顯示和輸入。
用戶界面部分的設(shè)計(jì)主要由以下7個(gè)方面組成。
- 用戶分類。
- 描述人及其任務(wù)的腳本。
- 設(shè)計(jì)命令層。
- 設(shè)計(jì)詳細(xì)的交互。
- 繼續(xù)擴(kuò)展用戶界面原型。
- 設(shè)計(jì)人機(jī)交互類。
- 根據(jù)圖形用戶界面進(jìn)行設(shè)計(jì)任務(wù)管理部分的設(shè)計(jì)。
(3)任務(wù)管理。
任務(wù)是進(jìn)程的別稱,是執(zhí)行一系列活動(dòng)的一段程序。當(dāng)系統(tǒng)中有許多并發(fā)行為時(shí),需要依照各個(gè)行為的協(xié)調(diào)和通信關(guān)系來(lái)劃分各種任務(wù),以簡(jiǎn)化并發(fā)行為的設(shè)計(jì)和編碼。任務(wù)管理主要包括任務(wù)的選擇和調(diào)整。
(4)數(shù)據(jù)管理。
數(shù)據(jù)管理提供了在數(shù)據(jù)管理系統(tǒng)中存儲(chǔ)和檢索對(duì)象的基本結(jié)構(gòu),包括對(duì)永久性數(shù)據(jù)的訪問(wèn)和管理。數(shù)據(jù)管理的方法主要有3種,分別是文件管理、關(guān)系數(shù)據(jù)庫(kù)管理,以及面向?qū)ο蟮臄?shù)據(jù)庫(kù)管理。
Java的面向?qū)ο筇匦?/h2>
Java是一門純粹的面向?qū)ο蟮木幊陶Z(yǔ)言,完全支持封裝、繼承和多態(tài)這三大面向?qū)ο蟮幕咎卣鳌ava程序的組成單位就是類,不管什么規(guī)模的Java應(yīng)用程序,都是由一個(gè)個(gè)類組成的。
1.一切皆為對(duì)象
在Java語(yǔ)言中,除了8個(gè)基本數(shù)據(jù)類型值之外都是對(duì)象,對(duì)象就是面向?qū)ο蟪绦蛟O(shè)計(jì)的中心。對(duì)象是人們要進(jìn)行研究的任何事物,從最簡(jiǎn)單的數(shù)字到復(fù)雜的航空母艦等均是對(duì)象。對(duì)象不僅能表示具體的事物,而且還能表示抽象的規(guī)則、計(jì)劃或事件。對(duì)象是具有狀態(tài)的,一個(gè)對(duì)象用數(shù)據(jù)值來(lái)描述它的狀態(tài)。Java通過(guò)為對(duì)象定義Field(以前常被稱為屬性,現(xiàn)在也稱為字段)來(lái)描述對(duì)象的狀態(tài)。對(duì)象也具有操作,這些操作可以改變對(duì)象的狀態(tài),對(duì)象的操作也被稱為對(duì)象的行為,Java通過(guò)為對(duì)象定義方法來(lái)描述對(duì)象的行為。對(duì)象實(shí)現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封裝于對(duì)象的統(tǒng)一體中。對(duì)象是Java程序里的核心,所以,Java里的對(duì)象具有唯一性,每個(gè)對(duì)象都有一個(gè)標(biāo)識(shí)來(lái)引用它,如果某個(gè)對(duì)象失去了標(biāo)識(shí),這個(gè)對(duì)象將變成垃圾,只能等著系統(tǒng)垃圾回收來(lái)回收它。Java語(yǔ)言不允許直接訪問(wèn)對(duì)象,而是通過(guò)對(duì)對(duì)象的引用來(lái)操作對(duì)象。
2.類和對(duì)象
具有相同或相似性質(zhì)的一組對(duì)象的抽象就是類,類是抽象的、概念上的定義,是對(duì)一類事物的描述。對(duì)象是實(shí)際存在的該類事物的每個(gè)個(gè)體,因而也稱實(shí)例(instance)。對(duì)象的抽象是類,類的具體化就是對(duì)象,也可以說(shuō)類的實(shí)例是對(duì)象。類用來(lái)描述一系列對(duì)象,類會(huì)概述每個(gè)對(duì)象應(yīng)包括的數(shù)據(jù),類概述每個(gè)對(duì)象的行為特征。因此,我們可以把類理解成某種概念、定義,它規(guī)定了某類對(duì)象所共同具有的數(shù)據(jù)和行為特征。
Java語(yǔ)言使用關(guān)鍵字class來(lái)定義一個(gè)類,Java允許程序員自定義類。在Java中定義類時(shí),可使用關(guān)鍵字Field來(lái)描述該類對(duì)象的數(shù)據(jù),可使用方法來(lái)描述該類對(duì)象的行為特征。類的行為特主要是指屬性和操作,具體說(shuō)明如下所示。
- Java中的類具有屬性,它是對(duì)象狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來(lái)描述該類對(duì)象的共同數(shù)據(jù)特征。
- Java中的類具有操作,它是對(duì)象行為的抽象,用操作名和實(shí)現(xiàn)該操作的方法來(lái)描述該類對(duì)象的共同行為。
在客觀世界中有若干類,這些類之間有一定的結(jié)構(gòu)關(guān)系。通常有如下兩種主要的結(jié)構(gòu)關(guān)系。
- 一般—特殊結(jié)構(gòu):也被稱為分類結(jié)構(gòu),這種分類結(jié)構(gòu)關(guān)系就是典型的繼承關(guān)系,Java語(yǔ)言使用關(guān)鍵字extends來(lái)表示這種分類結(jié)構(gòu),Java的子類是一種特殊的父類。因此,這種“一般—特殊”結(jié)構(gòu)關(guān)系其實(shí)是一種“is a”關(guān)系。
- 整體—部分結(jié)構(gòu):也被稱為組裝結(jié)構(gòu),這種分類關(guān)系就是典型的組合關(guān)系,Java語(yǔ)言通過(guò)在一個(gè)類里保存另一個(gè)對(duì)象的引用來(lái)實(shí)現(xiàn)這種組合關(guān)系,因此這種“整體—部分”結(jié)構(gòu)關(guān)系其實(shí)是一種“has a”關(guān)系。
程序員在定義Java類之后,就可以使用關(guān)鍵字new來(lái)創(chuàng)建指定類的對(duì)象,每個(gè)類可以創(chuàng)建任意多個(gè)對(duì)象,多個(gè)對(duì)象的Field值可以不同,這表現(xiàn)為不同對(duì)象的數(shù)據(jù)存在差異。
本文節(jié)選自《Java 開(kāi)發(fā)從入門到精通》
本書由淺入深地詳細(xì)講解了Java的開(kāi)發(fā)技術(shù),并通過(guò)具體實(shí)例的實(shí)現(xiàn)過(guò)程演練了各個(gè)知識(shí)點(diǎn)的具體使用流程。本書共20章,第1~2章講解了Java技術(shù)的基礎(chǔ)知識(shí),包括Java印象和第一段Java程序;第3~9章分別講解了Java語(yǔ)法、條件語(yǔ)句、循環(huán)語(yǔ)句、數(shù)組、面向?qū)ο蟮戎R(shí),這些內(nèi)容都是Java開(kāi)發(fā)技術(shù)的核心知識(shí);第10~14章分別講解了集合、類庫(kù)、泛型、異常處理、I/O和文件處理的基本知識(shí),這些內(nèi)容是Java開(kāi)發(fā)技術(shù)的重點(diǎn)和難點(diǎn);第15~19章是典型應(yīng)用內(nèi)容,分別講解了數(shù)據(jù)庫(kù)編程、網(wǎng)絡(luò)與通信編程、多線程等內(nèi)容;第20章通過(guò)一個(gè)綜合實(shí)例的實(shí)現(xiàn)過(guò)程,介紹了Java技術(shù)在綜合項(xiàng)目中的使用流程。本書內(nèi)容循序漸進(jìn),以“技術(shù)解惑”和“范例演練”貫穿全書,引領(lǐng)讀者全面掌握J(rèn)ava語(yǔ)言。
本書不但適用于Java的初學(xué)者,也適用于有一定Java基礎(chǔ)的讀者,還可以作為大專院校相關(guān)專業(yè)的師生學(xué)習(xí)用書和培訓(xùn)學(xué)校的教材。
總結(jié)
以上是生活随笔為你收集整理的怎样用uml类图生成java类_JAVA:面向对象编程的底层逻辑,深度剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mdkstc系列器件支持包下载_Find
- 下一篇: labview除了全局变量还有别的办法_