Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何将您的代码与特定的客户代码分开?_Oop_Design Patterns_Architecture_Software Design - Fatal编程技术网

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

Oop 如何将您的代码与特定的客户代码分开?,oop,design-patterns,architecture,software-design,Oop,Design Patterns,Architecture,Software Design,我有以下设计问题: 我有很多行面向对象的源代码(C++),我们的客户希望对我们的代码进行特定的更改以满足他们的需要。这里有一个非常简单的例子: void somefunction() { // do something } 插入后的功能客户希望: void somefunction() { // do something setFlag(5000); } 这看起来还不错,但我们有许多客户希望在代码中的许多不同位置设置自己的标志值。代码变得越来越混乱。如何将这些客户代码

我有以下设计问题:

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

void somefunction() {
    // do something
}
插入后的功能客户希望:

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

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

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

我的意思是:

  • 从课堂中获取具体的设置。泛化,使其成为构造函数中的参数,或生成不同的子类或类,等等

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

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

  • 恐怕没有(正确的)方法来重构这些类,从而将所有这些细节集中到一个地方


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

    这是一个相当普遍的问题,所以答案将相当普遍。有很多方法可以通过不同程度的开放性来实现这一点,从简单的参数到架构级的框架和模式。例如,许多设计模式都处理这类问题。本质上,您可以在代码中提供钩子或占位符,以便插入自定义行为


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

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