You are here

“易则易知,简则易从”和对象健身操

eureka 的头像

我在乾坤简易之道与软件开发方法论讲了《易经》中已经讲到了软件开之道,最近又看了一本薄薄的书《软件开发沉思录--Thought Works 文集》,里面有Jeff Bay的一篇短短的,名叫“对象健身操”,论述了九步迈向优秀软件设计:

  • 规则1 :方法只使用一级缩进
  • 规则2 :拒绝 else 关键字
  • 规则3 :封装所有的原生类型和字符串
  • 规则4 :一行代码只有一个“ . ”运算符
  • 规则5 :不要使用缩写
  • 规则6 :保持实体对象简单清晰
  • 规则7 :如何类中的实例变量都不要超过两个
  • 规则8 :使用一流的集合
  • 规则9 :不使用任何 Getter/Setter/Property

  短短的九条规则,却写出了敏捷设计的灵魂(当然,如果极其关注软件的运行性能的话我觉得还是需要考虑这些规则,详见我在突然我觉得很晕很晕,整洁代码和性能的矛盾中所述,虽然我后来找到了解决之道,但面向对象的整洁的确降低性能)。看着这些规则,真的体现了《易经》中“简”、“易”之道,别看《易经》这么短,别看一本书多么薄,别看文章多么短,有时候大道就在这“简易”之中。看完这规则我又觉得,完全使用这些规则太不可思议了。然而书中却说:我们刚刚完成了一个超过100 000 行代码的系统,它严格遵守本文中提到的所有规则。参与这个项目的程序员全部都认真地遵守了上述规则。最终每个人都非常高兴地看到:如果努力地拥抱简单,那么开发过程会快乐得多。

  我又顺便在网上找了一下Jeff Bay,还找到了他的简历,他现在可能是在Malbec Partners. Inc当程序员。他跟我一样毕业于1994年,但是他一直在做软件开发方面工作。并且看来也跳了多次槽,2003年到2007年是在ThouhtWorks工作。我觉的是编程的实际历练以及“敏捷”思想让他提出这样的规则的。我正在想,现在将我的项目按他的规则进行重构,那会是怎么样的结果呢?

评论

eureka 的头像

好好体会一下规则7。

规则7:任何类中的实例变量都不要超过两个,说明如下:
  大多数的类应该只负责处理单一的状态变量,有此时候也可以拥有两个状态变量。每当为类添加一个实例变量,就会立即降低类的内聚性。一般而言,编程时如果遵守这些规则,你就会发现只有两种类,一种类只负责维护一个实例变量的状态;另一种只负责协调两个独立的变量。不要让这两种职责同时出现在一个类中。

  将一个对象从拥有大量属性的状态,解构成为分层次的、相互关联的多个对象,会直接产生一个更实用的对象模型。虽然我们可以理清一个复杂的对象模型,但是理解各组相关的行为并看到结果是一个非常痛苦的过程。相比而言,不断应用这条规则,可以快速将一个复杂的大对象分解成为大量简单的小对象。行为也自然而然地随着各个实例变量流入到适当的地方-否则编译器和封装法则都不会高兴的。当你真正开始做的时候,可以沿着两个方向进行:其一、可以将对象的实例变量按照相关性分离在两个部分中;另外,也可以创建一个新的对象来封装两个已有的实例变量。

  学习编程一般来说总是循序渐进的,原来编的程序中基本上都是些庞大的类,编着编着,都不知道把类怎样分解成多个类。虽然在《重构》一书中有说怎么提取类,但真正真有实践指导性的内容还是很少,也挺难找到。在这种情况下就得靠自己去慢慢体会了。就象这条规则,我总怕这样弄出来的类很多,同时类间关系更复杂,以及类的名称非常难以命名。特别是名称,该怎么去命名呢这么从一个类中提取出来的类呢。我现在想把类搞的简单,可看着庞大的类,还真不知如何入手去做。

  想来想去,还是“本体”,还是对象的本体能够帮助我,还是靠本体的编我的程序,我认为“本体”可能就是我要的“银弹”了。

添加新评论

  • 自动将网址与电子邮件地址转变为链接。
  • 允许HTML标签:<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • 自动断行和分段。
  • No HTML tags allowed.
  • 自动将网址与电子邮件地址转变为链接。
  • 自动断行和分段。
Mollom CAPTCHA (play audio CAPTCHA)
Type the characters you see in the picture above; if you can't read them, submit the form and a new image will be generated. Not case sensitive.