对策略与机制分离(seperation of mechanism and policy)的理解

1 机制与策略的傻瓜式解释

机制(mechanism)提供了某一方面的功能,在C语言中表现为一个个的接口函数。
策略(policy)是决定如何调用各个功能,包括但不限于:以何种顺序调用?何时何地调用?调用次数?

举些例子:

  • 操作系统API就是机制,而用户程序就是策略;
  • 数学函数库就是机制,而计算圆面积是一个策略,计算球体积也是一个策略;
  • 各种游戏道具是机制,而如何综合使用它们就是策略;
  • 吃、喝、拉、撒、睡是机制,而生活则是策略;

可以看出机制和策略的特点:机制表现为一组彼此正交(不重复)的功能,稳定不易变化;策略表现为对各个功能的调用逻辑,花样繁多,变化无常。

机制和策略是在特定语境中相对的概念,一个策略在另一个更高的语境下可能就是机制了。例如Qt,MFC等相对于Win32API来说就是策略;在使用MFC开发一个桌面程序时,MFC相对于桌面程序来说就是机制了。

一个复杂的大系统中,可能存在多个层次的策略/机制。

2 机制策略分离的好处

相当于把一个项目分解成稳定和不稳定的两个部分。一旦用户需求发生改变,只需要改变策略即可,机制部分只需少许修改或者完全不需要修改。

还是举个例子。

要求:设计一个程序,完成绘制一个三头六臂机器人(具有三个头,六手臂的机器人,二只脚的机器人)。
不分离的设计伪代码:

int main()
{
    绘制三个头;
    绘制身体;
    绘制六个手臂;
    绘制两只脚;
}

分离机制/策略的伪代码:

void f_绘制一个头();
void f_绘制一只手臂();
void f_绘制一只脚();
void f_绘制身体();

int main()
{
    for(int i=0; i<2; i++){
        f_绘制一个头();
    }
    for(int i=0; i<6; i++){
        f_绘制一只手臂();
    }
    for(int i=0; i<2; i++){
        f_绘制一只脚();
    }
    f_绘制身体();
}

初看起来,分离机制和策略会带来更多的代码量,但却也带来了更好的灵活性。比如客户觉得三头六臂的机器人满足要求,需要绘制一个5头8臂的呢?

3 机制策略分离的方法

理论上理解机制和策略并不困难,但在实际操作中并不是非常简单。如何抽象出稳定的功能作为机制,需要对项目需求有深刻的理解和把握。在程序的架构设计时,可以按照下面两种方式进行顶层设计,这样有助于逐渐把机制策略分离的原则运用的项目中去。

3.1 按照库的方式写程序

把项目需求按照层次分成2级,下级作为函数库来实现,为上级提供一致稳定的接口;上级实现调用这些接口的策略。

3.2 把程序分成前后端

这种分离在形式上更进了一步。机制和策略分别作为独立的程序来实现,两者之间通过网络协议来实现调用。由于两者不再共享同一进程空间,所以彼此影响很小,可以独立开发,独立运行测试。带来的不便就是调用代码相对复杂。

大量的BS程序,就是天生具有这种架构的例子。

你可能感兴趣的:(机制,策略,policy,Mechanism,分离)