国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

一些面向?qū)ο蟮脑O(shè)計(jì)法則(1)

2019-11-18 11:55:27
字體:
供稿:網(wǎng)友

  法則1:優(yōu)先使用(對(duì)象)組合,而非(類)繼續(xù)
  
  [ Favor Composition Over Inheritance ]
  
  
  
  
  
  
  
  
  組合
  
  
  
  
  
  
  1.(對(duì)象)組合是一種通過創(chuàng)建一個(gè)組合了其它對(duì)象的對(duì)象,從而獲得新功能的復(fù)用方法。
  
  2.將功能委托給所組合的一個(gè)對(duì)象,從而獲得新功能。
  
  3.有些時(shí)候也稱之為"聚合"(aggregation)或"包容"(containment),盡管有些作者對(duì)這些術(shù)語賦予了專門的含義
  
  4.例如:
  
  a.聚合:一個(gè)對(duì)象擁有另一個(gè)對(duì)象或?qū)α硪粋€(gè)對(duì)象負(fù)責(zé)(即一個(gè)對(duì)象包含另一個(gè)對(duì)象或是另一個(gè)對(duì)象的一部分),并且聚合對(duì)象和其所有者具有相同的生命周期。(譯者注:即所謂的"同生共死"關(guān)系,可參見GOF的Design
  Patterns: Elements of Reusable Object-Oriented Software的引言部分。)
  
  b.包容:一種非凡類型的組合,對(duì)于其它對(duì)象而言,容器中的被包含對(duì)象是不可見的,其它對(duì)象僅能通過容器對(duì)象來訪問被包含對(duì)象。(Coad)
  
  
  
  
  
  
  
  
  5.包含可以通過以下兩種方式實(shí)現(xiàn):
  
  a.根據(jù)引用(By reference)
  
  b.根據(jù)值(By value)
  
  6.C++答應(yīng)根據(jù)值或引用來實(shí)現(xiàn)包含。
  
  7.但是在java中,一切皆為對(duì)象的引用!
  
  
  
  
  
  
  
  
  
  組合的優(yōu)點(diǎn)和缺點(diǎn)
  
  
  
  
  
  
  
  
  
  1.優(yōu)點(diǎn):
  
  a.容器類僅能通過被包含對(duì)象的接口來對(duì)其進(jìn)行訪問。
  
  b."黑盒"復(fù)用,因?yàn)楸话瑢?duì)象的內(nèi)部細(xì)節(jié)對(duì)外是不可見。
  
  c.對(duì)裝性好。
  
  d.實(shí)現(xiàn)上的相互依靠性比較小。(譯者注:被包含對(duì)象與容器對(duì)象之間的依靠關(guān)系比較少)
  
  e.每一個(gè)類只專注于一項(xiàng)任務(wù)。
  
  f.通過獲取指向其它的具有相同類型的對(duì)象引用,可以在運(yùn)行期間動(dòng)態(tài)地定義(對(duì)象的)組合。
  
  
  
  
  
  
  
  2.缺點(diǎn):
  
  a.從而導(dǎo)致系統(tǒng)中的對(duì)象過多。
  
  b為了能將多個(gè)不同的對(duì)象作為組合塊(composition block)來使用,必須仔細(xì)地對(duì)接口進(jìn)行定義。
  
  
  
  
  
  
  
  
  
  繼續(xù)
  
  
  
  
  
  
  1.(類)繼續(xù)是一種通過擴(kuò)展一個(gè)已有對(duì)象的實(shí)現(xiàn),從而獲得新功能的復(fù)用方法。
  
  2.泛化類(超類)可以顯式地捕捉那些公共的屬性和方法。
  
  3.非凡類(子類)則通過附加屬性和方法來進(jìn)行實(shí)現(xiàn)的擴(kuò)展。
  
  
  
  
  
  
  
  
  
  
  繼續(xù)的優(yōu)點(diǎn)和缺點(diǎn)
  
  
  
  
  
  
  1.優(yōu)點(diǎn):
  
  a.輕易進(jìn)行新的實(shí)現(xiàn),因?yàn)槠浯蠖鄶?shù)可繼續(xù)而來。
  
  b.易于修改或擴(kuò)展那些被復(fù)用的實(shí)現(xiàn)。
  
  2.缺點(diǎn):
  
  a.破壞了封裝性,因?yàn)檫@會(huì)將父類的實(shí)現(xiàn)細(xì)節(jié)暴露給子類。
  
  b. "白盒"復(fù)用,因?yàn)楦割惖膬?nèi)部細(xì)節(jié)對(duì)于子類而言通常是可見的。
  
  c.當(dāng)父類的實(shí)現(xiàn)更改時(shí),子類也不得不會(huì)隨之更改。
  
  d.從父類繼續(xù)來的實(shí)現(xiàn)將不能在運(yùn)行期間進(jìn)行改變。
  
  
  
  
  
  
  
  
  
  
  Coad規(guī)則
  
  
  
  
  
  
  僅當(dāng)下列的所有標(biāo)準(zhǔn)被滿足時(shí),方可使用繼續(xù):
  
  a.子類表達(dá)了"是一個(gè)…的非凡類型",而非"是一個(gè)由…所扮演的角色"。
  
  b子類的一個(gè)實(shí)例永遠(yuǎn)不需要轉(zhuǎn)化(transmute)為其它類的一個(gè)對(duì)象。
  
  c.子類是對(duì)其父類的職責(zé)(responsibility)進(jìn)行擴(kuò)展,而非重寫或廢除(nullify)。
  
  d.子類沒有對(duì)那些僅作為一個(gè)工具類(utility class)的功能進(jìn)行擴(kuò)展。
  
  e.對(duì)于一個(gè)位于實(shí)際的問題域(PRoblem Domain)的類而言,其子類特指一種角色(role),交易(transaction)或設(shè)備(device)。
  
  
  
  繼續(xù)/組合示例1
  
   一些面向?qū)ο蟮脑O(shè)計(jì)法則(1)(圖一)
  
  1."是一個(gè)…的非凡類型",而非"是一個(gè)由…所扮演的角色"
  
  -->失敗。乘客是人所扮演的一種角色。代理人亦然。
  
  2.永遠(yuǎn)不需要轉(zhuǎn)化
  
  -->失敗。隨著時(shí)間的發(fā)展,一個(gè)Person的子類實(shí)例可能會(huì)從Passenger轉(zhuǎn)變成Agent,再到Agent Passenger。
  
  3.擴(kuò)展,而非重寫和廢除
  
  -->通過。
  
  4.不要擴(kuò)展一個(gè)工具類
  
  -->通過。
  
  5.在問題域內(nèi),特指一種角色,交易或設(shè)備
  
  -->失敗。Person不是一種角色,交易或設(shè)備。
  
  
  
  
  
  
  
  
  
  繼續(xù)并非適用于此處!
  
  
  
  使用組合進(jìn)行拯救!
  
  
   一些面向?qū)ο蟮脑O(shè)計(jì)法則(1)(圖二)
  
  繼續(xù)/組合示例2
  
   一些面向?qū)ο蟮脑O(shè)計(jì)法則(1)(圖三)
  
  1."是一個(gè)…的非凡類型",而非"是一個(gè)由…所扮演的角色"
  
  -->通過。乘客和代理人都是非凡類型的人所扮演的角色。
  
  2.永遠(yuǎn)不需要轉(zhuǎn)化
  
  -->通過。一個(gè)Passenger對(duì)象將保持不變;Agent對(duì)象亦然。
  
  3.擴(kuò)展,而非重寫和廢除
  
  -->通過。
  
  4.不要擴(kuò)展一個(gè)工具類
  
  -->通過。
  
  5.在問題域內(nèi),特指一種角色,交易或設(shè)備
  
  -->通過。PersonRole是一種類型的角色。
  
  
  
  
  
  
  
  
  
  繼續(xù)適用于此處!
  
  
  
  
  
  
  
  
  
  繼續(xù)/組合示例3
  
   一些面向?qū)ο蟮脑O(shè)計(jì)法則(1)(圖四)
  
  1."是一個(gè)…的非凡類型",而非"是一個(gè)由…所扮演的角色"
  
  -->通過。預(yù)訂和購買都是一種非凡類型的交易。
  
  2.永遠(yuǎn)不需要轉(zhuǎn)化
  
  -->通過。一個(gè)Reservation對(duì)象將保持不變;Purchase對(duì)象亦然。
  
  3.擴(kuò)展,而非重寫和廢除
  
  -->通過。
  
  4.不要擴(kuò)展一個(gè)工具類
  
  -->通過。
  
  5.在問題域內(nèi),特指一種角色,交易或設(shè)備
  
  -->通過。是一種交易。
  
  
  
  
  
  
  
  
  
  繼續(xù)適用于此處!
  
  
  
  
  
  
  
  
  
  繼續(xù)/組合示例4
  
  一些面向?qū)ο蟮脑O(shè)計(jì)法則(1)(圖五)
  
  1."是一個(gè)…的非凡類型",而非"是一個(gè)由…所扮演的角色"
  
  -->失敗。預(yù)訂不是一種非凡類型的observable。
  
  2.永遠(yuǎn)不需要轉(zhuǎn)化
  
  -->通過。一個(gè)Reservation對(duì)象將保持不變。
  
  3.擴(kuò)展,而非重寫和廢除
  
  -->通過。
  
  4.不要擴(kuò)展一個(gè)工具類
  
  -->失敗。Observable就是一個(gè)工具類。
  
  5.在問題域內(nèi),特指一種角色,交易或設(shè)備
  
  -->不適用。Observable是一個(gè)工具類,并非一個(gè)問題域的類。。
  
  
  
  
  
  
  
  
  
  繼續(xù)并非適用于此處!
  
  
  
  
  
  
  
  
  
  繼續(xù)/組合總結(jié)
  
  
  
  
  
  
  1.組合與繼續(xù)都是重要的重用方法
  
  2.在OO開發(fā)的早期,繼續(xù)被過度地使用
  
  3.隨著時(shí)間的發(fā)展,我們發(fā)現(xiàn)優(yōu)先使用組合可以獲得重用性與簡單性更佳的設(shè)計(jì)
  
  4.當(dāng)然可以通過繼續(xù),以擴(kuò)充(enlarge)可用的組合類集(the set of composable classes)。
  
  5.因此組合與繼續(xù)可以一起工作
  
  6.但是我們的基本法則是:
  
  優(yōu)先使用對(duì)象組合,而非(類)繼續(xù)
  
  [ Favor Composition Over Inheritance ]

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 丰城市| 特克斯县| 宽城| 京山县| 虞城县| 防城港市| 高州市| 夏邑县| 昌宁县| 青川县| 且末县| 柳林县| 永定县| 南投县| 赞皇县| 张北县| 迁安市| 邛崃市| 万载县| 清水县| 桂东县| 永春县| 南投县| 绥滨县| 独山县| 井冈山市| 吉林市| 宝兴县| 赞皇县| 永和县| 西华县| 湄潭县| 当雄县| 龙州县| 苍南县| 秀山| 漳州市| 分宜县| 卫辉市| 盐亭县| 甘孜县|