状态机类对象的类设计思想
Posted
技术标签:
【中文标题】状态机类对象的类设计思想【英文标题】: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 类就不需要管理原始向量了。
感谢任何帮助。我在班级设计方面很糟糕。学习虽然:)
【问题讨论】:
【参考方案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。
【讨论】:
以上是关于状态机类对象的类设计思想的主要内容,如果未能解决你的问题,请参考以下文章