文章目录

  • 可维护性的度量和设计原则(2)
  • 面向对象的设计原则:SOLID
  • Single Responsibility Principle(SRP)
  • Open/Closed Principle(OCP)
  • Liskov Substitution Principle(LSP)
  • Interface Segregation Principle(ISP)
  • Dependency Inversion Principle(DIP)
  • 面向对象的设计原则:GRASP
  • GRASP
  • Responsibility
  • GRASP中的一些角色


可维护性的度量和设计原则(2)

面向对象的设计原则:SOLID

Single Responsibility Principle(SRP)

单一职责原则(SRP) 指的是一个类应该专一做一件事,如果类变化,那么引起变化的原因只能有一个。如果有代码违背了SRP,那么可以通过分解,把两个无关的责任分离开并分别放置在两个类中。

Open/Closed Principle(OCP)

开闭原则(OCP)指的是软件实体(类、模块、函数等)应该对扩展开放,而对修改封闭,即对一个类的行为的修改应该通过继承和组合来进行。

  • 开放模块:可以被扩展
  • 封闭模块:可以被客户端使用,可以被改进
  • 一个违背了开闭原则的例子:
class GraphicEditor{
	public void drawShape{
		if(s.mType==1){
			drawRectangle(s);
		}
		else if(s.mType==2){
			drawCircle(s);
		}
	}
	public void drawCircle(Circle r) {....}
	public void drawRectangle(Rectangle r) {....}
}

class Shape{
	int mType;
}
class Rectangle extends Shape{
	Rectangle(){
		super.mType=1;
	}
}
class Circle extends Shape{
	Circle(){
		super.mType=2;
	}
}

在上面的例子中,GraphEditorShape之间耦合度太高,导致了如果想要添加一个新的形状,必须要理解GraphEditor类并且修改其中的方法,这违背了开闭原则。
因此有了下面的改进:

class GraphicEditor{
	public void drawShape(Shape s){
		s.draw();
	}
}

class Shape{
	abstract void draw();
}
class Rectangle extends Shape{
	public void draw(){// draw the rectangle}
}

Liskov Substitution Principle(LSP)

里氏替换原则(LSP)指的是子类型必须能够替换它的父类型,关注操作的可替换性。在所有使用父类型对象的地方替换成子类型成些许的行为不会受到改变,这样我们说程序符合里氏替换原则。

Interface Segregation Principle(ISP)

接口隔离原则指的是客户端不应该被迫依赖它们不适用的接口,因此应该保持小的接口。不要强制类实现他们不能的方法,不要用很多方法污染接口,避免过于臃肿的接口。

Dependency Inversion Principle(DIP)

依赖转置原则指的是高层模块不应该依赖于底层的模块,二者应该都依赖于抽象。同时抽象不应该依赖于实现的细节,实现细节应该依赖于抽象。

  • DIP原则可以使类的契约形式化
  • 可以通过前置条件和后置条件来定义程序的功能,是的客户对于它们应该期望什么十分清楚
  • 形成测试友好的设计
  • 测试友好的模块具有其他重要的设计特征

面向对象的设计原则:GRASP

GRASP

GRASP是General Responsibility Assignment Software Patterns的缩写,包括了责任分配的原则。GRASP模式是一种学习辅助工具,可帮助人们理解基本对象设计,并以有条理,合理,可解释的方式应用设计推理。这种理解和使用设计原则的方法基于将责任分配给类的模式。

Responsibility

  • 对象的责任是对象的义务
  • 掌握:了解私有封装数据、了解相关对象、了解它可以衍生或计算的事物
  • 操作:自己做某事,比如创建对象或进行计算、在其他对象中启动操作、控制和协调其他对象中的活动

GRASP中的一些角色

  • Controller:负责手法工作,具体执行通过委托机制进行委托
  • Information Expert:拥有信息的类负责相应的责任
  • Creator:负责实例化
  • Low Coupling: 分配责任,使耦合保持低水平,低耦合是一种评估原则,用它来评估替代品
  • High Cohesion:分配责任,使内聚保持高水平,高内聚也是一种评价原则,用它来评估替代品
  • Indirection:将责任分配给中间对象以在其他组件或服务之间进行调解,以使它们不直接耦合,将责任分配给中间对象,以避免直接耦合
  • Polymorphism:处理基于类型的替代品
  • Protected Variations:使对象或系统的内部不稳定性不会对其他元素产生不良影响
  • Pure Fabrication:无法依靠专家模式实 现高内聚和低耦合时,设计虚构的类实现高内聚低耦合和复用