可在运行时切换的组件的编程模式
Programming pattern for components that are toggleable at runtime
我想知道是否存在某种我应该使用的逻辑编程模式或结构,如果有时在运行时应该使用一个组件而其他时候则不需要。显而易见的简单解决方案是在任何地方都使用 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
}
您似乎正准备切换功能。当您需要能够在 运行 时间打开或关闭某项功能时,这种情况很常见。这种方法的关键见解是使用多态性而不是 if/else 语句,利用面向对象的实践。
Martin Fowler 在这里详细介绍了一种方法,以及他的基本原理:http://martinfowler.com/articles/feature-toggles.html
但是为了快速回答,与其在 ComponentClass 中设置状态来告诉观察者它是否处于活动状态,不如创建一个基础 class、AbstractComponentClass 和两个基础 classes ActiveComponentClass 和 InactiveComponentClass。请记住,m_TogglableComponent 目前是自动成员,您需要将其设为新设置下的指针。
AbstractComponentClass 将定义两者都需要实现的纯虚方法。在 ActiveComponentClass 中,您将放置您的正常功能,就好像它已启用一样。在 InactiveComponentClass 中,你做的尽可能少,足以使组件对 MainClass 不可见。 Void 函数什么都不做,函数 return 值将 return 中性值。
最后一步是创建这两个 class 之一的实例。这是您引入依赖注入的地方。在 MainClass 的构造函数中,您将采用 AbstractComponentClass 类型的指针。从那里开始,它不关心它是活动的还是非活动的,它只调用虚函数。拥有或控制 MainClass 的人 注入 您想要的类型,无论是活动的还是非活动的,都可以通过配置读取,或者您的系统决定何时切换。
如果您需要在 运行 时更改行为,您还需要一个 setter 方法,该方法采用另一个 AbstractComponentClass 指针并替换构造函数中的指针。
我想知道是否存在某种我应该使用的逻辑编程模式或结构,如果有时在运行时应该使用一个组件而其他时候则不需要。显而易见的简单解决方案是在任何地方都使用 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
}
您似乎正准备切换功能。当您需要能够在 运行 时间打开或关闭某项功能时,这种情况很常见。这种方法的关键见解是使用多态性而不是 if/else 语句,利用面向对象的实践。
Martin Fowler 在这里详细介绍了一种方法,以及他的基本原理:http://martinfowler.com/articles/feature-toggles.html
但是为了快速回答,与其在 ComponentClass 中设置状态来告诉观察者它是否处于活动状态,不如创建一个基础 class、AbstractComponentClass 和两个基础 classes ActiveComponentClass 和 InactiveComponentClass。请记住,m_TogglableComponent 目前是自动成员,您需要将其设为新设置下的指针。
AbstractComponentClass 将定义两者都需要实现的纯虚方法。在 ActiveComponentClass 中,您将放置您的正常功能,就好像它已启用一样。在 InactiveComponentClass 中,你做的尽可能少,足以使组件对 MainClass 不可见。 Void 函数什么都不做,函数 return 值将 return 中性值。
最后一步是创建这两个 class 之一的实例。这是您引入依赖注入的地方。在 MainClass 的构造函数中,您将采用 AbstractComponentClass 类型的指针。从那里开始,它不关心它是活动的还是非活动的,它只调用虚函数。拥有或控制 MainClass 的人 注入 您想要的类型,无论是活动的还是非活动的,都可以通过配置读取,或者您的系统决定何时切换。
如果您需要在 运行 时更改行为,您还需要一个 setter 方法,该方法采用另一个 AbstractComponentClass 指针并替换构造函数中的指针。