软件设计原则
软件设计主要关注如何设计一个高质量软件系统,使其满足用户需求,同时具有良好的可维护性、可扩展性、可重用性、可移植性等好的特性。其主要分为软件架构设计和详细设计两个阶段。本课程的主要关注面向对象(
面向对象过程主要分为几个阶段:结合领域模型确立软件架构(架构设计)、面向对象设计和面向对象编程(详细设计),即从高层设计向低层设计演进。一般来说,从面向对象设计到面向对象编程相对较为简单,只是将设计的类和对象映射到编程语言中。而从架构设计到面向对象设计则是一个较为复杂的过程,需要利用丰富的经验和熟练度来完成。这就需要长期的实践和积累。
//TODO:图片(OOA、OOD、OOP)
在长期的实践和积累中,人们总结出了一些软件设计原则。利用这些原则,可以帮助我们更好的设计软件系统,提高软件系统的质量。
面向对象设计原则概述
知名软件大师
基于这一出发点,人们总结出了一些面向对象设计原则。这些原则并不是孤立存在的,他们相互依赖,互相补充。
单一职责原则
定义 一个对象应该只包含单一的职责,并且该职责被完整地封装到一个类中。
另一种定义 就一个类而言,应该仅有一个引起它变化的原因。
变化的原因
一个类中的变化指由于需求点的变化而引起的变化。如果一个类有多个引起它变化的原因,那么这个类就有多个职责。
// TODO:分析、图片
开闭原则
定义 一个软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
开闭原则表示,在设计一个软件实体时,应该使其通过扩展来改变行为,而不是通过修改已有的代码来实现变化。
// TODO:图片
里氏替换原则
定义 如果对每一个类型为
另一种定义 所有引用基类(父类)的地方必能透明地使用其派生类(子类)的对象。
里氏替换原则主要是说,软件中如果能使用基类对象,那么一定能够使用其子类对象,而且不会出现任何问题。这是面向对象设计中继承部分的基本原则之一。此外,里氏替换原则还是开闭原则的实现基础。一般在我们的设计时,尽量在类设计中使用基类(抽象类)等,在具体实现时再指定具体的子类。
// TODO:图片
依赖倒置原则
定义 高层模块不应该依赖于底层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
另一种定义 应当面向接口编程,而不是面向实现编程。
依赖倒转主要意为:代码要依赖抽象的类,而非具体的类。要针对接口或抽象类编程,而不是针对具体类编程。依赖倒转原则是实现开闭原则的重要手段。
// TODO:图片
接口隔离原则
定义 客户端不应该依赖它不需要的接口。一旦一个接口过大,则需要将它分割成更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。
接口的说明
这里的接口不仅仅指 Java
中的 interface
。主要指类对外提供的方法,即与外部交互的方法。
接口隔离原则是讲,应当使用多个专门的接口,而非单一的总接口。此外,接口只应将客户端需要的方法暴露出来,而隐藏不需要的具体实现。接口隔离原则其实是对单一职责原则的扩展,是单一指责原则在接口层面的体现。
// TODO:图片
合成复用原则
定义 尽量使用对象组合,而不是继承来达到复用的目的。
合成复用原则是指,在新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用已有对象的目的。这一可以减少继承带来的复杂性。继承是一种强耦合的关系,继承复用一般是静态的,不可在运行时发生改变,没有足够的的灵活性。而组合/聚合复用是一种弱耦合的关系,可以在运行时选择性地调用成员对象的操作,动态地改变对象的行为。