如何将代码与特定客户代码分开?

时间:2017-10-19 12:47:05

标签: oop design-patterns architecture software-design

我有以下设计问题:

我有许多面向对象的源代码(C ++),我们的客户希望对我们的代码进行特定的更改以满足他们的需求。这是一个非常简单的例子:

void somefunction() {
    // do something
}

我插入客户意愿后的功能:

void somefunction() {
    // do something
    setFlag(5000);
}

这看起来并不是那么糟糕,但我们有很多客户希望在代码中的许多不同位置设置自己的标志值。代码变得越来越混乱。如何将这些客户代码与我的源代码分开?有没有设计模式?

3 个答案:

答案 0 :(得分:2)

解决这个问题的一个策略是提取细节" up"从这个班级到" top",可以正确设置或配置。

我的意思是:

  1. 从课堂上获取具体设置。通用化,使其成为构造函数中的参数,或者创建不同的子类或类等。

  2. 使依赖于此的所有其他对象仅依赖于界面,因此他们不了解这些设置或选项。

  3. main()方法中的" top",或者所有插件连接在一起的构建器或工厂中,您可以插入所需的确切参数或实现特定客户。

  4. 我担心没有(正确的)方法可以重构这些类,将所有这些细节都集中到一个地方。

    有一些解决方法,比如在所有这些地方获取配置值,或者只是为不同的版本创建不同的分支,但这些不能真正扩展,并且会导致我的体验中出现维护问题。

答案 1 :(得分:2)

这是一个非常普遍的问题,所以答案非常笼统。 You want your software to be open for extensions, but closed for modifications。有许多方法可以实现不同程度的开放性,从简单的参数到架构级框架和模式。许多设计模式,例如Template methodStrategy处理这类问题。基本上,如果您可以插入自定义行为,则可以在代码中提供钩子或占位符。

在现代C ++中,其中一些模式或它们使用显式类的实现有点过时,可以用lambda函数代替。标准库中也有许多例子,例如在STL容器中使用分配器。作为STL的客户,分配器允许您更改分配和释放内存的方式。

答案 2 :(得分:0)

要限制代码的不受控制的编写,您应该考虑向您的客户公开一个强大的基类(以接口或抽象类的形式),其中一些(或所有)方法关闭以进行修改。
然后,每个客户都将扩展实现或子类化它的基类行为。简而言之,在我看来,每个客户都对应一个子类CustomerA,CustomerB等。这样你就可以划分每个客户编写的代码。
在我看来,开放修改的基类方法应该是一个非常有限的集合,或者更好,没有。如果可能,添加的行为应仅保留在派生类中的添加方法中;通过这种方式,您将避免不受修改的方法的修改。