设计一个简单的电机控制器,它可以处于(至少)4种状态 - 空闲 - 加速 - 最大速度 - 减速。
我认为尝试实现某种状态机是最好的方法。目前,使用switch语句似乎是一个很好的解决方案,因为它简单,它将允许我保留所有"运动的东西"在一个对象中(让我们称之为移动)。
这看起来合情合理吗?谁能建议更合适的方法? 我知道有些人喜欢将每个状态分成对象,但是在为MCU编写时,有几个人告诉我要避免继承。
答案 0 :(得分:2)
我不会在这里使用继承,不是因为MCU,而是因为继承意味着抽象,4种状态的抽象不值得(当然,也有例外)。
您必须决定是否要分离状态上下文。如果不是,则将其保留在一个班级中。如果最终得到许多方法和许多属性,则应将其拆分。
如果你需要拆分,要么使用状态模式,要么如果没有很多状态,请保持简单:
为每个州定义一个班级。此类表示状态行为。不要忘记使用构造函数作为输入点和析构函数作为离开点。
然后定义一个FSM类以在状态之间切换。 FSM应该包含一个循环,它创建一个当前状态,运行它,检查它的状态,并在需要时破坏当前状态并创建下一个状态。
示例:
// Idle
class Idle {
public:
Idle() {
// entry point
}
~Idle() {
// leaving point
}
void step() {
// actual work
}
// some getters to examine state
private:
// helper methods
// state attributes (context)
};
class FSM {
public:
void run() {
State current(sIdle);
while (current != sExit) {
switch (current) {
case sIdle: {
Idle ctx;
ctx.step();
// examine state
// get user input or
// call step() again or
// decide next state:
current = Accelerate;
break;
}
...
}
}
我喜欢这个设计的是简单,没有仿函数(与State模式不同),并且当前状态在构造下一个之前被破坏。此外,与State模式不同,状态实现不了解其他状态实现。
不要在那里放任何抽象。或者把它放在那里,但保留原始版本然后进行比较。