【问题标题】:Programming pattern for components that are toggleable at runtime在运行时可切换的组件的编程模式
【发布时间】:2016-08-08 16:55:10
【问题描述】:

我想知道是否有某种逻辑编程模式或结构我应该使用,如果有时在运行时应该使用组件而其他时候不应该使用。显而易见的简单解决方案是在任何地方都使用 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
}   

【问题讨论】:

  • 也许Making a Plugin System 可以帮助您入门。
  • 那个链接是关于 dll 的,对于这个简单的案例来说,这似乎有点过头了(如果有更多细节,它可能会更合适)
  • 出于所有意图和目的,我想您可以将可切换组件视为一个文件,该文件可能会在某个未确定的时间损坏并关闭。您可以使用 Open 将其打开并使用 Close 将其关闭,但也存在文件在运行时中途死亡的情况,因此它会在没有显式调用 Close 的情况下关闭。你如何处理写作?您是否将每个写入调用都包含在检查中以查看文件是否打开?你只是默默地写失败吗?你抛出错误吗?这种意外关闭是否应该是它自己的单独状态类型,应该检查?
  • m_TogglableComponent 是否只能通过MainClass 的一些公共方法进行切换?
  • 不,可切换组件也可以通过异常等内部事件进行切换

标签: c++ performance design-patterns components


【解决方案1】:

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

Martin Fowler 在此详细介绍了一种方法以及他的基本原理:http://martinfowler.com/articles/feature-toggles.html

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

AbstractComponentClass 将定义两个都需要实现的纯虚方法。在 ActiveComponentClass 中,您将放置您的正常功能,就好像它已启用一样。在 InactiveComponentClass 中,您尽可能少地做,足以使组件就 MainClass 而言是不可见的。 void 函数什么都不做,函数返回值将返回中性值。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2019-06-16
    • 2017-10-10
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多