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

How to separate your code from specific customer code?

我有以下设计问题:

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

void somefunction() {
    // do something
}

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

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

这看起来还不错,但我们有许多客户希望在代码中的许多不同位置设置他们自己的标志值。代码越来越乱了。如何将这些客户代码与我的源代码分开?有没有设计模式?

处理此问题的一个策略是将细节 "up" 从这个 class 拉到 "top",在那里可以正确设置或配置它。

我的意思是:

  1. 从class中获取具体设置。泛化,在构造函数中做成参数,或者做不同的subclasses或者classes等

  2. 使依赖于此的所有其他对象仅依赖于接口,因此它们不知道这些设置或选项。

  3. 在"top"上,在main()方法中,或者一些所有东西都插在一起的构建器或工厂,在那里你可以插入你需要的确切参数或实现针对特定客户。

恐怕没有(正确的)方法来重构这些 classes 以将所有这些细节集中到一个地方。

有变通办法,比如在所有这些地方获取配置值,或者只是为不同的版本创建不同的分支,但这些并不能真正扩展,并且根据我的经验会导致维护问题。

这是一个很笼统的问题,所以答案也会很笼统。 You want your software to be open for extensions, but closed for modifications. There are many ways to achieve this with different degrees of openness, from simple ones like parameters to architecture-level frameworks and patterns. Many of the design patterns, e.g. Template method, Strategy 处理这类问题。本质上,您在代码中提供挂钩或占位符,以便您可以插入自定义行为。

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

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