這個膚淺的東西,該有新的東西替代了。
計劃 《ddd 》,《設計模式、算法和架構》,《分布式計算和data sharding>.
半年內作完。
附件:
請下載。
如何設計軟件-我的體會.rar
最近把一年多的工作總結了,先有 ‘圖解軟件項目管理’,又有這一篇。
如何設計軟件
-我的體會
李建奇
2007-02-05
我信心不足,勉強為之!
幾乎沒有普遍適用的原則。設計似乎是一種偶然的事情。所以還稱為手藝。
我陳述的主要是自己的經驗。
第一章理想的設計
三個判斷準則:
l
維護成本低。
l
可以被重用。
l
易于理解。
第二章代碼是最好的設計工具
我的做法是,寫可以運行的代碼,然后生成可以講解的圖形。
好處當然是明顯的,避免出現普遍的錯誤,看起來不錯的設計其實不能用。
第三章不管怎樣,先讓結果出來
Engine can work : can produce the output 。
我的經驗:
我總是這么做。比如:
抓取數據:Jobo + htmlParser ,只是把別人的軟件連接起來,結果就出來了。
第四章硬核,總有一些東西是可以穩定的
一、
發現領域的硬核,是關鍵的設計問題。
Firm core: model is steady
我的經驗:
Merchandise 的三個要素:name, seller, price. 缺了任何一項就不是一個merchandise 了。
二、
事物之間的關系不外乎1對1,1對多,多對一
為什么不說多對多?
因為我只見
Public
class A {
B b;
Collection <C> l;
}
為什么說多對一?
第五章模塊的主要接口(約定)是穩定的
先把主要接口用簡單的方式實現出來,然后讓整個系統轉起來。
我的經驗:
解析模塊的主要接口:
Public Object parse(String content , String url){ ……}
第六章功能可擴展
一、
Observer 設計模式:
我的經驗:
有一點類似:LogicOrParser ;
我知道的:
我認為 JMX 是使用 Observer 模式。
二、
Chain of Responsibility :
我的經驗:
n
StringReplacer : next ().
我知道的:
n
Lucene 的 filterChain
n
Web app 的 ServletFilter.
n
Lucene 的 TokenStream .
三、
Strategy 設計模式
可以增加新的策略。
我的經驗。
失敗的經驗:
PricePattern
有一個地方用
InstanceOf 。
原因是:我不知道Spring 配置Collection 有無可以使用Interface 的!
誰知道?
成功的經驗:
UrlPattern:一個基于hibernate 的 inheritance 映射的適用經驗:
Public
interface UrlPattern {
Public Boolean isInstance( String
url ) ;
}
第七章模塊可插拔
一、
Programming to interface :最重要的設計原則
幾乎是所有好的設計的基石!
我的經驗:
l
Spring 是我必用的工具。
l
UrlPattern:一個基于hibernate 的 inheritance 映射的適用經驗:
Public
interface UrlPattern {
Public Boolean isInstance( String
url ) ;
}
l
HttpReader
當我發現 JoboHttpReader 不能滿足的時候,我用HttpClientHttpReader 替換了。
二、
組合優于繼承
繼承破壞了可替換性。
我的經驗:
我好幾次把 template method 模式轉移到Strategy 或者 command模式。
把 PriceUpdatorManager 遷移到 command 模式。
我現在基本不使用抽象類。
不過也有例外: AbstractHibernateDAO 一直在用。
三、
封裝, proxy pattern : managing third party APIs
我的經驗:
把lucene 的使用封裝起來。
有兩個好處:
可替換。
封裝好的東西可以方便地用在別的地方。
四、
不要牽涉無關的東西 ISP ,interface segregation
principle ,或者叫 split interface
我的經驗:
我有過幾次失敗的教訓,當時的擔心,類太多了,類太小了。
后來有些改了,有些沒有。
抄錄一段話:<prefactoring >
Split a single
interface into multiple interfaces if multiple clients use different portions
of the interface .
第八章分離關注separation
of concerns
我的經驗:
Spring 的 transaction 機制
我用SpringAop 和 ehcache 實現 method cache ;
Acegi ,把安全管理分離出來。
第九章性能可擴展
一、
線程池:
基本的提高性能的辦法。
我的經驗:
blocked Queue :
Semaphore:
二、
分布式運算:
我的經驗:
基于RMI 的分布式使用。
第十章結構
一、
減少依賴
我的經驗:
似乎沒有?!
我知道的:
???在哪里?可能大家都是這么干的!
二、
分層:layering
我的經驗:
總是使用的、不變的設計: model, dao, service :
我對Lucene 的封裝:一個抽象。
Public
void addDocument( Document doc );
Public Document getDocumentById( Long id
);
第十一章設計思想的變遷
變遷太快,去年的最好的書,一年以后就過時了。
一、
主要的階段,以及framework 階段
Structure , 30年
OO , 10年
Pattern ,10 年
framework ,…… 這是我自己定義的。
主要的原因是,很多成熟的framework 的出現,使得我們主要是學習好他們,然后把自己的領域吃透,用好這些
framework 就可以生產出較好的軟件。
二、
Jolt 圖書大獎
2003
<agile software
development>
2004
<Waltzing with Bears:
Managing Risk on Software Projects>
2005
<headfirst design
pattern>
2006
<prefactoring >
2007
????
第十二章導師
l
我自己的項目經驗
l
Eric Gamma < design pattern>
l
Rod Johnson <SpringFramework>
l
Eric freeman <headfirst design pattern>
l
Gavin King <hibernate >
l
Pugh <prefactoring>
l
Robert <agile software development>
西津渡