Java 以下情况的替代方案
我遇到了一个问题,我无法找到一个易于维护和可读的解决方案 我基本上在写一个“主状态机” 我有一个节点,它接收来自其他3个从节点的枚举,这些从节点独立地执行它们的任务,并达到某个状态,并将其报告给主节点 从机1输出一个枚举:Java 以下情况的替代方案,java,c++,nested,switch-statement,polymorphism,Java,C++,Nested,Switch Statement,Polymorphism,我遇到了一个问题,我无法找到一个易于维护和可读的解决方案 我基本上在写一个“主状态机” 我有一个节点,它接收来自其他3个从节点的枚举,这些从节点独立地执行它们的任务,并达到某个状态,并将其报告给主节点 从机1输出一个枚举: enum slave1 { A, B } enum slave2 { 1, 2 } enum slave3 { a, b, c } 从机2输出一个枚举: enum slave1 { A, B } enum slave2 { 1, 2 } enum slave3 {
enum slave1 {
A,
B
}
enum slave2 {
1,
2
}
enum slave3 {
a,
b,
c
}
从机2输出一个枚举:
enum slave1 {
A,
B
}
enum slave2 {
1,
2
}
enum slave3 {
a,
b,
c
}
从机3输出一个枚举:
enum slave1 {
A,
B
}
enum slave2 {
1,
2
}
enum slave3 {
a,
b,
c
}
需要注意的是,我无法控制从属节点的行为、结构和输出
现在,根据接收到的值,我的主节点具有以下逻辑
val_slave_1 = getSlave1Val();
val_slave_2 = getSlave2Val();
val_slave_3 = getSlave3Val();
switch(val_slave_1):
case A:
switch(val_slave_2):
case 1:
switch(val_slave_3):
case a: {do Z}
case b: {do Y}
case c: {do X}
case 2:
switch(val_slave_3):
case a: {do W}
case b: {do V}
case c: {do U}
case B:
switch(val_slave_2):
case 1:
switch(val_slave_3):
case a: {do T}
case b: {do S}
case c: {do R}
case 2:
switch(val_slave_3):
case a: {do Q}
case b: {do P}
case c: {do O}
本守则的优点是—
但是有没有比维护枚举字典来映射到函数更好的方法呢?因为枚举值很小,从枚举组合到函数的映射可能只是一个数组。当您有3、4和7个值(即分别为2、2和3位)时,您可以使用单个字节索引到函数指针数组中。大概是这样的:
using Handler = void (*)();
std::array<Handler, 128> handlers = { doA, doB, doB, doG, nullptr, ..., doFoo };
int v1 = slave1(); // 0-6
int v2 = slave2(); // 0-3
int v3 = slave3(); // 0-2
int index = (v2 << 5) | (v1 * 3 + v3);
handlers[index]();
使用Handler=void(*)();
数组处理程序={doA,doB,doB,doG,nullptr,…,doFoo};
int v1=slave1();//0-6
int v2=slave2();//0-3
int v3=slave3();//0-2
int index=(v2)关于使用函数映射,您不喜欢什么?叶案例之间有什么共同点吗?如果出现新的枚举选项,您希望您的代码中断,还是希望某种回退?代码路径大致有多“热”,在0的范围内是“当用户单击鼠标按钮时运行一次”(~1 Hz)到9“在60 Hz 5k显示器上按像素调用”(~1 GHz)?std::map
/std::unordred\u map
看起来像您想要的。创建一个包含每个枚举作为成员的结构,然后将值映射到您想要运行的函数。@peterruderman是对的。您应该尝试使用functions@PeterRuderman我想我是在寻找用多态性或其他概念而不是ma来实现它的方法p、 我并不讨厌它,我在寻找更清洁的替代品,但我想我的问题没有“清洁的解决方案”“这个答案给我的印象是,就像我写的那样脆弱且容易出错。如果你像我在示例代码段中那样手动填充数组,那么我同意。这就是为什么我建议使用更具表现力的方法,比如使用一个函数,以任意顺序从描述性条目填充数组。无序映射不是O(1)吗?”查找。数组优于映射有什么原因吗?unordered\u map
仍然是一种基于节点的数据结构,因此与数组相比(在最佳情况下),读取值有额外的查找。如果性能至关重要,则数组是更好的选择。