第八章.设计原则

模拟是避免做傻事的最佳方式。

到目前为止我们一直致力于应用程序编码之前的事情上,如收集需求、分析、编写功能列表、绘制用例图等。当然,在某些地方真的必须编写一些代码,那是设计原则真正开始产生作用的地方。

设计原则:是能被应用到设计或编写程序代码中的工具或技术,让程序代码更可维护、根具灵活性或者更易扩展。

OO原则:

1.封装变化之物

2.对接口编程,而不是对实现

3.应用程序中的每一个类只有一个改变的理由

4.类是关于行为与功能的。

第一个设计原则:

开闭原则(OCP, Open-Closed Principle)

OCP允许改变(allowing change),但是以不需要修改现有程序代码的方式进行。即代码易扩展,但是扩展的时候不能修改原有的代码。

OCP:类应该允许为扩展而开放,禁止为修改而关闭(closed for modification)

OCP是封装(encapsulation)与抽象化(abstraction)的结合。将保持不变的行为抽取到基类中,然后将程序代码锁住以禁止修改。当需要新的或不同的行为时,你的子类会通过扩展基类来处理这项改变。这是封装着力的地方:你正在封装变化之物(子类中的行为),将它与不变之物(基类中的共同行为)分开。

运用OCP的唯一方法是扩展其他类吗?

不,只要你的程序代码禁止为修改而关闭,但允许为扩展而开放,就是在运用OCP。例如,在类中有一些private(私有)方法,那些方法便是禁止为修改而关闭——没有其他程序代码能弄乱它们,但接着你可以增加一些以不同方式调用这些private方法的public方法。你正在扩展这些private方法的public方法的行为,而无需改变它们。这是一个OCP运作的另一个例子。

第二个设计原则:

不自我重复原则(DRY,Don't Repeat Yourself Principle)

DRY:通过将共同之物抽取出来并置于单一地方来避免重复的程序代码。

DRY关系到让系统中每一个信息与行为的片段都保存在单一、合理的地方。

第三个设计原则:

单一职责原则(SRP,Single Responsibility Principle)

系统里的每一个对象应该具有单一职责,所有对象的服务都应该聚焦在实现该职责上。

当你的每一个对象都只有一个改变的理由时,你已经正确的实现单一职责原则。

SRP和DRY听起来蛮像的,它们是相关的,DRY是关于把一个功能片段放在单一地方,如一个类;而SRP是关于确认一个类只做一件事,而且把事情做好。

在良好的应用程序里,一个类只做一件事且把事情做好,并且没有其他类共同分担该行为。

让每一个类只做一件事,是不是有点限制?

不,要知道,类所做的那一件事可以是相当大的一件事。如,棋盘游戏系统框架中Board类完成了很多不同的小任务,但全都关系到同一件大事:处理游戏里的棋盘,而那是Board类所做的一切,所以那是使用SRP的好例子。

使用SRP有助于让类保持较小,因为它们只做一件事,对吗?

不,SRP通常会让你的类更大。因为你不把功能分散到许多类中,往往会放更多的东西到类中。使用SRP通常导致较少的类,而这一般会让你的整个应用程序在管理和维护上简单得多。

SRP听起来像内聚力(cohesion),两者有什么关系?

内聚力是SRP的另一个名称,假如你在编写具有高度内聚性的软件,就表示你在正确的运用SRP。

第四个设计原则:

Liskov替换原则(LSP,Liskov Substitution Principle)

Liskov替换原则:子类型(subtype)必须能够替换其基类型(base type)。

LSP完全关系到设计良好的继承。当你从一个基类继承下来时,你必须能用你的子类替换该基类且不会把事情弄糟,否则,你就错误的使用了继承。

误用继承的程序代码是难以理解的。

使用继承时,你的子类会从它的父类获得所有的方法,即使你并不想要那些方法。假如你错误的使用继承,将会得到许多你不想要的方法,因为它们可能另你的子类不合理。

除了继承之外,还有什么好的方法?

将功能委托给其他类。

委托:是将特定工作的责任委派给另一个类或方法。它是继承的几个替代做法之一。

何时使用委托?

委托最好在你想要使用另一个类的功能时使用,依照原样,完全没有改变其行为。

假如你需要使用另一个类的功能性,但不想改变该功能性,考虑以委托代替继承。

组合:将来自其他多个类的行为集合起来。

何时使用组合?

当你想要使用由接口所定义的行为,并且从该接口的种种实现中进行选择是,组合是最具有威力的,不论是在编译期间还是在运行时。

组合让你使用来自一组其他类的行为,并且可以在运行时切换该行为。

若对象由其他对象组成,当拥有对象(owning object)被销毁时,被拥有对象(即组合的一部分)也跟着消失。

在组合中,由其他行为所组成的对象拥有那些行为。当对象被摧毁时,其所有行为也被摧毁。组合中的行为不存在于组合本身以外。

聚合:当一个类被用作另一个类的一部分时,但仍然可以存在于该类之外。

参考资料:

组合与聚合:http://blog.csdn.net/llbupt/article/details/6618210

组合与聚合:https://zhidao.baidu.com/question/646643373466159045.html

组合与聚合:http://blog.csdn.net/qq_31655965/article/details/54645220

组合与聚合:http://forrest420.iteye.com/blog/1040271

原文地址:https://www.cnblogs.com/lanshanxiao/p/7211502.html