close

01.共通性與可變性分析。(commonality and variability analysis, CVA)

02.抽象概念與實作分離

03.軟體開發過程視角 (p11)

   概念:這種視角「呈現了所研究的領域中的各種慨念... 得出概念模型時應該很少或者不考慮實作他的軟體...」。這個視角要回答的問題是:「軟體要負責什麼?

   規約:「現在我們要考慮的是軟體,但我們關注的是軟體的介面,而不是實作。」這個視角要回答的問題是:「怎麼使用軟體?

   實作:這時我麼考慮的是程式碼本身。「這可能是最常用的視角,但在許多方面,採取規約視角經常會更好。」這個視角要回答的問題是:「軟體怎樣履行自己的責任?

04.分析階段要關注的是問題領域。(p26)

05.過分且無用的繼承,往往是高耦合、低內聚。(p37)

06.依介面設計:(p71)

   a. 用聚合代替繼承。

   b. 找出變化並封裝之。

07.Facade模式意圖:一個一致的高層介面。(p75)

08.Facade提供一組容易理解的功能。(p77)

09.Adapter模式意圖:建立新的介面。為一個功能正確但介面不合的物件建立一個新介面。(p83)

10.物件Adapter模式:一個物件相依包含另一個物件。

   類別Adapter模式:一個類別同時繼承2個類別。(p90)

11.物件:具有責任的實體。(p96)

12.「關注動機,而非實作。」是設計模式中反覆出現的主題。(p98)

13.考慮如何才能夠在不重新設計下進行改變。(p102)

14.將變化封裝、隔離。包含資料變化行為變化。(p102)

15.當一個類別處理越來越多的不同變化時(例如,透過 switch),程式碼的內聚性會變得很差,可理解性就越差。(p103)

16.共通性分析:尋找一些共通的要素,它們能夠幫助我們理解系列成員的共同之處在哪裡。(p105)

17.可變性分析:找出如何變化。(p105)

18.共通性分析:尋找的是不可能隨時間而改變的結構。(p106)

19.可變性分析:找出可能變化的結構。(p106)

20.共通性分析:為架構提供長效的要素(p106)

21.可變性分析:則促進軟體適應實際所需(p106)

22.抽象類別代表了將所有衍生類別關連起來的核心概念。核心概念定義了衍生類別的共通性。(p107)

23.共通性定義了需要使用的抽象類別。(p107)

24.抽象類別的介面對應於規約層次。(p107)

25.抽象類別(共通性):需要用什麼介面來處理這個類別的所有責任。(p108)

26.衍生類別(可變性):對於這個指定的特定實作(這個變化),應該怎樣根據指定的規約來實作它。(p108)

27.規約視角和概念視角之間的關係在於:規約標示了用來處理此概念所有情況(即概念視角所定義的共通性)所需的介面。(p108)

28.規約視角和實作視角之間的關係在於:對於指定的規約,怎樣實作這個特定情況(指的是變化)?(p108)

29.災難往往是由短期未臻最優的決策,長期累積而引起的。(p115)

30.針對介面來設計程式,而不是針對實作來設計程式。(p117)

31.優先使用物件聚合,而不是類別繼承。(p117)

32.考慮設計中什麼是可變的。要考慮什麼能夠在不重新設計的前提下改變。這時主要關注的就是對變化的概念進行封裝。(p117)

33.Strategy模式意圖:定義一系列的算法,把他們一個個的封裝起來,並且使他們可相互替換。可獨立於使用它的客戶而變化。(p127)

34.Bridge模式意圖:將抽象與實作解耦,使它們都可以獨立變化。將一組實作與另一組使用它們的物件分離。(p133)

35.Bridge模式的本質:抽象+實作的組成。(p153)

36.Bridge模式經常與Adapter模式結合。(p154)

37.Abstract Factory模式意圖:為建立一組相關或相依的物件提供一個介面,且無需指定它們的具體類別。(p161)

   生動的說明:根據機器能力選擇設備驅動程式。

38.switch語句可能說明需要抽象的解決方案。(p163)

39.當有多種類型且每個類型有多種類時適合 Abstract Factory 模式。(p175)

40.Alexander:模式定義了問題領域中實體之間的關係。(p186)

41.在軟體設計中使用 Alexander 的方法:(p187)

   a. 找出模式:找出問題領域中存在的模式,用這些模式來思考問題。記住,模式的用途是定義實體之間的關係。

   b. 從背景模式開始:找出為其他模式創造了背景的模式。這些模式應該作為設計的起點。

   c. 然後,從背景轉向內部:觀察其餘模式和任何其他可能已經發現的模式,從中選擇出為其餘模式定義背景的模式。重複這一過程。

   d. 改進設計:改進過程中始終考慮模式所蘊含的背景。

   e. 實作:實作應該融入模式所要求的細節。

42.開閉原則(open-closed principle, OCP):模組、方法和類別應該對擴展開放,對修改封閉。也就是說,應該將軟體設計成不對其修改就能擴展。(p214)

43.從背景設計原則:透過選擇能夠建立最大的整體概念 -- 系統背景模式。(p214)

44.相依倒置原則(dependency inversion principle, DIP) (p215)

   a. 高層模組不應該相依於低層模組。高層模組與低層模組都應該相依抽象。

   b. 抽象不應該相依於細節。細節應該相依於抽象。

45.Facade的介面經常是隨著使用它的系統部分不斷開發出來而逐步開發出來,開發期間每個新的系統部分都為 Facade 建立了更豐富的背景。

