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