Samuel's Weblog

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  7 随笔 :: 2 文章 :: 9 评论 :: 0 Trackbacks
最近在审查(review)代码时,常常发现一大堆代码充满了各种bad smell.即使工作了三五年的同事,也不会例外.沟通时往往发现他们对OO的理解只是表现出简单的概念理解.对OO的一些原则不甚了解,或者写代码也是跟着感觉走.

我最初做开发的时候也是跟着感觉走,初次听到OCP如天外来物.使用Java或C#不代表你就是在做OO开发,熟练使用OO语言不代表已经对OO非常了解.感谢Uncle Bob的经典巨著<Agile Software Development>,坚持阅读的习惯让我接触并努力理解OO原则.一旦对这些原则有了深入的认识,写代码时就已经从更高的角度来分析问题,解决问题,力争写出优雅的代码.

我对OO的了解也不算多深刻,只在这里抛砖引玉.因为原则比较多,用一个系列来介绍会让大家更容易沟通.

同时,原则是死的,人是活的,不要被这些原则束缚,有一些原则在特定的情况下才会有效.

Single Choice Principle(SCP)
所有的判断只在一处进行.违反此原则的典型情况是不同的方法中充斥着相同的if ... else ...或类似的语句.

Linguistic Modular Units

Few Interfaces

Small Interfaces

Explicit Interfaces

Behavioral Completeness
一个完整的类必须包含完整的方法.如果类没有完成它的职责,或者没有完成其父类需要完成的工作,那么它就是不完整的类.

Law Of Demeter
只与直接协作的类交互.

The Principle of Essential Representation(PER)
类应该包含而且只包含其本质的定义和表现,与SRP比较接近.

Single Responsibility Principle(SRP)
一个类只承担一项职责,只能有一个发生变化的理由,那就是它的职责变化了.

Open-Colse Principle(OCP)
类应该对扩展是开放的,对修改是封闭的.

Liskov Substitution (LSP)
子类必须可以替换父类.

Dependency-Inversion Principles(DIP)
高层应该不依赖于低层,双方都应该依赖于抽象.抽象不依赖于细节,细节应该依赖于抽象.

Interface Segregation Principles(ISP)
接口属于客户程序.

---------------------------------
Reuse Release Equivalence Principle(REP)
重用的粒度等于发布的粒度.

Common Reuse Principle(CRP)
包中的类应该是共同重用的.

Common Closure Principle(CCP)
包中的类对同一类变化共同封闭的,一个类发生变化,可能所有的类都要发生变化.

---------------------------------
Acyclic Dependencies Principle(ADP)
包之间的依赖结构不应该存在环依赖.

Stable Dependencies Principle (SDP)
包应该依赖于比它更稳定的包.

Stable Abstractions Principle(SAP)
包的稳定程度与抽象程度成正比,越抽象的包越稳定.

---------------------------------
开发时应该避免的bad design smell:
僵化(Rigidity) 一处变化会影响系统中的很多地方.
脆弱(Fragility) 一处变化会影响系统中不应该被影响的地方.
牢固(Immobility) 很难被重用.

还有一些原则可能被遗漏掉,如果你发现了,请及时提醒我.

 更多内容在另一博客http://samuelray.javaeye.com.
posted on 2008-03-14 09:55 SamuelRay 阅读(1843) 评论(8)  编辑  收藏

评论

# re: OO 原则 2008-03-14 11:53 和风细雨
孙子兵法很多人都读过,可按教条行事就能成一个合格的将军了吗?  回复  更多评论
  

# re: OO 原则 2008-03-14 12:42 dennis
做code review的时候,你会发现原来这世界上大多数的“程序员”是在混日子,写的代码惨不忍睹。  回复  更多评论
  

# re: OO 原则 2008-03-14 14:53 shoru
读读也无妨啊,哪个将军不读孙子?  回复  更多评论
  

# re: OO 原则 2008-03-16 08:52 卜清楚
学孙子兵法不是背孙子兵法
领悟了孙子兵法精髓的,甚至领悟一半的都是合格的将军了。  回复  更多评论
  

# re: OO 原则[未登录] 2008-03-16 11:32 paul
1有些情况下知道这些原则,但是不彻底理解,所以也用不了
2,有时运用这些原则,会多写很多代码,在工期紧的情况下,实现功能第一位
有时间可以重构下  回复  更多评论
  

# re: OO 原则 2008-03-17 10:39 hyx
有时候不用那么教条  回复  更多评论
  

# re: OO 原则 2008-03-17 12:16 legendsen
OO固然好,值得发扬和学习,不过也不能凡事都OO,否则就是OOOO了,
不能为了OO而OO。OO也是为了项目服务的。要想做得彻底,程序非常非
常规范,还得要分公司分项目分领导啊...
  回复  更多评论
  

# re: OO 原则 2008-03-18 21:27 咖啡屋的鼠标
总感觉这里面有些原则是告诉我们应该做什么,而有些只是说了做好了应该是什么样。  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: