这个肤浅的东西,该有新的东西替代了。
计划 《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>

 

 




西津渡