软件设计与重构的六个原则
再读《重构》和《架构整洁之道》
目录
开放封闭原则 --- OCP
依赖倒置原则 --- DIP
单一职责原则 --- SRP
Liskov替换原则 --- LSP
接口隔离原则 -- ISP
迪米特法则(最小知识原则) -- LOD
一、开放封闭原则 --- OCP
软件中的基础结构(函数、类或模块)对于功能扩展是开放的,但是对于修改是封闭的。
可实施的具体行为
面向接口编程,不要面向实现编程
依赖倒置原则
Liskov替换原则
eg.
//Method One
int DoSomeFunction(code, param1, param2)
{
int rtnCode = ...
switch(code)
{
case CODE_A:
{
code block A
break;
}
case CODE_B:
{
code block B
break;
}
....
default:
rtnCode = not support error code
return rtnCode;
}
//Method Two
int ProcessForCodeA(param1, param2)
{
code block A
}
int ProcessForCodeB(param1, param2)
{
code block B
}
struct
{
int code;
int (*Processor)(param1, param2);
}ITEM;
//Table-Driven Methods
static ITEM processItems[] =
{
{CODE_A, ProcessForCodeA},
{CODE_B, ProcessForCodeB},
......
};
int DoSomeFunction(code, param1, param2)
{
for_each(item in processItems)
{
if(item.code == code)
{
return item.Processor(param1, param2);
}
}
return not supoort error code;
}
#define MAX_PROCESS_ITEMS 32
ITEM processItems[MAX_PROCESS_ITEMS] = { 0 };
int DoSomeFunction(code, param1, param2)
{
......
}
bool RegisterProcessor(int code, Processor func)
{
add {code, func} to processItems[]
}
void DeregisterProcessor(int code)
{
remove code process item from processItems[]
}
可实施的设计模式:
Strategy 策略模式
Template Method 模板方法模式
Visitor 访问者模式
开放封闭原则 --- Strategy 模式
意图:定义一些列算法,把它们一个个封装起来,并且使它们可以互相替换。本模式使得算法可独立于使用它的客户而变化
适用性:
- 许多相关的类仅仅是行为有差异,这个模式提供一种用多个行为中的一个来配置一个类的方法
- 需要使用一个算法的不同变体
- 算法使用客户不应该知道的数据,使用策略模式可以避免暴露复杂的、与算法相关的数据结构
- 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。
开放封闭原则 --- Template Method 模式
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。本模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用性:
- 一次性定义一个算法的不变部分,并将可变的行为留给子类来实现
- 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复 控制子类扩展。
- 模板方法只在特定的点调用“Hook”操作,遮掩个旧只允许在这些点进行扩展。
开放封闭原则 --- Visitor 模式
意图:表示一个作用于某对象结构中的各个元素的操作。本模式使得你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。<