【问题标题】:Using Policy Based design C++使用基于策略的设计 C++
【发布时间】:2014-09-30 07:03:46
【问题描述】:

我现在的类设计是这样的(我已经复制了类层次结构和函数调用。):

  Helper* HelperFactory::create(const Advice& advice, const Handler& ah)
  {
       Helper* result = 0;
      switch(advice.getType())
      {
         case ONE:
         case TWO:
        {
                 if(advice.isTradeAdvice())
                      result = new SimpleHedgeHelper(advice, ah);
                 else
                     result = new SimpletradeHelper(advice, ah);
                break;
        } 
        case THREE
        case FOUR:
        case FIVE:
        {
             if(advice.isTradeAdvice())
                    result = new ComplexTradeHelper(advice, ah);
             else
                 result = new ComplexHedgeHelper(advice, ah);
            break;
        }
        case SIX:
        {
            if(!advice.getMsgID())
            {
                if(advice.isTradeAdvice())
                     result = new SimpleTradeHelper(advice, ah);
                else
                     result = new SimpleHedgeHelper(advice, ah);
            break;
             }
            else
             {
                   if(advice.isTradeAdvice())
                      result = new ComplexRateHelper(advice, ah);
                   else
                      result = new ComplexHedgeHelper(advice, ah);
                   break;
              }
       }
  } 

我正在尝试用一些基于模板的策略工厂来替换这个逻辑。我之前没有设计过任何基于 plicly 的课程 有人可以建议应该如何设计吗?

【问题讨论】:

  • [OT]:最好返回std::unique_ptr<Helper>
  • @TemplateRex 喝杯咖啡再考虑一下 ;)
  • @Quentin 啊,我的错,那些该死的 CamelCase 名字。

标签: c++ policy-based-design


【解决方案1】:

在考虑迁移到策略模板时,您应该评估是否可以使用这种方法来考虑当前类之间的行为差​​异:

template <class Complexity_Policy, class Instrument_Policy>
class Helper : public Abstract_Helper
{
    // for any function Helper needs...
    virtual return_type f(arguments)
    {
         ...can reference Complexity_Policy and/or Instrument_Policy members for behaviours...
    }
};

当行为在很大程度上正交(不相关/解耦)时,这往往效果最好。

如果您的所有客户端代码都想继续使用运行时多态性,您仍然需要您的工厂,但它应该开始返回如下内容:

result = new Helper<Complexity_Policy__Simple, Instrument_Policy__Hendge>(advice, ah);

(是的,我知道标准保留在标识符中使用双下划线......我确实接受这将具有未定义行为的风险,感觉实现可能使双下划线的唯一可以想象的使用是作为前缀或后缀.... 没有兴趣绕过这个 Q 来进一步讨论。)。

您也可以选择性地直接使用模板实例化。另一种选择是甚至不让Helper 从任何基类派生或具有虚函数,而是使用Abstract_Helper* get_polymorphic_accessor() 成员在顶部分层运行时多态性,该成员创建一个从Helper 派生的指针持有类,用于转发调用/结果。

【讨论】:

  • 感谢托尼的快速回复。但是重构当前的类层次结构对我来说不是一个选择:(我一直在寻找一些解决方案,之后我应该能够通过传递“type”来获得正确的对象,在我的情况下这是一个枚举值,例如 Factort<:> f; f.create();
  • @user1545583:这听起来一点用都没有,因为在创建 f 变量的每个上下文中,您都需要每个枚举都是编译时常量,这基本上意味着您当前工厂的switch/if/else 链只是为了创建一个Factort&lt;...&gt; 变量并使用它来间接调用new....
猜你喜欢
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多