2017-10-19 153 views
2

我有以下设计问题:如何将您的代码与特定的客户代码分开?

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

void somefunction() { 
    // do something 
} 

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

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

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

回答

2

一种策略是拉细节“向上”从这个类的“顶”,在这里可以设置或配置正确。

我的意思是:

  1. 获取具体设置了之类的。将其作为构造函数中的参数,或者创建不同的子类或类等。

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

  3. 在“顶部”,方法main()或某些建造商或工厂,一切都插在一起,您可以插入特定客户所需的确切参数或实施。

恐怕没有(正确)的方式来重构这些类,将所有这些细节都拉到一个地方。

有解决方法,就像在所有这些地方得到的配置值,或者只是创建不同的版本不同的分支,但这些并不真正形成规模,并会导致我的经验,维护问题。

2

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

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

0

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