伺服转换应该具有什么抽象级别
What abstraction level should the servo transitions have?
我认为我使用了太多方法,因为抽象设计不好。这就是为什么我问这个问题,不同于这个和类似的问题,它们只关注方法本身的数量
长话短说,我正在做一个六足类。我这么说是因为有一些不同寻常的设计考虑:你不能很快从前进变为倒退;所以有一些过渡时间。此外,还有空闲时间,那是没有行动的时候。
我正在重构我的代码,但为了实现这一点,我发现我正在创建许多方法,这些方法不应该在顶级抽象中,而是在下面:
void loop()
{
// Potentiometer
String action = Controller.action();
Serial.println(action);
// Set the spider to the forward start position
if (action == "toForward")
{
Spidey.toForward();
}
// Move the spider forward
else if (action == "forward")
{
Spidey.forward();
}
// Get it to standby position
else if (action == "fromForward")
{
Spidey.fromForward();
}
// MANY MORE METHODS HERE
// Default action (stand by)
else
{
Spidey.idle();
}
delay(10);
}
在这个级别中,应该只有Spidey.forward();
方法是可见的,而不是转换方法如何设置转换操作的抽象级别
我的选择:
使
Controller
返回另一个参数"transition",该参数将传递给被调用的方法。问题:这使代码过于复杂。与其让Controller返回
toForward
、forward
和fromForward
,不如让它只返回forward
,然后让Spidey
在内部处理事情(将变量lastAction
存储在Spidey
中,而不是像我现在所做的那样将其存储在Controller
中)。问题:这会创建更多的私有方法,但根据相关问题,这是可以的。还有其他想法吗?
这在一定程度上取决于Controller中现在发生的事情。某个地方需要一个类来记录当前状态并处理转换顺序,并将"转发"请求转换为转换中间状态的序列。也许这是控制器,也许是蜘蛛侠。
对我来说,让那么大的if块基于许多不同的魔术串来调用不同的函数看起来是错误的。这看起来更像是一个不处理中间状态的顶级表示。内部状态转换逻辑使用枚举会显得更舒适。然后可能会有一个成员函数toState(),它会对状态进行排序以达到该状态。
请记住,当一个中间状态结束时,需要轮询或通知这个类,以便它可以开始下一个状态。如果只有控制器知道这一点,那么在那里设置该逻辑可能是有意义的。不要试图在两个类之间复制或拆分该逻辑。
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- C++中抽象语法树最常用的表示法是什么
- C++中抽象和封装之间的确切区别是什么?
- 在 c++ 中抽象两个略有不同的函数的最佳方法是什么?
- 私下继承C++抽象基类是什么意思
- 抽象类的需求是什么?为什么要通过其基类访问派生类方法?在C++
- 抽象数据类型(ADT)和数据结构之间有什么区别
- 虚拟类和抽象类在C++有什么用
- 我应该为接口还是抽象基类编程?该短语到底是什么意思
- 抽象跨平台实现的常见习语是什么
- 我可以在c++接口(抽象类)中包含什么
- 静态多态性中的纯抽象函数等价物是什么
- 抽象基类有什么用
- 'non-virtual interface'和"抽象接口"有什么区别?
- 在CPP中创建一个抽象类而不是基类会给我带来什么好处
- 什么是LLVM中编译单元的正确抽象
- 使用抽象基类的回调函数和虚函数有什么区别?
- 什么是主循环抽象概念
- 使用其他基类的方法满足纯抽象方法的最简单方法是什么
- 伺服转换应该具有什么抽象级别