【问题标题】:How to separate your code from specific customer code?如何将您的代码与特定客户代码分开?
【发布时间】:2018-03-31 12:17:27
【问题描述】:

我有以下设计问题:

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

void somefunction() {
    // do something
}

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

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

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

【问题讨论】:

    标签: oop design-patterns architecture software-design


    【解决方案1】:

    解决这个问题的一个策略是将细节从这个类“向上”拉到“顶部”,在那里可以正确设置或配置。

    我的意思是:

    1. 从类中获取具体设置。泛化,使其成为构造函数中的参数,或制作不同的子类或类等。

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

    3. 在“顶部”,在main() 方法中,或者在一些将所有东西都插入在一起的构建器或工厂中,您可以插入特定客户所需的确切参数或实现。

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

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

    【讨论】:

      【解决方案2】:

      这是一个非常笼统的问题,因此答案将非常笼统。 You want your software to be open for extensions, but closed for modifications。有许多方法可以通过不同程度的开放性来实现这一点,从简单的参数(如参数)到架构级别的框架和模式。许多设计模式,例如Template method, Strategy 处理这类问题。本质上,您可以在代码中提供挂钩或占位符,以便您可以插入自定义行为。

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2022-01-06
          • 2019-04-25
          • 2020-11-04
          • 1970-01-01
          • 1970-01-01
          • 2022-10-13
          • 2012-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多