早期發展
早期的計算機編程是基於面向過程的方法,例如實現算術運算1+1+2 = 4,通過設計一個算法就可以解決當時的問題。隨著計算機技術的不斷提高,計算機被用於解決越來越複雜的問題。一切事物皆對象,通過面向對象的方式,將現實世界的事物抽象成對象,現實世界中的關係抽象成類、
繼承,幫助人們實現對現實世界的
抽象與數字建模。通過面向對象的方法,更利於用人理解的方式對複雜系統進行分析、設計與編程。同時,面向對象能有效提高
編程的效率,通過封裝技術,訊息機制可以像搭積木的一樣快速開發出一個全新的系統。面向對象是指一種
程式設計范型,同時也是一種程式開發的方法。對象指的是
類的集合。它將
對象作為
程式的基本單元,將程式和
數據封裝其中,以提高軟體的重用性、靈活性和擴展性。
面向
對象的思想已經涉及到
軟體開發的各個方面。如,面向對象的分析(
OOA,Object Oriented Analysis),面向對象的設計(
OOD,Object Oriented Design)、以及我們經常說的面向對象的編程實現(
OOP,Object Oriented Programming)。
面向
對象的分析根據
抽象關鍵的問題域來分解系統。面向
對象的設計是一種提供符號設計系統的面向對象的實現過程,它用非常接近實際領域術語的方法把系統構造成“現實世界”的對象。面向對象程式設計可以看作一種在程式中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反:傳統的程式設計主張將程式看作一系列
函式的集合,或者直接就是一系列對電腦下達的指令。面向對象程式設計中的每一個對象都應該能夠接受數據、處理數據並將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。
背景
面向
對象是在
結構化設計方法出現很多問題的情況下應運而生的。
結構化設計方法求解問題的基本策略是從功能的角度審視問題域。它將應用程式看成實現某些特定任務的
功能模組,其中子過程是實現某項具體操作的底層功能模組。在每個功能模組中,用
數據結構描述待處理數據的組織形式,用
算法描述具體的操作過程。面對日趨複雜的套用系統,這種開發思路在下面幾個方面逐漸暴露了一些弱點。
1.審視問題域的視角
在現實世界中存在的
客體是問題域中的主角,所謂客體是指客觀存在的
對象實體和主觀
抽象的概念,他是人類觀察問題和解決問題的主要目標。例如,對於一個學校
學生管理系統來說,無論是簡單還是複雜,始終是圍繞學生和老師這兩個
客體實施。在自然界,每個
客體都具有一些屬性和行為,例如學生有學號、姓名、性別等屬性,以及上課、考試、做實驗等行為。因此,每個個體都可以用屬性和行為來描述。
通常人類觀察問題的視角是這些
客體,客體的屬性反應客體在某一時刻的狀態,客體的行為反映客體能從事的操作。這些操作附在
客體之上並能用來設定、改變和獲取客體的狀態。任何問題域都有一系列的
客體,因此解決問題的基本方式是讓這些客體之間相互驅動、相互作用,最終使每個客體按照設計者的意願改變其屬性狀態。
結構化設計方法所採用的設計思路不是將
客體作為一個整體,而是將依附於客體之上的行為抽取出來,以功能為目標來設計構造套用系統。這種做法導致在進行
程式設計的時候,不得不將
客體所構成的現實世界映射到由
功能模組組成的解空間中,這種變換過程,不僅增加了程式設計的複雜程度,而且背離了人們觀察問題和解決問題的基本思路。另外,再仔細思考會發現,在任何一個問題域中,
客體是穩定的,而行為是不穩定的。例如,不管是國家圖書館,還是學校圖書館,還是國際圖書館,都會含有圖書這個
客體,但管理圖書的方法可能是截然不同的。
結構化設計方法將審視問題的視角定位於不穩定的操作之上,並將描述
客體的屬性和行為分開,使得應用程式的日後維護和擴展相當困難,甚至一個微小的變動,都會波及到整個系統。面對問題規模的日趨擴大、環境的日趨複雜、需求變化的日趨加快,將利用計算機解決問題的基本方法統一到人類解決問題的習慣方法之上,徹底改變
軟體設計方法與人類解決問題的常規方式扭曲的現象迫在眉睫,這是提出面向
對象的首要原因。
抽象是人類解決問題的基本法寶。良好的
抽象策略可以控制問題的複雜程度,增強系統的通用性和
可擴展性。
抽象主要包括過程抽象和數據抽象。
結構化設計方法套用的是過程
抽象。所謂過程
抽象是將問題域中具有明確功能定義的操作抽取出來,並將其作為一個實體看待。這種
抽象級別對於軟體系統結構的設計顯得有些武斷,並且穩定性差,導致很難準確無誤地設計出系統的每一個操作環節。一旦某個
客體屬性的表示方式發生了變化,就有可能牽扯到已有系統的很多部分。而數據
抽象是較過程抽象更高級別的抽象方式,將描述
客體的屬性和行為綁定在一起,實現統一的抽象,從而達到對現實世界客體的真正
模擬。
封裝是指將現實世界中存在的某個
客體的屬性與行為綁定在一起,並放置在一個邏輯單元內。該邏輯單元負責將所描述的屬性隱藏起來,外界對
客體內部屬性的所有訪問只能通過提供的
用戶接口實現。這樣做既可以實現對
客體屬性的保護作用,又可以提高
軟體系統的可維護性。只要用戶接口不改變,任何
封裝體內部的改變都不會對
軟體系統的其他部分造成影響。
結構化設計方法沒有做到
客體的整體
封裝,只是封裝了各個
功能模組,而每個功能模組可以隨意地對沒有保護能力客體屬性實施操作,並且由於描述屬性的數據與行為被分割開來,所以一旦某個客體屬性的表達方式發生了變化,或某個行為效果發生了改變,就有可能對整個系統產生影響。
4.可重用性
可
重用性標識著軟體產品的可復用能力,是衡量一個軟體產品成功與否的重要標誌。當今的軟體開發行業,人們越來越追求開發更多的、更有通用性的可重用
構件,從而使軟體開發過程徹底改善,即從過去的語句級編寫發展到現在的構件組裝,從而提高軟體開發效率,推動套用領域迅速擴展。然而,
結構化程式設計方法的基本單位是模組,每個模組只是實現特定功能的過程描述,因此,它的可重用單位只能是模組。例如,在
C語言編寫程式時使用大量的
標準函式。但對於今天的軟體開發來說,這樣的重用力度顯得微不足道,而且當參與操作的某些
數據類型發生變化時,就不能夠再使用那些函式了。因此,渴望更大力度的可重用
構件是如今套用領域對
軟體開發提出的新需求。
上述弱點驅使人們尋求一種新的程式設計方法,以適應現代社會對
軟體開發的更高要求,面向
對象由此產生。
概念
對象是人們要進行研究的任何事物,從最簡單的整數到複雜的飛機等均可看作對象,它不僅能表示具體的事物,還能表示
抽象的規則、計畫或事件。
對象還有操作,用於改變對象的狀態,對象及其操作就是對象的行為。
對象實現了數據和操作的結合,使數據和操作
封裝於對象的統一體中
類具有操作,它是
對象的行為的
抽象,用操作名和實現該操作的方法來描述。
⑷類的結構。
在客觀世界中有若干類,這些類之間有一定的結構關係。通常有兩種主要的結構關係,即一般--具體結構關係,整體--部分結構關係。
①一般--具體結構稱為分類結構,也可以說是“或”關係,或者是“is a”關係。
②整體--部分結構稱為組裝結構,它們之間的關係是一種“與”關係,或者是“has a”關係。
⑸訊息和方法。
對象之間進行通信的結構叫做訊息。在
對象的操作中,當一個訊息傳送給某個對象時,訊息包含接收對象去執行某種操作的信息。傳送一條訊息至少要包括說明接受訊息的
對象名、傳送給該對象的訊息名(即對象名、方法名)。一般還要對參數加以說明,參數可以是認識該訊息的
對象所知道的
變數名,或者是所有對象都知道的全局
變數名。
類中操作的實現過程叫做方法,一個方法有方法名、返回值、參數、方法體。
特徵
每個
對象都有自身唯一的標識,通過這種標識,可找到相應的
對象。在
對象的整個生命期中,它的標識都不改變,不同的對象不能有相同的標識。
抽象性是指將具有一致的
數據結構(屬性)和行為(操作)的對象
抽象成類。一個類就是這樣一種
抽象,它反映了與套用有關的重要性質,而忽略其他一些無關內容。任何類的劃分都是主觀的,但必須與具體的套用有關。
繼承性是子類自動共享父類
數據結構和方法的機制,這是類之間的一種關係。在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,並加入若干新的內容。
在類層次中,子類只
繼承一個父類的
數據結構和方法,則稱為單重繼承。
多重繼承,JAVA、VB、NET、Objective-C均僅支持單繼承,注意在C++多重繼承時,需小心二義性。
在
軟體開發中,類的
繼承性使所建立的軟體具有開放性、可擴充性,這是信息組織與分類的行之有效的方法,它簡化了
對象、類的創建工作量,增加了代碼的可重用性。
採用
繼承性,提供了類的規範的等級結構。通過類的
繼承關係,使公共的特性能夠共享,提高了軟體的重用性。
多態性是指相同的操作或函式、過程可作用於多種類型的
對象上並獲得不同的結果。不同的
對象,收到同一訊息可以產生不同的結果,這種現象稱為
多態性。
多態性允許每個
對象以適合自身的方式去回響共同的訊息。
要素
⑴抽象。
抽象是指強調實體的本質、內在的屬性。在系統開發中,
抽象指的是在決定如何實現
對象之前的對象的意義和行為。使用
抽象可以儘可能避免過早考慮一些細節。
面向
對象的類是
封裝良好的模組,類定義將其說明(用戶可見的外部接口)與實現(用戶不可見的內部實現)顯式地分開,其內部實現按其具體定義的
作用域提供保護。
對象是
封裝的最基本單位。
封裝防止了程式相互依賴性而帶來的變動影響。面向
對象的
封裝比傳統語言的封裝更為清晰、更為有力。
⑶共享性
同一類中的共享。同一類中的
對象有著相同
數據結構。這些
對象之間是結構、行為特徵的共享關係。
在同一套用中共享。在同一套用的
類層次結構中,存在
繼承關係的各相似子類中,存在
數據結構和行為的繼承,使各相似子類共享共同的結構和行為。使用
繼承來實現代碼的共享,這也是面向
對象的主要優點之一。
在不同套用中共享。面向
對象不僅允許在同一套用中共享信息,而且為未來目標的可重用設計準備了條件。通過類庫這種機制和結構來實現不同套用中的信息共享。
⒋強調對象結構而不是程式結構
開發方法
面向
對象開發方法的研究已日趨成熟,國際上已有不少面向
對象產品出現。面向
對象開發方法有Coad方法、Booch方法和OMT方法等。
⒈Booch方法
Booch最先描述了面向對象的
軟體開發方法的基礎問題,指出面向對象開發是一種根本不同於傳統的功能分解的設計方法。面向
對象的軟體分解更接近人對客觀事務的理解,而功能分解只通過問題空間的轉換來獲得。
⒉Coad方法
Coad方法是1989年Coad和Yourdon提出的面向
對象開發方法。該方法的主要優點是通過多年來大系統開發的經驗與面向
對象概念的有機結合,在對象、結構、屬性和操作的認定方面,提出了一套系統的原則。該方法完成了從需求角度進一步進行類和
類層次結構的認定。儘管Coad方法沒有引入類和
類層次結構的術語,但事實上已經在分類結構、屬性、操作、訊息關聯等概念中體現了類和類層次結構的特徵。
⒊OMT方法
OMT方法是1991年由James Rumbaugh等5人提出來的,其經典著作為“面向
對象的建模與設計”。
該方法是一種新興的面向
對象的開發方法,開發工作的基礎是對真實世界的對象建模,然後圍繞這些對象使用分析模型來進行獨立於語言的設計,面向對象的建模和設計促進了對需求的理解,有利於開發得更清晰、更容易維護的
軟體系統。該方法為大多數套用領域的
軟體開發提供了一種實際的、高效的保證,努力尋求一種問題求解的實際方法。
⒋
UML(Unified Modeling Language)語言
軟體工程領域在1995年~1997年取得了前所未有的進展,其成果超過軟體工程領域過去15年的成就總和,其中最重要的成果之一就是
統一建模語言(UML)的出現。UML將是
面向對象技術領域內占主導地位的
標準建模語言。
UML不僅統一了Booch方法、OMT方法、OOSE方法的表示方法,而且對其作了進一步的發展,最終統一為大眾接受的
標準建模語言。UML是一種定義良好、易於表達、功能強大且普遍適用的
建模語言。它融入了
軟體工程領域的新思想、新方法和新技術。它的作用域不限於支持面向
對象的分析與設計,還支持從
需求分析開始的軟體開發全過程。
模型
對象模型
對象模型表示了靜態的、結構化的系統數據性質,描述了系統的靜態結構,它是從客觀世界實體的對象關係角度來描述,表現了對象的相互關係。該模型主要關心繫統中
對象的結構、屬性和操作,它是分析階段三個模型的核心,是其他兩個模型的
框架。
⑵ 類。
通過將對象
抽象成類,我們可以使問題抽象化,抽象增強了模型的歸納能力。
⑶ 屬性。
⑷ 操作和方法。
操作是類中
對象所使用的一種功能或變換。類中的各
對象可以共享操作,每個操作都有一個目標對象作為其隱含參數。
方法是類的操作的實現步驟。
⒉關聯和鏈
關聯是建立類之間關係的一種手段,而鏈則是建立
對象之間關係的一種手段。
⑴ 關聯和鏈的含義。
鍊表示
對象間的物理與概念聯結,關聯表示類之間的一種關係,鏈是關聯的實例,關聯是鏈的
抽象。
⑵ 角色。
角色說明類在關聯中的作用,它位於關聯的端點。
⑶ 受限關聯。
受限關聯由兩個類及一個限定詞組成,限定詞是一種特定的屬性,用來有效的減少關聯的重數,限定詞在關聯的終端
對象集中說明。
限定提高了語義的精確性,增強了查詢能力,在現實世界中,常常出現限定詞。
⑷ 關聯的多重性。
關聯的多重性是指類中有多少個
對象與關聯的類的一個對象相關。重數常描述為“一”或“多”。
⒊類的層次結構
⑴ 聚集關係。
聚集是一種“整體-部分”關係。在這種關係中,有整體類和部分類之分。聚集最重要的性質是傳遞性,也具有逆對稱性。
聚集可以有不同層次,可以把不同分類聚集起來得到一顆簡單的聚集樹,聚集樹是一種簡單表示,比畫很多線來將部分類聯繫起來簡單得多,
對象模型應該容易地反映各級層次。
⑵一般化關係。
一般化關係是在保留
對象差異的同時共享對象相似性的一種高度
抽象方式。它是“一般---具體”的關係。一般化類稱為你類,具體類又能稱為子類,各子類
繼承了父類的性質,而各子類的一些共同性質和操作又歸納到你類中。因此,一般化關係和
繼承是同時存在的。一般化關係的符號表示是在類關聯的連線上加一個小三角形。
⑴模板。模板是類、關聯、一般化結構的邏輯組成。
對象模型是由一個或若干個模板組成。模板將模型分為若干個便於管理的子塊,在整個
對象模型和類及關聯的構造塊之間,模板提供了一種集成的中間單元,模板中的類名及關聯名是唯一的。
動態模型
動態模型是與時間和變化有關的系統性質。該模型描述了系統的控制結構,它表示了瞬間的、行為化的系統控制
性質,它關心的是系統的控制,操作的執行順序,它表示從
對象的事件和狀態的角度出發,表現了對象的相互行為。
該模型描述的系統屬性是觸發事件、事件序列、狀態、事件與狀態的組織。使用
狀態圖作為描述工具。它涉及到事件、狀態、操作等重要概念。
⒈事件
事件是指定時刻發生的某件事。
⒉狀態
狀態是
對象屬性值的
抽象。
對象的屬性值按照影響對象顯著行為的性質將其歸併到一個狀態中去。狀態指明了
對象對輸入事件的回響。
狀態圖反映了狀態與事件的關係。當接收一事件時,下一狀態就取決於當前狀態和所接收的該事件,由該事件引起的狀態變化稱為轉換。
狀態圖是一種圖,用結點表示狀態,結點用圓圈表示;圓圈內有狀態名,用箭頭連線表示狀態的轉換,上面標記事件名,箭頭方向表示轉換的方向。
功能模型
功能模型描述了系統的所有計算。功能模型指出發生了什麼,
動態模型確定什麼時候發生,而
對象模型確定發生的
客體。功能模型表明一個計算如何從輸入值得到輸出值,它不考慮計算的次序。功能模型由多張
數據流圖組成。
數據流圖用來表示從源
對象到目標對象的數據值的流向,它不包含控制信息,控制信息在
動態模型中表示,同時數據流圖也不表示對象中值的組織,值的組織在對象模型中表示。
⒈處理
數據流圖中的處理用來改變數據值。最低層處理是純粹的函式,一張完整的
數據流圖是一個高層處理。
⒉數據流
數據流圖中的數據流將
對象的輸出與處理、處理與對象的輸入、處理與處理聯繫起來。在一個計算機中,用數據流來表示一中間數據值,數據流不能改變數據值。
動作
對象是一種主動對象,它通過生成或者使用數據值來驅動
數據流圖。
⒋數據存儲對象
數據流圖中的數據存儲是被動
對象,它用來存儲數據。它與動作
對象不一樣,數據存儲本身不產生任何操作,它只回響存儲和訪問的要求。
實例分析
面向
對象分析的目的是對客觀世界的系統進行建模。本節以上面介紹的模型概念為基礎,結合“銀行網路系統”的具體實例來構造客觀世界問題的準確、嚴密的分析模型。
分析模型有三種用途:用來明確問題需求;為用戶和開發人員提供明確需求;為用戶和開發人員提供一個協商的基礎,作為後繼的設計和實現的
框架。
系統分析的第一步是:陳述需求。分析者必須同用戶一塊工作來提煉需求,因為這樣才表示了用戶的真實意圖,其中涉及對需求的分析及查找丟失的信息。下面以“銀行網路系統”為例,用
面向對象方法進行分析。
銀行網路系統問題陳述:設計支持銀行網路的軟體,銀行網路包括人工出納站和分行共享的自動出納機。每個
分理處用分理處計算機來保存各自的帳戶,處理各自的事務;各自分理處的出納站與
分理處計算機通信,出納站錄入帳戶和事務數據;自動出納機與分行計算機通信,分行計算機與撥款分理處結帳,自動出納機與
用戶接口接受現金卡,與分行計算機通信完成事務,發放現金,列印收據;系統需要記錄保管和安全措施;系統必須正確處理同一帳戶的並發訪問;每個分處理為自己的計算機準備軟體,銀行網路費用根據顧客和現金卡的數目分攤給各分理處。
首先標識和關聯,因為它們影響了整體結構和解決問題的方法,其次是增加屬性,進一步描述類和關聯的基本網路,使用
繼承合併和組織類,最後操作增加到類中去作為構造
動態模型和
功能模型的副產品。
⒈確定類
構造
對象模型的第一步是標出來自問題域的相關的
對象類,對象包括物理實體和概念。所有類在套用中都必須有意義,在問題陳述中,並非所有類都是明顯給出的。有些是隱含在問題域或一般知識中的。
按圖10-19所示的過程確定類
查找問題陳述中的所有名詞,產生如下的暫定類。
軟體 銀行網路 出納員 自動出納機 分行
事務數據 分行計算機 現金卡 用戶 現金
收據 系統 顧客 費用 帳戶數據
訪問 安全措施 記錄保管
根據下列標準,去掉不必要的類和不正確的類。
⑴ 冗餘類:若兩個類表述了同一個信息 ,保留最富有描述能力的類。如"用戶"和"顧客"就是重複的描述,因為"顧客"最富有描述性,因此保留它。
⑵ 不相干的類:除掉與問題沒有關係或根本無關的類。例如,攤派費用超出了銀行網路的範圍。
⑶ 模糊類:類必須是確定的,有些暫定類邊界定義模糊或範圍太廣,如"記錄保管"就模糊類,它是"事務"中的一部分。
⑷ 屬性:某些名詞描述的是其他
對象的屬性,則從暫定類中刪除。如果某一性質的獨立性很重要,就應該把他歸屬到類,而不把它作為屬性。
⑸ 操作:如果問題陳述中的名詞有動作含義,則描述的操作就不是類。但是具有自身性質而且需要獨立存在的操作應該描述成類。如我們只構造電話模型,"撥號"就是
動態模型的一部分而不是類,但在電話撥號系統中,"撥號"是一個重要的類,它日期、時間、受話地點等屬性。
在銀行網路系統中,模糊類是"系統"、"安全措施"、"記錄保管"、"銀行網路"等。屬於屬性的有:"帳戶數據"、"收據"、"現金"、"事務數據"。屬於實現的如:"訪問"、"軟體"等。這些均應除去。
⒉準備數據字典
為所有建模實體準備一個
數據字典。準確描述各個類的精確含義,描述當前問題中的類的範圍,包括對類的成員、用法方面的假設或限制。
⒊確定關聯
兩個或多個類之間的相互依賴就是關聯。一種依賴表示一種關聯,可用各種方式來實現關聯,但在分析模型中應刪除實現的考慮,以便設計時更為靈活。關聯常用描述性動詞或動詞詞組來表示,其中有物理位置的表示、傳導的動作、通信、
所有者關係、條件的滿足等。從問題陳述中抽取所有可能的關聯表述,把它們記下來,但不要過早去細化這些表述。
下面是銀行網路系統中所有可能的關聯,大多數是直接抽取問題中的動詞詞組而得到的。在陳述中,有些動詞詞組表述的關聯是不明顯的。最後,還有一些關聯與客觀世界或人的假設有關,必須同用戶一起核實這種關聯,因為這種關聯在問題陳述中找不到。
銀行網路問題陳述中的關聯:
·銀行網路包括出納站和自動出納機;
·分行共享自動出納機;
·分理處提供分理處計算機;
·分理處計算機保存帳戶;
·分理處計算機處理帳戶支付事務;
·分理處擁有出納站;
·出納站與分理處計算機通信;
·出納員為帳戶錄入事務;
·自動出納機接受現金卡;
·自動出納機發放現金;
·自動出納機列印收據;
·系統處理並發訪問;
·分理處提供軟體;
隱含的動詞詞組:
·分理處擁有帳戶;
·分行擁有分行計算機;
·系統提供記錄保管;
·系統提供安全;
·顧客有現金卡。
基於問題域知識的關聯:
·分理處僱傭出納員;
·現金卡訪問帳戶。
使用下列標準去掉不必要和不正確的關聯:
⑴ 若某個類已被刪除,那么與它有關的關聯也必須刪除或者用其它類來重新表述。在例中,我們刪除了"銀行網路",相關的關聯也要刪除。
⑵ 不相干的關聯或實現階段的關聯:刪除所有問題域之外的關聯或涉及實現結構中的關聯。如"系統處理並發訪問"就是一種實現的概念。
⑶ 動作:關聯應該描述套用域的結構性質而不是瞬時事件,因此應刪除"自動出納機接受現金卡","自動出納機與用戶接口"等。
⑷ 派生關聯:省略那些可以用其他關聯來定義的關聯。因為這種關聯是冗餘的。銀行網路系統的初步
對象圖如圖10-20所示。其中含有關聯。
⒋確定屬性
屬性是個體
對象的性質,屬性通常用修飾性的名詞詞組來表示.形容詞常常表示具體的可枚舉的屬性值,屬性不可能在問題陳述中完全表述出來,必須藉助於套用域的知識及對客觀世界的知識才可以找到它們。只考慮與具體套用直接相關的屬性,不要考慮那些超出問題範圍的屬性。首先找出重要屬性,避免那些只用於實現的屬性,要為各個屬性取有意義的名字。按下列標準刪除不必要的和不正確的屬性:
⑴
對象:若實體的獨立存在比它的值重要,那么這個實體不是屬性而是對象。如在郵政目錄中,"城市"是一個屬性,然而在人口普查中,"城市"則被看作是
對象。在具體套用中,具有自身性質的實體一定是
對象。
⑵ 定詞:若屬性值取決於某種具體上下文,則可考慮把該屬性重新表述為一個限定詞。
⑶ 名稱:名稱常常作為限定詞而不是
對象的屬性,當名稱不依賴於上下文關係時,名稱即為一個對象屬性,尤其是它不惟一時。
⑷
標識符:在考慮
對象模糊性時,引入對象標識符表示,在對象模型中不列出這些對象標識符,它是隱含在對象模型中,只列出存在於套用域的屬性。
⑸ 內部值:若屬性描述了對外不透明的
對象的內部狀態,則應從對象模型中刪除該屬性。
⑹ 細化:忽略那些不可能對大多數操作有影響的屬性。
使用
繼承來共享公共機構,以次來組織類,可以用兩種方式來進行。
⑴ 自底向上通過把現有類的共同性質一般化為父類,尋找具有相似的屬性,關係或操作的類來發現
繼承。例如"遠程事務"和"出納事務"是類似的,可以一般化為"事務"。有些一般化結構常常是基於客觀世界邊界的現有分類,只要可能,儘量使用現有概念。對稱性常有助於發現某些丟失的類。
⑵ 自頂向下將現有的類細化為更具體的子類。具體化常常可以從套用域中明顯看出來。套用域中各枚舉字情況是最常見的具體化的來源。例如:選單,可以有固定選單,頂部選單,彈出選單,下拉選單等,這就可以把選單類具體細化為各種具體選單的子類。當同一關聯名出現多次且意義也相同時,應儘量具體化為相關聯的類,例如"事務"從"出納站"和"自動出納機"進入,則"錄入站"就是"出納站"和"自動出納站"的一般化。在類層次中,可以為具體的類分配屬性和關聯。各屬性和都應分配給最一般的適合的類,有時也加上一些修正。
套用域中各枚舉情況是最常見的具體化的來源。
對象建模不可能一次就能保證模型是完全正確的,軟體開發的整個過程就是一個不斷完善的過程。模型的不同組成部分多半是在不同的階段完成的,如果發現模型的缺陷,就必須返回到前期階段去修改,有些細化工作是在
動態模型和
功能模型完成之後才開始進行的。
·同一類中存在毫無關係的屬性和操作,則分解這個類,使各部分相互關聯;
·一般化體系不清楚,則可能分離扮演兩種角色的類
·存在無目標類的操作,則找出並加上失去目標的類;
·存在名稱及目的相同的冗餘關聯,則通過一般化創建丟失的父類,把關聯組織在一起。
⑵ 查找多餘的類。
類中缺少屬性,操作和關聯,則可刪除這個類。
⑶查找丟失的關聯。
丟失了操作的訪問路徑,則加入新的關聯以回答查詢。
⑷ 網路系統的具體情況作如下的修改:
①現金卡有多個獨立的特性。把它分解為兩個
對象:卡片許可權和現金卡。
a.卡片許可權:它是銀行用來鑑別用戶訪問許可權的卡片,表示一個或多個
用戶帳戶的訪問許可權;各個卡片
許可權對象中可能具有好幾個現金卡,每張都帶有安全碼,卡片碼,它們附在現金卡上,表現銀行的卡片許可權。
b.現金卡:它是自動出納機得到表示碼的數據卡片,它也是銀行代碼和現金卡代碼的數據載體。
②"事務"不能體現對帳戶之間的傳輸描述的一般性,因它只涉及一個帳戶,一般來說,在每個帳戶中,一個"事務"包括一個或多個"更新",一個"更新"是對帳戶的一個動作,它們是取款,存款,查詢之一。一個"更新"中所有"更新"應該是一個
原子操作。
③"分理處"和"分離處理機"之間,"分行"和"分行處理機"之間的區別似乎並不影響分析,計算機的通信處理實際上是實現的概念,將"分理處計算機"併入到"分理處",將"分行計算機"併入到"分行"。
⒈準備腳本
動態分析從尋找事件開始,然後確定各
對象的可能事件順序。在分析階段不考慮
算法的執行,
算法是實現模型的一部分。
⒉確定事件
確定所有外部事件。事件包括所有來自或發往用戶的信息、外部設備的信號、輸入、轉換和動作,可以發現正常事件,但不能遺漏條件和異常事件。
⒊準備事件跟蹤表
把
腳本表示成一個事件跟蹤表,即不同
對象之間的事件排序表,對象為表中的列,給每個對象分配一個獨立的列。
對各對象類建立
狀態圖,反映對象接收和傳送的事件,每個事件跟蹤都對應於狀態圖中一條路徑。
功能模型用來說明值是如何計算的,表明值之間的依賴關係及相關的功能,
數據流圖有助於表示功能依賴關係,其中的處理應於
狀態圖的活動和動作,其中的數據流對應於
對象圖中的對象或屬性。
⒈確定輸入值、輸出值
先列出輸入、輸出值,輸入、輸出值是系統與外界之間的事件的參數。
數據流圖說明輸出值是怎樣從輸入值得來的,數據流圖通常按層次組織。
(五)確定操作
在建立
對象模型時,確定了類、關聯、結構和屬性,還沒有確定操作。只有建立了動態模型和
功能模型之後,才可能最後確定類的操作。
設計
⒈模組化
面向
對象開發方法很自然地支持了把系統分解成模組的設計原則:對象就是模組。它是把
數據結構和操作這些數據的方法緊密地結合在一起所構成的模組。分解系統為一組具有
高內聚和
松耦合的模組是模組化的屬性。
⒉抽象
⒊信息隱藏
⒋低耦合
在
面向對象方法中,對象是最基本的模組,因此,耦合主要指不同對象之間相互關聯的緊密程度。低耦合是設計的一個重要標準,因為這有助於使得系統中某一部分的變化對其它部分的影響降到最低程度。
⑴操作內聚。
⑵類內聚。
⑶一般——具體內聚。
⒈設計結果應該清晰易懂
使設計結果清晰、易懂、易讀是提高
軟體可維護性和可重用性的重要措施。顯然,人們不會重用那些他們不理解的設計。
要做到:
⑴用詞一致。
⑵使用已有的協定。
⑶減少訊息模式的數量。
⑷避免模糊的定義。
⒉一般——具體結構的深度應適當
⒊設計簡單類
應該儘量設計小而簡單的類,這樣便以開發和管理。為了保持簡單,應注意以下幾點:
⑴避免包含過多的屬性。
⑵有明確的定義。
⑷不要提供太多的操作。
⒋使用簡單的協定
一般來說,訊息中參數不要超過3個。
⒌使用簡單的操作
面向對象設計出來的類中的操作通常都很小,一般只有3至5行源程式語句,可以用僅含一個動詞和一個賓語的簡單句子描述它的功能
⒍把設計變動減至最小
通常,設計的質量越高,設計結果保持不變的時間也越長。即使出現必須修改設計的情況,也應該使修改的範圍儘可能小。
系統設計是問題求解及建立解答的高級策略。必須制定解決問題的基該方法,系統的高層結構形式包括子系統的分解、它的固有
並發性、子系統分配給硬軟體、數據
存儲管理、資源協調、軟體控制實現、人機互動接口。
⒈系統設計概述
設計階段先從高層入手,然後細化。
系統設計要決定整個結構及風格,這種結構為後面設計階段的更詳細策略的設計提供了基礎。
⑴系統分解。
系統中主要的組成部分稱為子系統,子系統既不是一個
對象也不是一個功能,而是類、關聯、操作、事件和約束的集合。
⑶處理器及任務分配。
各並發子系統必須分配給單個硬體單元,要么是一個一般的處理器,要么是一個具體的功能單元。
系統中的內部數據和
外部數據的存儲管理是一項重要的任務。通常各數據存儲可以將
數據結構、檔案、資料庫組合在一起,不同數據存儲要在費用、訪問時間、容量及可靠性之間做出折衷考慮。
⑸全局資源的處理。
必須確定全局資源,並且制定訪問全局資源的策略。
⑹選擇軟體控制機制。
分析模型中所有互動行為都表示為
對象之間的事件。
系統設計必須從多種方法中選擇某種方法來實現軟體的控制。
⑺人機互動接口設計。
設計中的大部分工作都與穩定的狀態行為有關,但必須考慮用戶使用系統的互動接口。
通過面向
對象分析得到的問題域精確模型,為設計體系結構奠定了良好的基礎,建立了完整的
框架。
⒋選擇軟體控制機制
⒌數據存儲管理
數據存儲管理是系統存儲或檢索
對象的基本設施,它建立在某種數據存儲管理系統之上,並且隔離了數據存儲管理模式的影響。
⒍設計人機互動接口
在面向
對象分析過程中,已經對用戶界面需求作了初步分析,在
面向對象設計過程中,則應該對系統的人機互動接口進行
詳細設計,以確定人機互動的細節,其中包括指定視窗和報表的形式、設計命令層次等項內容。
⒉三種模型的結合
⑴獲得操作。
⒋最佳化設計
⒌控制的實現
⒎關聯的設計
面向對象程式設計
面向對象程式設計(英語:Object-oriented programming,縮寫:OOP)是一種程式設計范型,同時也是一種程式開發的方法。對象指的是類的實例。
已經被證實的是,面向對象程式設計推廣了程式的靈活性和可維護性,並且在大型項目設計中廣為套用。 此外,支持者聲稱面向對象程式設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程式,使得程式更加便於分析、設計、理解。反對者在某些領域對此予以否認。
當我們提到面向對象的時候,它不僅指一種程式設計方法。它更多意義上是一種程式開發方式。在這一方面,我們必須了解更多關於面向對象系統分析和面向對象設計(Object Oriented Design,簡稱OOD)方面的知識。
面向對象的系統分析
面向對象的分析方法是利用面向對象的信息建模概念,如實體、關係、屬性等,同時運用封裝、繼承、多態等機制來構造模擬現實系統的方法。
傳統的結構化設計方法的基本點是面向過程,系統被分解成若干個過程。而面向對象的方法是採用構造模型的觀點,在系統的開發過程中,各個步驟的共同的目標是建造一個問題域的模型。在面向對象的設計中,初始元素是對象,然後將具有共同特徵的對象歸納成類,組織類之間的等級關係,構造類庫。在套用時,在類庫中選擇相應的類。
實現
採用
面向對象方法開發軟體的基本目的和主要優點是通過重用提高軟體的
生產率。因此,應該優先選用能夠最完善、最準確地表達問題域語義的面向
對象語言。
在選擇
程式語言時,應該考慮的其他因素還有:對用戶學習面向
對象分析、設計和編碼技術所能提供的培訓操作;在使用這個面向對象語言期間能提供的技術支持;能提供給開發人員使用的開發工具、開發平台,對機器性能和記憶體的需求,集成已有軟體的容易程度。
⒉程式設計風格
⑴提高重用性。
⑵提高可擴充性。
(二)類的實現
在開發過程中,類的實現是核心問題。在用面向
對象風格所寫的系統中,所有的數據都被
封裝在類的實例中。而整個程式則被
封裝在一個更高級的類中。在使用既存部件的面向
對象系統中,可以只花費少量時間和工作量來實現軟體。只要增加類的實例,開發少量的新類和實現各個
對象之間互相通信的操作,就能建立需要的軟體。
一種方案是先開發一個比較小、比較簡單的來,作為開發比較大、比較複雜的類的基礎。
⑴“原封不動”重用。
⑵進化性重用。
一個能夠完全符合要求特性的類可能並不存在。
⑶“廢棄性”開發。
不用任何重用來開發一個新類。
⑷錯誤處理。
一個類應是自主的,有責任定位和報告錯誤。
(三)套用系統的實現
套用系統的實現是在所有的類都被實現之後的事。實現一個系統是一個比用過程性方法更簡單、更簡短的過程。有些實例將在其他類的初始化過程中使用。而其餘的則必須用某種主過程顯式地加以說明,或者當作系統最高層的類的表示的一部分。
在C++和C中有一個main()函式,可以使用這個過程來說明構成系統主要
對象的那些類的實例。
⑴算法層。
⑵類層。
測試
封裝在同一個類中的所有方法和屬性之間的相互作用。
⑶模板層。
⑷系統層。
把各個子系統組裝成完整的面向
對象軟體系統,在組裝過程中同時進行測試。
易混概念
“面向對象”和“基於對象”的區別
面向
對象的三大特點(
封裝,
繼承,
多態)缺一不可。通常“
基於對象”是使用
對象,但是無法利用現有的對象模板產生新的對象類型,繼而產生新的對象,也就是說“基於對象”沒有
繼承的特點。而“
多態”表示為父類類型的子類
對象實例,沒有了
繼承的概念也就無從談論“
多態”。很多流行技術都是
基於對象的,它們使用一些
封裝好的對象,調用對象的方法,設定對象的屬性。但是它們無法讓程式設計師派生新
對象類型。他們只能使用現有
對象的方法和屬性。所以當你判斷一個新的技術是否是面向
對象的時候,通常可以使用後兩個特性來加以判斷。“面向對象”和“
基於對象”都實現了“
封裝”的概念,但是面向對象實現了“
繼承和多態”,而“基於對象”沒有實現這些,的確很饒口。
“類庫的創建者”和“類庫的使用者”的區別
從事
面向對象編程的人按照分工來說,可以分為“類庫的創建者”和“類庫的使用者”。使用類庫的人並不都是具備了
面向對象思想的人,通常知道如何
繼承和派生新
對象就可以使用類庫了,然而我們的思維並沒有真正的轉過來,使用類庫只是在形式上是面向對象,而實質上只是
庫函式的一種擴展。
“面向過程”和“面向對象”的區別
面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次調用就可以了;面向對象是把構成問題事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
可以拿生活中的實例來理解面向過程與面向對象,例如五子棋,面向過程的設計思路就是首先分析問題的步驟:1、開始遊戲,2、黑子先走,3、繪製畫面,4、判斷輸贏,5、輪到白子,6、繪製畫面,7、判斷輸贏,8、返回步驟2,9、輸出最後結果。把上面每個步驟用不同的方法來實現。
如果是面向對象的設計思想來解決問題。面向對象的設計則是從另外的思路來解決問題。整個五子棋可以分為1、黑白雙方,這兩方的行為是一模一樣的,2、棋盤系統,負責繪製畫面,3、規則系統,負責判定諸如犯規、輸贏等。第一類對象(玩家對象)負責接受用戶輸入,並告知第二類對象(棋盤對象)棋子布局的變化,棋盤對象接收到了棋子的變化就要負責在螢幕上面顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。
可以明顯地看出,面向對象是以功能來劃分問題,而不是步驟。同樣是繪製棋局,這樣的行為在面向過程的設計中分散在了多個步驟中,很可能出現不同的繪製版本,因為通常設計人員會考慮到實際情況進行各種各樣的簡化。而面向對象的設計中,繪圖只可能在棋盤對象中出現,從而保證了繪圖的統一。
例子
Step1:
⒈1新建一個工程命名為VBOOP;
⒈2單擊工程
選單,選擇添加
類模組後並單擊確定按鈕;
⒈3在其屬性視窗中將類的名稱改為TScore。
⒉1.這裡為TScore類定義四個私有(private)
變數,它們只能在本模組
中是可見的,即類的一些成員被隱藏起來,用戶只能通過屬性過程
private/public <;變數名> As <;變數類型>
代碼部分:
private FName As String\'學生的姓名
private FMath As Single\'數學成績
private FEnglish As Single \'英語成績
⒉2.為TScore類定義六個公用(public)的屬性(Property)過程和一
個計算總分的方法函式。
定義方法的基本語法:
private/public Property Get <;讀屬性過程名> As <;屬性返回值類型>;
private/public Property Let <寫屬性過程名>(ByVal
變數名As 返回值類型);
private/public Function <;函式名> As <;函式返回值類型>;
get: 將模組中的私有
變數的值賦給屬性過程,通常稱為讀;
Let: 通過屬性過程給模組中的私有
變數值賦,通常稱為寫。
代碼部分:
public Property Get GetName() As String
GetName = FName
End Property
public Property Let SetName(ByVal Name As String)
FName = Name
End Property
public Property Get GetMath() As Single
GetMath = FMath
End Property
public Property Let SetMath(ByVal Math As Single)
FMath = Math
End Property
public Property Get GetEnglish() As Single
GetEnglish = FEnglish
End Property
public Property Let SetEnglish(ByVal English As Single)
FEnglish = English
End Property
public Function Total() As Single\'計算總成績函式
Total = GetMath + GetEnglish
End Function
Step3:回到Form1視窗,在視窗上添加12個控制項:
⒊1添加5個文本框txtName、txtMath、txtEN、txtTotal;
⒊2添加5個標籤labName、labMath、labEN、labTotal
其Caption屬性分別為姓名、數學、英語、總成績;
⒊3添加2個
命令按鈕ComSetValues、ComSearch
其Caption屬性分別為賦值、查詢。
Step4:編輯視窗事件
⒋1.構造Score
對象及查詢關鍵字SearchKey。在面向對象方法
中,我們可以這樣說定義類就是定義
數據類型,而聲明對
Dim Score As New TScore
Dim SearchKey As String
private Sub ComSetValues_Click()
If Val(txtMath.Text) >= 0 And Val(txtMath.Text) <= 100
And Val(txtEN.Text) >= 0 And Val(txtEN.Text) <= 100
Then
With Score
.SetName = txtName.Text
.SetMath = Val(txtMath.Text)
.SetEnglish = Val(txtEN.Text)
End With
txtName.Text = \"\"
txtMath.Text = \"\"
txtEN.Text = \"\"
Print \"姓名:\" & Score.GetName & \"數學:\" & Score.GetMath & \"英語:\" & Score.GetEnglish
Else
MsgBox \"成績的取值範圍:[0,100]\",64,\"提示\"
End If
End Sub