本文内容来自《软件开发沉思录》
优秀设计背后的七条核心概念:内聚性,松耦合,零重复,封装,可测试性,可读性,单一职责。
采用这些规则的关键是,使用面向对象的思考。
规则1 :方法只使用一级缩进
动机 :庞大的方法往往缺少内聚性,一个常见的原则是将方法控制着5 行以内(不包括入参检查)。你可以尝试让每个方法只做一件事情——每个方法只保护一个控制结构或一个代码块。
方法 :利用IDE 的抽取方法的功能,不断的抽取方法中的行为,直到一个方法只有一级缩进位置。
“运用这些规则的技能师一种艺术,它能将程序员提升到一个新的高度。”
规则2 :拒绝 else 关键字
动机 :复杂的条件判决难于理解,而且易产生重复代码。
方法 :对于简单判断可以使用卫语句和提前返回,对于复杂的条件判断则可以使用多态。另外也可以使用策略模式。
规则3 :封装所有的原生类型和字符串
动机 :整数只是代表一个数量,没有实际的含义。用类来表示原生类型,比如年,月,日等。这样可以进行严格的类型检查。
规则4 :一行代码只有一个“ . ”(或者“ -> ”)运算符
动机 :如果一行中含有多个“. ”,则说明很多职责的位置放置错了。尝试让对象为你做一些事情,而不要窥视对象内部的细节。封装的含义就是,不要让类的边界跨入到它不应该知道的类型中。
规则5 :不要使用缩写
动机 :缩写的原因:1 )一遍一遍的敲打同样的单词,则可能是因为某个方法调用过于频繁——要消除一下重复。 2)方法名字太长——可能是职责没有放在应该在的位置或者有确实的类。
方法 :所有实体对象的名称都只能包含一到两个单词,不要使用缩写。
规则6 :保持对象实体简单清晰
动机 :超过50 行的类所做的事情通常都不止一个。这会导致他们难以理解和重用。这意味着每个类的长度不能超过50 行。每个包所包含的文件不超过 10 个。
规则7 :任何人类中的实例变量不要超过两个
动机 :将一个对象从拥有大量属性的状态,解构成分层次的,相互关联的多个对象,会直接产生一个更实用的对象模型。将一个复杂的大的对象,分解成多个简单的对象。
方法 :可以将实例变量按照相关性分离在两个部分中;可以创建一个新的对象来封装两个已有的实例变量。
规则8 :使用一流的集合
集合的概念应该是一类实例的集合。比如,定时器对象的集合——包括所有的定时器。我一般是放在定时器类中,然后使用static 来表示集合。看了这个方法要改一下了。
任何包含集合的类都不能再包含其他的成员变量。每个集合都被封装在自己的类中。集合其实是一种应用广泛的原生类型。
规则9 :不要使用任何的 Geter/Setter/Proerty
Geter/Setter/Proerty会对对象的封装性找出破坏。
在严格封装的边界背后,真正的动机是迫使程序员在完成编码后,一定要为这段代码的行为找到一个合适的位置,确保它在对象模型中的唯一性。
这样可以减少重复性的差错,以及在添加新特性的时候,可以在一个更合适的位置引入变化。
这九条原则可以作为对面向对象优秀设计的训练(可以通过一个小的项目),但是,在实际的过程中不可以教条的应用上面的原则。引用P.J. Plauger 的话:
“你在应用某种设计方法的时候越教条化,你所能解决的现实问题就会越少。请把设计看出是一个险恶的,杂乱的和启发式的过程(没有教条化的规则可以遵循,能够巧好解决现实问题的方案才是最佳的方案)。不要停留于你所想到的第一套方案,而是去寻求合作,探求简洁性,在需要的时候做出原型,迭代,并进一步迭代。你将对你的设计成果感到满意。”