Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以下情况的替代方案_Java_C++_Nested_Switch Statement_Polymorphism - Fatal编程技术网

Java 以下情况的替代方案

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 {

我遇到了一个问题,我无法找到一个易于维护和可读的解决方案

我基本上在写一个“主状态机” 我有一个节点,它接收来自其他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 {
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个数字,我可以准确地找出预期的行为
  • 它很容易调试
  • 不必维护几个布尔或if语句
  • 此代码的问题在于它-

  • 当前代码是(2,2,3)个案例的组合,但实际上我有更多的枚举(3,4,7)。这使得它非常难以阅读和维护
  • 如果将来某个从机更改了枚举数,则假设从机2添加了另一个枚举。我将需要添加大量的案例,以使测试变得非常困难
  • 如果有另一个独立的从机(从机4)出现并提供信息,我就完蛋了
  • 我的问题是,有没有更好的方法?我读过很多地方说多态性通常是解决switch语句的一个好方法,但我试图使我的代码具有多态性,似乎无法找到解决方案。虽然很多人给出了简单的车辆和猫的例子,但我似乎无法将其应用于我的问题

    另一个重要的提示:这可能是显而易见的,但我还是会写出来。写switch case语句的顺序并不重要。为了保持理智,我将选择按从多到少的枚举顺序编写,以保存代码行(我想)

    我发现与此问题最接近的线程是-


    但是有没有比维护枚举字典来映射到函数更好的方法呢?

    因为枚举值很小,从枚举组合到函数的映射可能只是一个数组。当您有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
    仍然是一种基于节点的数据结构,因此与数组相比(在最佳情况下),读取值有额外的查找。如果性能至关重要,则数组是更好的选择。