46.封裝變化原則:模式並非只能封裝變化。它們還有助於找到物件之間的關係。(p220)

47.理性懷疑原則:模式都是發現而不是發明出來的。模式實作的具體方式應該由問題領域的本質、約束條件和需求等等決定,而不是根據你在某本書中碰巧看到的某個實作。(p222)

48.隔離變化是設計模式的理念之一。(p225)

49.首先,使用CVA找到問題領域中存在的各種概念(共通性)和具體實作(可變性)。(p225)

50.對於變化,問以下問題:(p227)

   a. 其中一個是另一個的變化嗎?

   b. 它們都是其他東西的變化嗎?

51.有趣的客戶回應:

   a. 客戶會談的非常具體。

   b. 他們經常用「總是」表達「通常」。

   c. 他們經常用「從不」表達「很少」。

   d. 客戶詳細的回答一般是可信的; 但是他們一般性的回答卻不可信。

52.分析矩陣。(p235)

53.在 Abstract Factory 的工廠實作中,使用 Strategy 模式建立各個種類的實作。(p242)

54.分析矩陣的子矩陣。(p244)

55.分析矩陣:左邊第一列為概念。(p236)

56.分析矩陣:「行」為發現的實作。(p240)

57.Decorator模式並不透過一個控制方法控制新增功能,而是建議已需要的正確順序將所需功能串聯起來,進行控制。(p249)

58.Decorator模式意圖:動態給一個物件增加額外的職責。就增加功能來說m,Decorator模式比生成子類別更為靈活。(p250)

59.Decorator模式幫助我們將問題分為兩部分:(p254)

   a. 如何實作提供新功能的物件。

   b. 如何為每種特殊情況組織物件。

60.Observer模式意圖:定義五件間的一種一對多的相依關係,當一個物件的狀態發生改變時,所有相依於它的物件都將得到通知並自動更新。(p266)

61.Template Method模式在一般層次上,步驟是相同的,但是細節不同。(p275)

62.Template Method模式的意圖:定義一個操作中演算法的骨架,而將一些步驟延遲到子類別中。不改變演算法的結構而重新定義它的步驟。(p276)

63.使用 Tempalte Method模式減少冗餘。(p277)

64.Template Method模式並不是耦合多個 Strategy 模式。(p283)

65.Template Method模式適用於幾個互不相同,但概念上相似的過程。(p283)

66.定義新物件時,我們依自己的需要定義它們,使用行為模式作為指導。但是,當我們要將已有的物件加入新的設計中時,使用結構模式作為指導最為合適。

   而使用工廠是隱藏變化的一種自然結果。(p291)

67.何謂工廠?工廠是用來實體化其他物件的方法、物件或其他任何實體。不僅實體化一個物件,而是控制著一組物件。(p290)

68.工廠準則:(p292)

   a. 定義物件和它們的合作方式。

   b. 編寫為相應情況實體化物件並在物件共用時管理已有物件的工廠。

   步驟 1 中的程式碼無需操心哪個物件應該實體化,而步驟 2 中的程式碼則無需操心物件的合作方式。

69.對於物件的建構和管理的通用規則:只負責建構/管理物件或者只負責使用物件。(p293)

70.Double-Checked Locking模式:(p304)

   pubilc static Tax getInstance() {

     if (instance == null) {

        synchronized(this) {

           if (instance == null) instance = new USTax();

        }

     }

     return instance;

   }

71.Object Pool模式意圖:在建立物件比較昂貴,或者對於特定類型能夠建立的物件數目有限制時,管理物件的再利用。(p317)

72.Template Method 模式使用 Factory Method 模式。(p322)

73.Factory Method模式意圖:定義一個用於建立物件的介面,讓子類別決定實體化哪一個類別。Factory Method 使一個類別的實體化延遲到其子類別。(p322)

74.Abstract Factory模式可以用一系列Factory Method模式來實作。(p323)

75.Factory Method 常用於模式框架中。(p323)

76.軟體開發過程視角:概念(conceptual)視角規約(specification)視角實作(implementation)視角。在後續討論設計應用程式時可以使用另一組視角:使用(use)視角建立/管理(creation/management)視角。(p293, p327)

77.概念上相似物件從使用視角來看,可以以同樣的方式處理。(p327)

78.物件導向原則的總結:(p335)

   a. 物件是具有明確定義的責任個體。

   b. 物件對自己負責。

   c. 封裝指的是任何形式的隱藏。(資料、實作、類別、設計、實體化方式)

   d. 使用共通性和可變性分析抽象出行為和資料中的變化。

   e. 依介面設計。

   f. 將繼承看成一種將變化概念化的方法,而不是建立已有物件的特殊情形。

   g. 將變化放入一個類別中,並與該類別中的其他變化解耦。

   h. 力求鬆耦合。

   i. 力求強內聚。

   j. 將使用一個物件的程式碼與建立該物件的程式碼分離

   k. 在應用「一次且僅此一次」規則時要絕對小心。(p109)

   l. 透過「依意圖程式設計」,使用反應意圖的名字,確保程式碼的可讀性。(p110)

   m. 在程式設計之前就考慮程式碼的可測試性。(p110)

79.依責任分解問題領域。(p335)

80.Alexander:「在這最後階段,模式不再重要...模式已經教會了你對真實的感悟力。」(p337)

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Mr.Y 的頭像
    Mr.Y

    航向新世界

    Mr.Y 發表在 痞客邦 留言(0) 人氣()