這個膚淺的東西,該有新的東西替代了。
計劃 《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 了。

二、      事物之間的關系不外乎111對多,多對一

  為什么不說多對多?

  因為我只見

       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>

 

 




西津渡