带开关的case语句 - case或if-else - 最佳设计?

时间:2017-02-08 05:54:21

标签: java

我试图用一个例子解释我的设计问题。

假设我有5个父母[1,2,3,4,5]。每个父母都有n个孩子。孩子就像[a,b,c,d,e,f]。

我正在尝试写一些东西

 Map<String, String> children = parentDataHolder.getParent(parentType).getChildren();
 switch(parentType){
      case 1:
          if(partent1.contains(childType1)){
          }
          //Similarly for all child types
      case 2:
      case 3:
         .......
 }

此处,父类型是固定的。儿童类型是动态的。我正在进入地图。对于每张地图,我都要检查孩子是否在场。如果是这样,我必须根据孩子的类型采取行动。

哪种设计会更好?以上设计对我来说不太好。

有什么想法吗?

修改

parentHolder是一个对象,它具有获取父类型和子类型的方法。 例如:

 {
     parentType: '1',
     children:{
       "a":"fileOne.xml",
       "c" : "fileTwo.gz"
     }
  }

一旦我收到这个json,我将子值存储在Map中,然后我得到parentType并传递给切换条件。

在内部切换案例中,我必须为儿童应用逻辑。上面的例子有两个孩子。在某些其他情况下,parentType 1将具有a,b,c作为子项。所以它应该是通用的。

1 个答案:

答案 0 :(得分:1)

作为指南switch优于if-else语句,因为它更具可读性。

如果我们在初始需求分析期间或稍后发现需要更改的情况下发现有新的案例被添加,则应识别变更轴,并且应避免这两者(如果是其他和交换机)。

在这种情况下,我们需要尊重open close principle。 Swich案例陈述不仅不好,因为ocp是有效的,但也容易出错,如果我们错过在某个地方添加新案例,那么可能会出现问题。

在这种情况下,案例必须通过抽象来处理(尝试通过抽象可以改变的东西来保护自己免受变化)。

您可以为这种情况定义(抽象)父类,并且每个案例都可以映射到单独的子类。 假设我们有一个案例x:// contents;。内容可以放在我们可以在父类中使用的抽象方法的实现中。如果我们添加了一个新案例,我们可以轻松定义一个新类并提供实现。客户端代码应仅依赖于抽象父类,并且可以在运行时注入具体类。