面向對象完全教程

        面向對象(Object Oriented,OO)是當前計算機界關心的重點,它是90年代軟件開發方法的主流。面向對象的概念和應用已超越了程序設計軟件開發,擴展到很寬的範圍。如數據庫系統、交互式界面、應用結構、應用平臺、分佈式系統、網絡管理結構、CAD技術、人工智能等領域。
      用結構化方法開發的軟件,其穩定性、可修改性和可重用性都比較差,這是因爲結構化方法的本質是功能分解,從代表目標系統整體功能的單個處理着手,自頂向下不斷把複雜的處理分解爲子處理,這樣一層一層的分解下去,直到僅剩下若干個容易實現的子處理功能爲止,然後用相應的工具來描述各個最低層的處理。因此,結構化方法是圍繞實現處理功能的“過程”來構造系統的。然而,用戶需求的變化大部分是針對功能的,因此,這種變化對於基於過程的設計來說是災難性的。用這種方法設計出來的系統結構常常是不穩定的 ,用戶需求的變化往往造成系統結構的較大變化,從而需要花費很大代價才能實現這種變化。
     根據下列標準,去掉不必要的類和不正確的類。
 (1) 冗餘類:若兩個類表述了同一個信息 ,保留最富有描述能力的類。如"用戶"和"顧客"就是重複的描述,因爲"顧客"最富有描述性,因此保留它。
 (2) 不相干的類:除掉與問題沒有關係或根本無關的類。例如,攤派費用超出了銀行網絡的範圍。
 (3) 模糊類:類必須是確定的,有些暫定類邊界定義模糊或範圍太廣,如"記錄保管"就模糊類,它是"事務"中的一部分。
 (4) 屬性:某些名詞描述的是其他對象的屬性,則從暫定類中刪除。如果某一性質的獨立性很重要,就應該把他歸屬到類,而不把它作爲屬性。
 (5) 操作:如果問題陳述中的名詞有動作含義,則描述的操作就不是類。但是具有自身性質而且需要獨立存在的操作應該描述成類。如我們只構造電話模型,"撥號"就是動態模型的一部分而不是類,但在電話撥號系統中,"撥號"是一個重要的類,它日期、時間、受話地點等屬性。
   銀行網絡問題陳述中的關聯:
 ·銀行網絡包括出納站和自動出納機;
 ·分行共享自動出納機;
 ·分理處提供分理處計算機;
 ·分理處計算機保存帳戶;
 ·分理處計算機處理帳戶支付事務;
 ·分理處擁有出納站;
 ·出納站與分理處計算機通信;
 ·出納員爲帳戶錄入事務;
 ·自動出納機接受現金卡;
 ·自動出納機與用戶接口;
 ·自動出納機發放現金;
 ·自動出納機打印收據;
 ·系統處理併發訪問;
 ·分理處提供軟件;
 ·費用分攤給分理處。
  隱含的動詞詞組:
 ·分行由分理處組成;
 ·分理處擁有帳戶;
 ·分行擁有分行計算機;
 ·系統提供記錄保管;
 ·系統提供安全;
 ·顧客有現金卡。
  基於問題域知識的關聯:
 ·分理處僱傭出納員;
 ·現金卡訪問帳戶。
 (1) 對象:若實體的獨立存在比它的值重要,那麼這個實體不是屬性而是對象。如在郵政目錄中,"城市"是一個屬性,然而在人口普查中,"城市"則被看作是對象。在具體應用中,具有自身性質的實體一定是對象。
 (2) 定詞:若屬性值取決於某種具體上下文,則可考慮把該屬性重新表述爲一個限定詞。
 (3) 名稱:名稱常常作爲限定詞而不是對象的屬性,當名稱不依賴於上下文關係時,名稱即爲一個對象屬性,尤其是它不惟一時。
 (4) 標識符:在考慮對象模糊性時,引入對象標識符表示,在對象模型中不列出這些對象標識符,它是隱含在對象模型中,只列出存在於應用域的屬性。
 (5) 內部值:若屬性描述了對外不透明的對象的內部狀態,則應從對象模型中刪除該屬性。
 (6) 細化:忽略那些不可能對大多數操作有影響的屬性。
   使用繼承來共享公共機構,以次來組織類,可以用兩種方式來進行。
 (1) 自底向上通過把現有類的共同性質一般化爲父類,尋找具有相似的屬性,關係或操作的類來發現繼承。例如"遠程事務"和"出納事務"是類似的,可以一般化爲"事務"。有些一般化結構常常是基於客觀世界邊界的現有分類,只要可能,儘量使用現有概念。對稱性常有助於發現某些丟失的類。
 (2) 自頂向下將現有的類細化爲更具體的子類。具體化常常可以從應用域中明顯看出來。應用域中各枚舉字情況是最常見的具體化的來源。例如:菜單,可以有固定菜單,頂部菜單,彈出菜單,下拉菜單等,這就可以把菜單類具體細化爲各種具體菜單的子類。當同一關聯名出現多次且意義也相同時,應儘量具體化爲相關聯的類,例如"事務"從"出納站"和"自動出納機"進入,則"錄入站"就是"出納站"和"自動出納站"的一般化。在類層次中,可以爲具體的類分配屬性和關聯。各屬性和都應分配給最一般的適合的類,有時也加上一些修正。
 (4) 網絡系統的具體情況作如下的修改:
 ①現金卡有多個獨立的特性。把它分解爲兩個對象:卡片權限和現金卡。
 a.卡片權限:它是銀行用來鑑別用戶訪問權限的卡片,表示一個或多個用戶帳戶的訪問權限;各個卡片權限對象中可能具有好幾個現金卡,每張都帶有安全碼,卡片碼,它們附在現金卡上,表現銀行的卡片權限。
 b.現金卡:它是自動出納機得到表示碼的數據卡片,它也是銀行代碼和現金卡代碼的數據載體。
 ②"事務"不能體現對帳戶之間的傳輸描述的一般性,因它只涉及一個帳戶,一般來說,在每個帳戶中,一個"事務"包括一個或多個"更新",一個"更新"是對帳戶的一個動作,它們是取款,存款,查詢之一。一個"更新"中所有"更新"應該是一個原子操作。
 ③"分理處"和"分離處理機"之間,"分行"和"分行處理機"之間的區別似乎並不影響分析,計算機的通信處理實際上是實現的概念,將"分理處計算機"併入到"分理處",將"分行計算機"併入到"分行"。
      很多人沒有區分“面向對象”和“基於對象”兩個不同的概念。面向對象的三大特點(封裝,繼承,多態)卻一不可。通常“基於對象”是使用對象,但是無法利用現有的對象模板產生新的對象類型,繼而產生新的對象,也就是說“基於對象”沒有繼承的特點。而“多態”表示爲父類類型的子類對象實例,沒有了繼承的概念也就無從談論“多態”。現在的很多流行技術都是基於對象的,它們使用一些封裝好的對象,調用對象的方法,設置對象的屬性。但是它們無法讓程序員派生新對象類型。他們只能使用現有對象的方法和屬性。所以當你判斷一個新的技術是否是面向對象的時候,通常可以使用後兩個特性來加以判斷。“面向對象”和“基於對象”都實現了“封裝”的概念,但是面向對象實現了“繼承和多態”,而“基於對象”沒有實現這些,的確很饒口。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章