当前位置: 首页> 书评> 正文

Design Patterns Explained《如果要做面向对象编程一定要阅读本书》

  • 小小评论家小小评论家
  • 书评
  • 2023-03-26 10:59:45
  • 67

如果让我在书中众多精彩的部分里选取一个最最耀眼的,我想不是作者对设计模式的阐述,也不是一个个精彩的示例。而是对面向对象概念的澄清,对象是什么?面向对象的好处特性是什么?

我们大多数人对上述问题的回答也是我们平时使用对象时的思想是:对象就是数据加方法,面向对象的好处就是封装和继承。封装可以隐藏数据和方法,让客户不需要了解对象的细节。继承可以轻松的实现代码复用。这些答案对么,绝对正确。但是以这些观点开始你的面向对象之旅,你会制造出一堆乱麻,面条式的代码,最后你自己都不想再碰它。这些观点的问题在于看问题的高度,这些观点过于的深入到对象的细部了。如果我们设计之初使用的是这些底层的观点作为创建对象的指导,那么他们只会成为一个个让你无法抽身的泥潭。为什么我们的工作如此痛苦,这些观点就是病根。

站在一个更高的高度看,对象是什么?对象应该是负担着责任或者具有功能的一个东西。那么封装呢?封装就是隐藏,但是不仅限于隐藏数据和方法,虽然他最终的表现是这样。封装隐藏的是对象世界中所有的东西,关联、类型、结构、继承关系……,所有对象的使用者在使用对象时不需要知道的东西。继承呢?这个是最关键的一点,代码重用只是继承的副产品,你想想我们什么时候、为了什么目的使用继承。这个呼之欲出的答案就是当我们希望对象对同一个方法表现出不同行为的时候我们使用继承。如果你需要重用,加入一个类变量引用这个类就可以了,何必继承。用专业的术语说,就是在我们需要使用多态的时候我们使用继承。

使用上述这些观念作为思考的出发点,就算没有人告诉你关于模式的事情,你也会自己发现并使用这些模式。看看使用这些观点我们能导出什么指导思想。首先关于对象,对象就是职责,设计对象就是分配职责,那么对象里面应该有什么?就是完成它承担的职责所需的数据和方法。为了避免边界效应和易于理解,我们应当为一个对象只分配一个职责。封装是隐藏的手段,为了隐藏所有的东西,我们应该面向接口编程而不是面向实现,同时为了隐藏实现的细节我们应该让具体类依赖于抽象类,这就是依赖倒置原则。同样继承的目的是多态,那么工具箱里所有能够实现多态的工具都可以使用,而不紧紧是继承。不要拿着一把锤子,就看什么都像钉子。实现多态要求我们面向接口编程,使用抽象类,使用组合、继承。同时为了避免继承类的激增和边界效应,实现多态时组合优于继承。现在已这些观念作为工作的指导思想,一定能够实现出好的程序。

阅读全文