我所工作的公司已经脱离了深层次的功能切换配置键,根据特定条件打开/关闭特定行为。 Martin Fowler实际上将它们称为业务切换(http://martinfowler.com/bliki/FeatureToggle.html)。
我们有很多客户都使用相同的服务,但每个客户都想要稍微不同的行为。更糟糕的是,许多人希望其用户的某些子群看到不同的行为。因此,我们使用业务切换。切换已经成为if / else逻辑的意大利面球,偶尔会有意想不到的相互作用。
是否有任何设计模式可用于管理此类情况?
干杯!
答案 0 :(得分:2)
我觉得用一个小例子回答这个问题比较容易:
示例问题:您有一个组件从某些输入执行某些计算。 根据客户的不同,以下内容会发生变化:
所以工作流程可能看起来像这样:
预处理 - >用[A..C]风味计算 - >格式输出 - >完成。
我会考虑设计一个没有一堆配置意大利面条的设计:
结果:具有0个配置选项的行为实现的集合以及具有0个配置选项的核心代码库。最后一步是选择客户项目的行为实现,如果有特殊内容,可以编写新的实现。
如果你这样做了,你将永远幸福地生活,而不会改变合同和核心系统。如果您错过了一些完美的设计,那么您将进行一些迭代,直到您找到最佳的合约界面设计,以便您的核心代码库变得稳定。
通过这种方法,您还可以更轻松地估算工作并为新客户编写报价。您可以简单地检查报价阶段,如果您已经有所有行为实施,或者您需要编写一些新的行为。如果你记录首先写它们需要多长时间,你甚至会猜测它需要的工时。
答案 1 :(得分:2)
if-then-else
(或switch-case
用于多状态切换)我个人更喜欢使用普通的if-then-else
构造,并在适用时添加评论TODO: Remove when feature has been tested.
。
请记住每个功能标记is a technical debt。不要过度使用它们。我建议不要将它们用于业务逻辑。
然而,关于你的意大利面条业务切换,我会建议重构。