1. 设计原则
当我们谈到面向对象领域的设计原则的时候,我们其实都是在谈论罗伯特.C.马丁(Robert C. Martin ,又叫Bob大叔)的SOLID原则。
这也难怪,Bod大叔实在是太牛了,面向对象领域的设计原则几乎被他全部包揽了,加上他在他的畅销书《敏捷软件开发:原则、模式与实践》中详细的将这些原则集中一 一阐述,面向对象领域设计原则的权威非他莫属。毫不夸张的说,Bob大叔的威名和在面向对象领域中的地位,和设计模式的“四人帮”是不相上下的。
虽然很多资料都将SOLID原则和敏捷开发、测试驱动开发等方法绑定在一起,但我觉得只要是面向对象设计,不管是瀑布流程、、CMM流程、RUP流程、还是敏捷开发流程,都应该应用设计原则以提高设计质量。
参考wiki百科,SOLID设计原则简单介绍如下:
SOLID实际上是取5个设计原则的首字母拼起来的一个助记单词。具体的设计原则如下:
关于设计原则更详细的说明请参考设计原则的系列文章。
2. 设计原则的作用
其实和所有的原则一样,设计原则也是一个判断标准,说通俗点,设计原则就像是木匠手中的尺子,尺子是用来衡量木材的长短的,而设计原则就是衡量类设计的“尺子”:量一量,看长了还是短了,还是正好,长了就裁短一些,短了就加长一些。经过如此衡量并调整,最终就能够得到我们希望的设计作品。
当然,和木匠的尺子稍有不同,木匠不用尺子就做不出能用的家具,但我们不用设计原则的话,其实还是能够做出满足需求的系统的。
既然这样,我们为什么一定要用设计原则呢?ARTHUR J.RIEL在《OOD启思录》一书中针对这个问题给出了非常形象的解释:
你不必严格遵守这些原则,违背它也不会被处以宗教刑罚。但你应当把这些原则看做警铃,若违背了其中的一条,那么警铃就会响起。”-------ARTHUR J.RIEL,《OOD启思录》
也就是说,如果违背了这些设计原则,就可能有危险,但究竟是什么危险呢,警铃要警告我们什么呢,是火灾、水灾、地震、陷阱、还是有狮子、老虎。。。。。?
要回答这个问题,还需要回到面向对象的本源:我们在面向对象系列文章中解释为什么要面向对象的时候提到了面向对象的核心思想是“可扩展性”,这其实就是我们应用设计原则的根本目的:保证可扩展性。
如果我们不遵守这些设计原则,警铃就会响起,提醒我们:你的设计可扩展性会有问题!
除了设计原则外,后面要讲到的设计模式,其本质也是为了提高可扩展性。
这也是为什么我们通过领域类映射得到了很多软件类之后,还需要不辞辛劳的继续应用设计原则和设计模式的主要原因,本质上都是为了提高设计的可扩展性。
3. 设计模式
相比设计原则来说,设计模式更加普及和流行,当我们谈到设计方法的时候,大部分人肯定都会想到设计模式,设计模式如此深入人心,几乎到了言必谈设计模式的地步。
和设计原则类似,当我们谈论设计模式的时候,我们其实都是在谈论GOF(Gang of Four,中文翻译为“四人帮”)在经典名作《设计模式 --可复用面向对象软件的基础》一书中提到的设计模式。
设计模式是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类或对象来描述其中的关系和相互作用,但不涉及用来完成应用程序的特定类或对象。
设计模式能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。
4. 设计模式的作用
通俗的讲,设计模式是用于指导我们如何做出更好的设计方案,而前面提到的设计原则,其作用也是这样的。那么,设计原则和设计模式,我们该如何选择?
有的朋友可能会以为这两个是二选一的关系,要么用设计原则,要么用设计模式。这种理解是错误的,设计原则和设计模式并不是竞争关系,正好相反,它们是互补的关系。
设计原则和设计模式互补体现在:设计原则主要用于指导“类的定义”的设计,而设计模式主要用于指导“类的行为”的设计,更通俗一点的讲:设计原则是类的静态设计原则,设计模式是类的动态设计原则。
一般情况下,我们是采用“先设计原则,后设计模式”的方法来操作的。
5. 总结
- 设计原则为了解决类的静态属性而设计的,设计模式是为了解决类的动态属性而设计的;
- 设计原则用于指导“类的定义”,设计模式用于指导"类的行为";
- 静为原则,动为模式,以静制动,静观其变,先静(原则)后动(模式)