說到面向對象,這方面的文章很多。然而,很少有明確給出或解釋的對象定義——至少我還沒找到。起初,“面向對象”是指程序設計中使用的封裝、繼承、抽象等設計方法。但是,這個定義顯然已經不適合現在的情況了。面向對象的思想已經涉及到軟件開發的各個方面。比如我們常說的OOA(面向對象分析)、OOD(面向對象設計)、OOP(面向對象編程)。很多關於面向對象的文章都只是關於面向對象開發中需要註意的問題或者采用的比較好的設計方法。只有讀完這些文章,妳才能真正理解什麽是對象,什麽是面向對象,妳才能最大程度的讓自己受益。對於初學者,甚至從事相關工作多年的人來說,恐怕概念都會比較模糊。
面向對象是當前計算機行業的焦點,是90年代軟件開發方法的主流。面向對象的概念和應用已經超越了編程和軟件開發的範疇,擴展到了更廣的範圍。如數據庫系統、交互界面、應用結構、應用平臺、分布式系統、網絡管理結構、CAD技術、人工智能等領域。
第壹,傳統發展方式存在的問題
1.軟件可重用性差
可重用性是指同壹事物不經修改或稍加修改即可多次重用的性質。軟件可重用性是軟件工程追求的目標之壹。
2.軟件可維護性差
軟件工程強調軟件的可維護性和文檔的重要性,規定最終的軟件產品應該由完整的、壹致的配置組件組成。在軟件開發過程中,始終強調軟件的可讀性、可修改性和可測試性是軟件的壹個重要質量指標。實踐證明,用傳統方法開發的軟件成本和費用仍然很高,這是由於可修改性差,維護困難,導致可維護性差。
3.開發的軟件不能滿足用戶的需求。
用傳統的結構化方法開發大型軟件系統,涉及到各個領域的知識。在開發具有模糊或動態需求的系統時,開發的軟件系統往往不能真正滿足用戶的需求。
用結構化方法開發的軟件穩定性、可修改性和可重用性較差,因為結構化方法的本質是功能分解。從代表目標系統整體功能的單個流程開始,將復雜的流程從上到下不斷分解成子流程,這樣壹層壹層分解,直到只剩下幾個子流程,然後用相應的工具描述最底層的流程。因此,結構化方法是圍繞實現處理功能的“過程”來構建系統的。但是用戶需求的改變大部分是針對功能的,所以這種改變對於基於流程的設計來說是災難性的。用這種方法設計的系統結構往往是不穩定的,用戶需求的變化往往會引起系統結構的巨大變化,所以實現這種變化需要大量的資金。
二、面向對象的基本概念
(1)對象。
對象是人們想要研究的任何東西,從最簡單的整數到復雜的飛機。它不僅可以表示具體的事物,也可以表示抽象的規則、計劃或事件。
(2)對象的狀態和行為。
對象有壹個狀態,對象用數據值描述它的狀態。
對象也有操作,用來改變對象的狀態。對象及其操作是對象的行為。
對象實現了數據和操作的結合,使數據和操作封裝在對象的統壹體中。
(3)階級。
具有相同或相似屬性的對象的抽象是壹個類。所以對象的抽象就是類,類的具體化就是對象。也可以說壹個類的實例就是壹個對象。
類有屬性,屬性是對象狀態的抽象。數據結構用於描述類的屬性。
壹個類有壹個操作,操作是對象行為的抽象,由操作名和實現操作的方法來描述。
(4)班級的結構。
客觀世界有幾個範疇,這些範疇之間有壹定的結構關系。通常有兩種主要的結構關系,即壹般-具體結構關系和整體-部分結構關系。
①壹般-具體結構稱為分類結構,也可以說是“或”關系或“是壹個”關系。
②整體部分結構稱為裝配結構,它們之間的關系是壹個and關系或a有a關系。
(5)信息和方法。
對象之間的通信結構稱為消息。在對象的操作中,當壹個消息被發送給壹個對象時,該消息包含接收對象將執行某種操作的信息。發送消息至少應該包括接受消息的對象名和發送給對象的消息名(即對象名和方法名)。通常,有必要解釋參數,參數可以是知道消息的對象已知的變量名,也可以是所有對象已知的全局變量名。
類中操作的實現過程稱為方法,方法有方法名、參數和方法體。消息傳輸如圖10-1所示。
二、面向對象的特點
(1)對象唯壹性。
每個對象都有自己唯壹的標識,通過標識可以找到對應的對象。在壹個物體的整個生命周期中,它的標誌不會改變,不同的物體不能有相同的標誌。
(2)分類。
分類是指將數據結構(屬性)和行為(操作)壹致的對象抽象成類。類就是這樣壹種抽象,它反映了與應用程序相關的重要屬性,而忽略了其他不相關的內容。任何壹個類的劃分都是主觀的,但是壹定要和具體的應用相關。
(3)繼承。
繼承是子類自動共享父類的數據結構和方法的機制,是類之間的關系。在定義和實現壹個類的時候,可以在壹個已有類的基礎上進行,把這個已有類定義的內容作為自己的內容,加入壹些新的內容。
繼承是面向對象編程語言區別於其他語言的最重要的特點,這是其他語言所不具備的。
在類層次結構中,子類只繼承壹個父類的數據結構和方法,稱為單壹繼承。
在類層次結構中,子類繼承多個父類的數據結構和方法,稱為多重繼承。
在軟件開發中,類的繼承使得已建立的軟件具有開放性和可擴展性,是壹種有效的信息組織和分類方法。它簡化了創建對象和類的工作量,增加了代碼的可重復性。
通過采用繼承,提供了類規範的層次結構。通過類的繼承關系,可以共享共同的特性,提高軟件的可重用性。
(4)多態性(Polymorphism)
多態性意味著相同的操作或功能或過程可以作用於許多類型的對象,並得到不同的結果。不同的對象收到相同的消息時會產生不同的結果。這種現象被稱為多態性。
多態允許每個對象以自己的方式響應相同的消息。
多態增強了軟件的靈活性和可重用性。
第三,面向對象的元素
(1)抽象。
抽象就是強調實體的本質和固有屬性。在系統開發中,抽象是指在決定如何實現對象之前,對象的意義和行為。使用抽象可以避免過早考慮壹些細節。
類實現了對象的數據(即狀態)和行為的抽象。
(2)封裝(信息隱藏)。
封裝是確保軟件組件良好模塊化的基礎。
面向對象的類是壹個包裝良好的模塊。類定義明確地將其描述(用戶可見的外部接口)與其實現(用戶不可見的內部實現)分開,其內部實現根據其具體定義的範圍提供保護。
對象是封裝的最基本單位。封裝防止了程序相互依賴引起的變化的影響。面向對象的包裝比傳統的語言包裝更加清晰和強大。
(3)***享受
面向對象技術在不同層次上促進了* * *的享受。
* * *同類別。同壹類中的對象具有相同的數據結構。這些對象在結構和行為特征上存在* * *共享關系。
享受同壹個應用程序。在同壹應用的類層次結構中,具有繼承關系的相似子類之間存在數據結構和行為的繼承,使得所有相似子類* * *享有相同的結構和行為。利用繼承來實現代碼的享受也是面向對象的主要優勢之壹。
享受不同的應用程序。面向對象不僅允許信息在同壹應用程序中共享,而且為將來目標的可重用設計準備了條件。通過類庫的機制和結構,可以實現不同應用中的信息共享。
4.強調對象結構而不是程序結構。
第四,面向對象開發方法
目前,面向對象開發方法的研究已經日趨成熟,世界上已經出現了許多面向對象的產品。面向對象的開發方法包括Coad方法、Booch方法和OMT方法。
1.布奇方法
Booch首先描述了面向對象軟件開發方法的基本問題,指出面向對象開發是壹種與傳統功能分解有根本區別的設計方法。面向對象的軟件分解更接近人們對客觀事務的理解,而功能分解只能通過問題空間的變換來獲得。
2.Coad方法
Coad方法是由Coad和Yourdon在1989中提出的壹種面向對象的開發方法。這種方法的主要優點是通過多年大型系統開發經驗和面向對象概念的有機結合,在對象、結構、屬性和操作的識別上提出了壹套系統化的原則。該方法從需求的角度完成了對類和類層次結構的進壹步識別。Coad方法雖然沒有引入類和類層次的術語,但實際上在分類結構、屬性、操作、消息關聯等概念上體現了類和類層次的特征。
3.OMT方法
OMT方法由James Rumbaugh等人在1991中提出,其經典之作是《面向對象建模與設計》。
該方法是壹種新的面向對象開發方法。開發工作的基礎是對現實世界的對象建模,然後使用分析模型圍繞這些對象獨立於語言進行設計。面向對象的建模和設計促進了對需求的理解,並有助於開發更清晰和更易於維護的軟件系統。該方法為大多數應用領域的軟件開發提供了實用高效的保障,力求找到壹種實用的解決問題的方法。
4.統壹建模語言
軟件工程領域從1995到1997取得了前所未有的進步,其成就超過了過去15軟件工程領域成就的總和。最重要的成就之壹是統壹建模語言(UML)的出現。UML將成為面向對象技術領域中占主導地位的標準建模語言。
UML不僅統壹了Booch方法、OMT方法和OOSE方法的表示方法,而且對它們進行了進壹步的發展,最終統壹成壹種為大眾所接受的標準建模語言。UML是壹種定義良好、易於表達、功能強大且普遍適用的建模語言。它融合了軟件工程領域的新思想、新方法和新技術。其範圍不限於支持面向對象的分析和設計,還支持從需求分析到軟件開發的全過程。
動詞 (verb的縮寫)面向對象模型
對象模型
對象模型表示系統的靜態和結構化數據屬性,並描述系統的靜態結構。它是從客觀世界實體的對象關系的角度來描述的,顯示了對象之間的相互關系。該模型主要關註系統中對象的結構、屬性和操作。它是分析階段三個模型的核心,也是另外兩個模型的框架。
65438+
(1)對象。
對象建模的目的是描述對象。
(2)階級。
通過將對象抽象成類,可以將問題抽象出來,抽象增強了模型的歸納能力。
(3)屬性。
屬性是指類中對象的屬性(數據值)。
(4)操作和方法。
操作是由類中的對象使用的函數或轉換。類中的每個對象都可以享受操作,並且每個操作都有壹個目標對象作為它的隱式參數。
方法是類操作的實現步驟。
2.關聯和鏈
關聯是建立類之間關系的手段,而鏈是建立對象之間關系的手段。
(1)關聯和鏈的含義。
鏈表示對象之間的物理和概念連接,關聯表示類之間的關系,鏈是關聯的實例,關聯是鏈的抽象。
(2)角色。
角色描述了類在關聯中的角色,它位於關聯的端點。
(3)限制交往。
受限關聯由兩個類和壹個限定符組成。限定詞是壹個特定的屬性,用於有效減少重復關聯。限定符在相關的終端對象集中描述。
限定提高了語義準確性和查詢能力。在現實世界中,限定詞經常出現。
(4)相關性的多重性。
關聯的多重性指的是壹個類中有多少對象與關聯類的壹個對象相關。多重性通常被描述為“壹個”或“許多”。
圖10-8顯示了各種關聯的多樣性。實心小圓圈表示“多個”,從零到很多。小空心圓代表零或壹。沒有符號表示壹對壹的關聯。
3.類的層次結構
(1)聚合關系。
聚合是壹種“整體-部分”的關系。在這種關系中,有整體類和部分類。聚集最重要的性質是傳遞性和反對稱。
聚合可以有不同的層次,不同的分類可以聚合得到壹個簡單的聚合樹。聚合樹是壹種簡單的表示,比畫很多線連接壹些類要簡單得多。對象模型應該很容易反映所有級別。圖10-10顯示了壹個關於微型計算機的多極聚集。
(2)廣義關系。
廣義關系是壹種高度抽象的方式,在保留對象差異的同時享受對象的相似性。這是壹種“壹般-具體”的關系。壹般化的類叫做妳的類,具體的類也可以叫做子類。每個子類繼承了相交類的屬性,每個子類的壹些* * *相同的屬性和操作被總結到妳的類中。所以泛化關系和繼承並存。廣義關系的符號化表示是在類關聯的連線上加壹個小三角形,如圖10-11。
4.對象模型
(1)模板。模板是類、關聯和通用結構的邏輯組合。
(2)對象模型。
對象模型由壹個或幾個模板組成。模板將模型分成幾個可管理的子塊,並在整個對象模型和類及關聯的構建塊之間提供壹個集成的中間單元。模板中的類名和關聯名是唯壹的。
動力模型
動態模型是與時間和變化相關的系統屬性。該模型描述了系統的控制結構,代表了瞬時和行為系統控制。
自然,關註系統的控制和操作的執行順序,從對象的事件和狀態的角度來表示對象的相互行為。
該模型中描述的系統屬性是觸發事件、事件序列、狀態以及事件和狀態的組織。使用狀態圖作為描述工具。涉及到事件、狀態、操作等重要概念。
1.事件
事件是在特定時刻發生的事情。
2.狀態
狀態是對象屬性值的抽象。根據影響對象顯著行為的性質,將對象的屬性值合並成壹種狀態。狀態表示對象
對輸入事件的響應。
3.狀態圖
狀態圖是壹個標準的計算機概念,是有限自動機的圖形化表示。這裏,狀態圖被用作建立動態模型的圖形工具。
狀態圖反映了狀態和事件之間的關系。當接收到壹個事件時,下壹個狀態依賴於當前狀態和接收到的事件,由該事件引起的狀態變化稱為轉換。
狀態圖是壹種圖,其中節點表示狀態,節點用圓圈表示。圈裏有壹個狀態名,用箭頭連接表示狀態轉換,上面標有事件名,箭頭的方向表示轉換的方向。
功能模型
功能模型描述了系統的所有計算。功能模型指示發生了什麽,動態模型決定什麽時候發生,對象模型決定發生了什麽。函數模型顯示了計算如何從輸入值獲得輸出值,而不考慮計算的順序。功能模型由幾個數據流圖組成。數據流圖用於表示數據值從源對象到目標對象的流向。它不包含在動態模型中表達的控制信息。同時,數據流圖並不表示對象中值的組織,而是在對象模型中表示值的組織。圖10-15顯示了窗口系統圖標顯示的數據流圖。
數據流圖包括處理、數據流、動作對象和數據存儲對象。
1.處理
數據流圖中的處理用於更改數據值。最低級的處理是純函數,完整的數據流圖是高級處理。
2.數據流
數據流圖中的數據流鏈接了對象的輸出和處理,對象的處理和輸入,處理和處理。在計算機中,中間數據值由數據流表示,數據流不能改變數據值。
3.動作對象
動作對象是活動對象,它通過生成或使用數據值來驅動數據流圖。
4.數據存儲對象
數據流圖中的數據存儲是壹個被動對象,用來存儲數據。它不同於動作對象。數據存儲本身不產生任何操作,只是響應存儲和訪問的需求。
不及物動詞面向對象的分析
面向對象分析的目的是在客觀世界中對系統建模。基於以上介紹的模型概念,本節結合“銀行網絡系統”的具體實例,構建壹個準確嚴謹的客觀世界問題分析模型。
分析模型有三個目的:明確問題需求;為用戶和開發者提供明確的需求;它作為後續設計和實現的框架,為用戶和開發人員之間的協商提供了基礎。
面向對象的分析
系統分析的第壹步是陳述需求。分析師必須與用戶壹起細化需求,因為這顯示了用戶的真實意圖,包括分析需求和尋找缺失的信息。我們以“銀行網絡系統”為例,用面向對象的方法進行開發。
銀行網絡系統問題陳述:設計支持銀行網絡的軟件,包括分行享有的人工櫃員機站和自動櫃員機。每個分公司用壹臺分公司電腦,自己記賬,自己處理事務;各自分行的出納臺與分行計算機通信,出納臺輸入賬戶和交易數據;ATM與分支計算機通信,分支計算機與撥款分支機構結算,ATM與用戶接口接受現金卡,與分支計算機通信完成交易,分發現金和打印收據;該系統需要記錄和安全措施;系統必須正確處理同壹賬戶的並發訪問;各支行為自己的電腦準備軟件,銀行網費根據客戶數和現金卡數分攤到各支行。
圖10-18為銀行網絡系統示意圖。
(2)建立對象模型
首先,識別和聯想,因為它們影響整體結構和解決問題的方法。其次,添加屬性,進壹步描述類和關聯的基本網絡,通過繼承合並和組織類。最後,將操作添加到類中,作為構建動態模型和功能模型的副產品。
1.確定類別
構建對象模型的第壹步是從問題域中標記相關的對象類,包括物理實體和概念。所有的類都必須在應用中有意義,並不是所有的類都在問題陳述中明確給出。有些隱含在問題域或常識中。
按照圖10-19所示的流程確定班級。
找出問題陳述中的所有名詞,並生成以下暫定類。
軟件銀行網絡櫃員ATM分行
單獨處理和單獨處理計算機帳戶交易收銀臺
交易數據分行計算機現金卡用戶現金
收據系統客戶費用帳戶數據
獲取安全措施記錄保存
根據以下標準刪除不必要的類和不正確的類。
(1)冗余類:如果兩個類表達的信息相同,保留描述能力最強的類。比如“用戶”和“客戶”都是重復描述,因為“客戶”是描述性最強的,所以保留。
(2)無關類:剔除與問題無關或根本無關的類。比如費用的分攤就超出了銀行網絡的範圍。
(3)模糊類:類必須是確定的,有些暫定類邊界模糊或過寬,如“記賬”,是“交易”的壹部分。
(4)屬性:有些名詞描述其他物體的屬性,所以從暫定類中刪除。如果壹個屬性的獨立性很重要,那麽它應該被歸類為壹個類,而不是壹個屬性。
(5)操作:如果問題語句中的名詞有動作意義,則所描述的操作不是壹類。但是有自己的屬性,需要獨立存在的操作,應該描述為類。如果只構造電話模型,“撥號”是動態模型的壹部分而不是壹個類,但是在電話撥號系統中,“撥號”是壹個重要的類,有日期、時間、接收地點等屬性。
在銀行網絡系統中,模糊類別是“系統”、“安全措施”、“記錄保存”和“銀行網絡”。這些屬性是:“賬戶數據”、“收據”、“現金”和“交易數據”。屬於實現的,比如“通路”“軟件”。這些應該去掉。
2.準備數據字典
為所有建模實體準備壹個數據字典。準確描述每個類的精確含義,描述當前問題中類的範圍,包括對類的成員和用法的假設或限制。
確定聯系
兩個或多個類之間的相互依賴就是關聯。壹個依賴關系代表壹種關聯,這種關聯可以通過多種方式實現,但是在分析模型中應該刪除對實現的考慮,以便在設計上更加靈活。聯想常常用描述性動詞或動詞短語來表達,包括物理位置、傳導動作、交流、所有者關系、條件滿足等的表征。從問題陳述中提取所有可能的相關陳述並寫下來,但不要過早提煉這些陳述。
以下是銀行網絡系統中所有可能的聯想,大部分是直接提取問題中的動詞短語得到的。在陳述中,壹些動詞短語的相關性不明顯。最後,還有壹些與客觀世界或人的假設有關的聯系,因為在問題陳述中找不到,所以必須與用戶進行驗證。
銀行網絡問題陳述中的相關性;
銀行網絡包括收銀臺和自動取款機;
分行* * *享受ATM
分公司提供分公司電腦;
分支計算機帳戶;
分行計算機處理賬戶支付;
分支機構有出納臺;
出納站與分支機構之間的計算機通信;
出納員為帳戶輸入交易;
ATM接受現金卡;
自動櫃員機和用戶界面;
自動櫃員機發行現金;
自動櫃員機打印收據;
系統處理並發訪問;
分公司提供軟件;
與分公司分擔費用。
隱含動詞短語:
分公司由分公司組成;
分公司有賬戶;
分公司有分公司電腦;
該系統提供記錄保存;
系統提供安全性;
顧客有壹張現金卡。
基於問題領域知識的關聯;
分支機構出納員的雇用;
現金卡存取帳戶。
使用以下標準刪除不必要和不正確的關聯:
(1)如果某個類別已被刪除,則與該類別相關的關聯也必須被刪除或與其他類別壹起重述。在示例中,我們刪除了“銀行網絡”,相關的關聯也應該被刪除。
(2)不相關的關聯或實現階段的關聯:刪除所有問題域之外的關聯或涉及實現結構的關聯。例如,“系統處理並發訪問”是壹個實現概念。
(3)動作:關聯應該描述應用域的結構性質而不是瞬時事件,所以應該刪除“ATM接受現金卡”和“ATM與用戶界面”。
(4)派生關聯:省略那些可以由其他關聯定義的關聯。因為這個關聯是多余的。銀行網絡系統的初步對象圖如圖10-20所示。它包含連接。
4.確定屬性
屬性是單個物體的性質,通常用裝飾性名詞短語來表示。形容詞往往代表具體的、可枚舉的屬性值,屬性在問題語句中無法完整表達。它們只能通過應用領域和客觀世界的知識來發現。只考慮與具體應用直接相關的屬性,不考慮那些超出問題範圍的屬性。首先找出重要的屬性,避開那些只用於實現的,給每個屬性取個有意義的名字。根據以下標準刪除不必要和不正確的屬性:
(1)對象:如果壹個實體的獨立存在比它的價值更重要,那麽這個實體就不是屬性而是對象。例如,在郵政目錄中,“城市”是壹個屬性,但在人口普查中,“城市”被視為對象。在特定的應用中,具有自身屬性的實體必須是對象。
(2)屬性:如果屬性值依賴於特定的上下文,我們可以考慮將屬性重新表述為限定詞。
(3)名稱:名稱常用作限定詞而非賓語定語。當壹個名稱不依賴於上下文時,它就是壹個對象屬性,尤其是當它不唯壹時。
(4)標識符:在考慮對象的模糊性時,引入了對象標識符,它不在對象模型中列出,而是隱含在對象模型中,只列出存在於應用領域中的屬性。
(5)內部值:如果壹個屬性描述了壹個不透明對象的內部狀態,那麽應該將其從對象模型中刪除。
(6)細化:忽略那些不太可能影響大部分操作的屬性。
5.使用繼承來細化類
利用繼承* * *享受事業單位和組織輪流上課有兩種方式。
(1)自下而上,將現有類的* * *同態推廣到父類中,尋找具有相似屬性、關系或運算的類來發現繼承。比如“遠程交易”和“收銀交易”類似,可以概括為“交易”。壹些廣義的結構往往是基於客觀世界邊界的現有分類。只要有可能,盡量使用現有的概念。對稱性往往有助於發現壹些缺失的類。
(2)從上到下將已有的類細化為更具體的子類。從應用領域往往可以清楚地看到具體化。枚舉器在域中的應用是最常見的具體化來源。例如,菜單可以包括固定菜單、頂部菜單、彈出菜單、下拉菜單等。,它可以將菜單類別細分為各種特定菜單的子類。當同壹個關聯名稱多次出現且含義相同時,應盡量具體化為相關類。比如“交易”從“收銀臺”和“自動櫃員機”進入,那麽“進入臺”就是“收銀臺”和“自動收銀臺”的概括。在類層次結構中,您可以將屬性和關聯分配給特定的類。所有的屬性和應該被分配到最通用和最合適的類,有時需要壹些修改。
應用程序域中的枚舉是最常見的具體化來源。
6.改進對象模型
對象建模不能保證模型壹次完全正確,軟件開發的整個過程是壹個持續改進的過程。模型的大部分不同組成部分是在不同階段完成的。如果發現了模型的缺陷,就要回到前壹階段進行修改,在動態模型和功能模型完成後就開始壹些細化工作。
(1)丟失對象的幾種可能情況及其解決方法:
如果同壹個類中存在不相關的屬性和操作,則分解類使各部分相互關聯;
如果泛化系統不清晰,就有可能把扮演兩種角色的類分開。
如果有沒有目標類的操作,找出並添加沒有目標的類;
如果存在具有相同名稱和目的的冗余關聯,則通過泛化來創建丟失的父類,以將關聯組織在壹起。
(2)查找冗余類。
如果類中缺少屬性、操作和關聯,可以將其刪除。