1、模式是應(yīng)該結(jié)合在一起共同解決問題的。
評論:以前看《GOF設(shè)計(jì)模式》的時(shí)候主要就是看目的,然后就是代碼,對協(xié)作啊,優(yōu)缺點(diǎn)啊,效果啊都不怎么注意,不過就算看了也不知所云。學(xué)下來就像背數(shù)學(xué)公式一樣,單個是記住了,拿到具體環(huán)境里又懵了。看來還是得多花點(diǎn)時(shí)間看看模式的關(guān)聯(lián)啊。
2、我的錯誤是:我嘗試先創(chuàng)建問題領(lǐng)域中的累,然后將這些類縫合起來形成最終的系統(tǒng)。——Alexander把這樣的過程稱為一個“壞主意”。我從來沒有問過我自己:我是否擁有正確的類?僅僅因?yàn)檫@些類看起來如此正確、如此明顯。我擁有的是在開始分析時(shí)立刻進(jìn)入腦海中的類,是我們的老師告訴我們應(yīng)該在系統(tǒng)中尋找的“名詞”。但是我的錯誤就是僅僅嘗試把它們簡單地放在一起。
評論:連大牛都會犯這樣的錯誤,我這樣的菜鳥這樣分析系統(tǒng)應(yīng)該也比較正常吧。在看問題的層次上,我們太過于重視細(xì)節(jié),就像我寫WinForm程序時(shí)先考慮有哪些組件可以使用一樣,把思路給限制住了,忽視了類所處的環(huán)境、上下文。
3、面向?qū)ο蟮姆妒剑菏褂脤ο髮⒇?zé)任轉(zhuǎn)義到更局部的范圍。對象應(yīng)該對自己負(fù)責(zé),并且這種責(zé)任應(yīng)該被清楚的定義出來。
評論:這個對類的定義就要合理的多。作者認(rèn)為軟件開發(fā)中有三個視角:概念(用例)->規(guī)格(接口)->實(shí)現(xiàn)(代碼)。從最低層次看,類就是變量+函數(shù),但這樣就太狹隘了。真正的對象應(yīng)該與現(xiàn)實(shí)生活中的對象相似,有自己的行為、狀態(tài),自己對自己負(fù)責(zé)(多么精確的概述啊)。
4、抽象類就是其他類的占位符。
評論:比較形象的描述。我先描述類的大致行為供調(diào)用者了解,具體的行為留到子類實(shí)現(xiàn),抽象類與子類達(dá)成一個契約。
5、過早的對細(xì)節(jié)投入過多的關(guān)心是一個分析缺陷。
評論:同2。
6、留意你的直觀:當(dāng)你看到某些不喜歡的東西時(shí),你胃部的感覺。
評論:牛人就是幽默。這里主要是說明如何感覺一個設(shè)計(jì)是壞的設(shè)計(jì)的。我是說最近寫程序胃老不舒服,飯也吃不好……
7、關(guān)注模式的場景而非解決方案。
評論:作者自始至終一直強(qiáng)調(diào)是場景決定解決方案,而不是為了實(shí)現(xiàn)某個模式而去進(jìn)行設(shè)計(jì),否則就像小學(xué)生套公式一樣了。場景分析好了,模式自然也就出來了(這是境界比較高的時(shí)候)。
8、在創(chuàng)建對象時(shí)用共同點(diǎn)/變化點(diǎn)分析而非觀察名詞與動詞。因此,我們要:
a、發(fā)現(xiàn)并封裝變化點(diǎn)。
b、優(yōu)先使用對象組合,而非類繼承。
評論:關(guān)于共同點(diǎn)/變化點(diǎn)的分析,在Bridge模式中體現(xiàn)的猶為明顯(我在前面的Blog中介紹過),借助分析矩陣也可以幫助理清思路。而b點(diǎn)是面向?qū)ο笤O(shè)計(jì)中的基本原則,就不用多說了。
9、switch語句常常標(biāo)志著:(1)對多態(tài)行為的需要。(2)存在著放錯地方的責(zé)任。請考慮用一種更普適的解決方案代替switch語句,比如抽象、將責(zé)任分配給另外的對象等等。
評論:老聽別人說丑陋的switch語句、ifelse語句,都不是太懂,現(xiàn)在好像有點(diǎn)懂了,因?yàn)闂l件語句不靈活,很難維護(hù)吧。碰到它馬上就要想到用多態(tài)的方式去處理,像State模式、Visitor模式就和這有關(guān)。
10、用模式的方法去思考:
步驟:
(1)、發(fā)現(xiàn)我在問題領(lǐng)域中擁有的模式
(2)、對于這些需要分析的模式,做下列工作:
a、挑出為其他模式提供最多場景的模式。
b、在我概念性最高的設(shè)計(jì)中使用這個模式。
c、識別任何可能已經(jīng)出現(xiàn)的附加模式。將它們添加到“需要分析的模式”中。
d、對需要分析而未分析的模式,重復(fù)上述工作。
(3)、按照需要將細(xì)節(jié)添加的設(shè)計(jì)中。擴(kuò)展方法和類定義。
評論:具體的說就是找到可以統(tǒng)領(lǐng)全局的模式,再用其他的模式配合它,“面向模式的設(shè)計(jì)”(POP)
。算了吧,我連OOP都沒學(xué)好,這個以后再說啦。
11、在學(xué)習(xí)面向?qū)ο蠹夹g(shù)的早期學(xué)習(xí)設(shè)計(jì)模式,可以大大幫助你提高對面向?qū)ο蠓治觥⒃O(shè)計(jì)的理解。
評論:這個倒是第一次聽說,不過怎么也得先把繼承、封裝、多態(tài)弄清楚吧。再加上一條,在學(xué)習(xí)設(shè)計(jì)模式時(shí),一定要先讀這本《設(shè)計(jì)模式精解》,再看《GOF設(shè)計(jì)模式》,
。