可在运行时切换的组件的编程模式

时间:2016-08-08 16:55:10

标签: c++ performance design-patterns components

我想知道是否存在我应该使用的某种逻辑编程模式或结构,如果有时在运行时应该使用组件而其他时候不应该使用。显而易见的简单解决方案是在任何地方使用if-else语句。我试图避免使用if-else语句乱丢我的代码,因为一旦组件被打开,它很可能会持续一段时间,我想知道是否值得重新检查是否相同的组件是活跃的当答案很可能在两次检查之间没有改变时放置。

由于

我正在努力避免的一个简短例子

class MainClass
{
public:
    // constructors, destructors, etc

private:
    ComponentClass m_TogglableComponent;
}

// somewhere else in the codebase
if (m_TogglableComponent.IsActive())
{
    // do stuff
}

// somewhere totally different in the codebase
if (m_TogglableComponent.IsActive())
{
    // do some different stuff
}   

1 个答案:

答案 0 :(得分:3)

看起来你正朝着功能切换方向前进。当您需要能够在运行时打开或关闭某项功能时,这种情况很常见。这种方法的关键是使用多态而不是if / else语句,利用面向对象的实践。

Martin Fowler详细介绍了一种方法,以及他的理由:http://martinfowler.com/articles/feature-toggles.html

但是为了快速回答,不是让你的ComponentClass中的状态告诉观察者它是否活动,你需要创建一个基类,AbstractComponentClass和两个基类ActiveComponentClass和InactiveComponentClass。请记住,m_TogglableComponent当前是一个自动成员,你需要在这个新设置下使它成为一个指针。

AbstractComponentClass将定义两个都需要实现的纯虚方法。在ActiveComponentClass中,您将放置正常的功能,就像它已启用一样。在InactiveComponentClass中,尽可能少,足以使组件在MainClass方面不可见。 Void函数不执行任何操作,函数返回值将返回中性值。

最后一步是创建这两个类之一的实例。这是您引入依赖注入的地方。在MainClass的构造函数中,您将获取AbstractComponentClass类型的指针。从那以后,它不关心它是活动还是非活动,它只是调用虚函数。拥有或控制MainClass的人是那些注入你想要的那种,无论是活动的还是非活动的,可以通过配置读取,或者你的系统决定何时切换。

如果需要在运行时更改行为,则还需要一个setter方法,该方法接受另一个AbstractComponentClass指针并替换构造函数中的指针。