【问题标题】:Class design ideas for state machine like object状态机类对象的类设计思想
【发布时间】:2009-11-05 01:10:29
【问题描述】:

我正在编写一个类似对象的状态机。好像

Class A:

 vector<Actions> m_enter_actions;
 vector<Actions> m_exit_actions;

public:

  ClassA....
  ~ClassA

  SetEnterActions(vector<Actions> vector)
  SetExitActions(vector<Actions> vector)

这是处理此问题的最佳方法吗?我想知道我是否应该喜欢

Class A:
  EnterActions m_exit_actions;
  ExitActions m_exit_actions;

public:

  ClassA....
  ~ClassA

  SetEnterActions(EnterActions& actions)
  SetExitActions(ExitActions& actions)

EnterActions 类将是一个具有自己的动作向量的容器。这样 ClassA 类就不需要管理原始向量了。

感谢任何帮助。我在班级设计方面很糟糕。学习虽然:)

【问题讨论】:

    标签: c++ design-patterns class


    【解决方案1】:

    SetEnterActions 和 SetExitActions 函数的签名应设计为防止调用者知道 ClassA 如何存储操作。 ClassA 的用户不想知道 ClassA 是否将它们存储在向量、双端队列、列表、EnterActions 类或其他任何东西中。他们当然不希望将它们打包到 ClassA 存储它们的任何容器中。

    我的第一个倾向是允许调用者提供一个迭代器,并允许调用者通过函数调用一次添加一个:

    template <typename InputIterator>
    AddEnterActions(InputIterator first, InputIterator last);
    
    AddEnterAction(const Action &action);
    

    因此,如果调用者将它们放在向量中,他将调用AddEnterActions(vec.begin(), vec.end());。如果他将它们放在一个数组中,他会调用AddEnterActions(arr, arr+size);。如果他有一些不寻常的方法来生成它们,他不必乱七八糟地将它们放入容器中然后一次全部添加,也不必编写迭代器类来生成它们。他可以在弄清楚它们是什么时添加它们。

    同时,如果 ClassA 将动作存储在向量中,那么实现就是:

    template <typename InputIterator>
    AddEnterActions(InputIterator first, InputIterator last) {
        m_enter_actions.insert(m_enter_actions.end(), first, last);
    }
    
    AddEnterAction(const Action &action) {
        m_enter_actions.push_back(action);
    }
    

    如果 ClassA 以后想将它们存储在其他东西中,那么您无需更改任何客户端代码。

    在可能的情况下,首先根据调用者的需求设计接口。然后担心执行。当你发现它无法实现或者它要求类做一些非常低效的事情时,你有时不得不返回并调整接口。但通常不会。

    【讨论】:

      【解决方案2】:

      如果您认为需要它们来展示超出法线向量的行为,请使用 EnterActions 和 ExitActions。否则,向量很好,imo。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-20
        • 2013-07-17
        • 2011-01-07
        • 2021-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多