我有以下设计问题:
我有许多面向对象的源代码(C ++),我们的客户希望对我们的代码进行特定的更改以满足他们的需求。这是一个非常简单的例子:
void somefunction() {
// do something
}
我插入客户意愿后的功能:
void somefunction() {
// do something
setFlag(5000);
}
这看起来并不是那么糟糕,但我们有很多客户希望在代码中的许多不同位置设置自己的标志值。代码变得越来越混乱。如何将这些客户代码与我的源代码分开?有没有设计模式?
答案 0 :(得分:2)
解决这个问题的一个策略是提取细节" up"从这个班级到" top",可以正确设置或配置。
我的意思是:
从课堂上获取具体设置。通用化,使其成为构造函数中的参数,或者创建不同的子类或类等。
使依赖于此的所有其他对象仅依赖于界面,因此他们不了解这些设置或选项。
在main()
方法中的" top",或者所有插件连接在一起的构建器或工厂中,您可以插入所需的确切参数或实现特定客户。
我担心没有(正确的)方法可以重构这些类,将所有这些细节都集中到一个地方。
有一些解决方法,比如在所有这些地方获取配置值,或者只是为不同的版本创建不同的分支,但这些不能真正扩展,并且会导致我的体验中出现维护问题。
答案 1 :(得分:2)
这是一个非常普遍的问题,所以答案非常笼统。 You want your software to be open for extensions, but closed for modifications。有许多方法可以实现不同程度的开放性,从简单的参数到架构级框架和模式。许多设计模式,例如Template method,Strategy处理这类问题。基本上,如果您可以插入自定义行为,则可以在代码中提供钩子或占位符。
在现代C ++中,其中一些模式或它们使用显式类的实现有点过时,可以用lambda函数代替。标准库中也有许多例子,例如在STL容器中使用分配器。作为STL的客户,分配器允许您更改分配和释放内存的方式。
答案 2 :(得分:0)
要限制代码的不受控制的编写,您应该考虑向您的客户公开一个强大的基类(以接口或抽象类的形式),其中一些(或所有)方法关闭以进行修改。
然后,每个客户都将扩展实现或子类化它的基类行为。简而言之,在我看来,每个客户都对应一个子类CustomerA,CustomerB等。这样你就可以划分每个客户编写的代码。
在我看来,开放修改的基类方法应该是一个非常有限的集合,或者更好,没有。如果可能,添加的行为应仅保留在派生类中的添加方法中;通过这种方式,您将避免不受修改的方法的修改。