我想用一个例子来解释我的设计问题。
假设我有 5 个 parent [1,2,3,4,5]。每个 parent 都有 n 个 child 。 children 就像 [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:
.......
}
在这里,父类型是固定的。子类型是动态的。我正在进入 map 。对于每张 map ,我都必须检查 child 是否存在。如果是这样,我必须根据子类型采取行动。
哪种设计会更好?以上设计不适合我。
有什么想法吗?
编辑:
parentHolder 是一个对象,它具有获取父类型和子类型的方法。 例如:
{
parentType: '1',
children:{
"a":"fileOne.xml",
"c" : "fileTwo.gz"
}
}
收到此 json 后,我将子值存储在 Map
中,然后获取 parentType 并传递给切换条件。
在 switch 案例中,我必须为 child 应用逻辑。上面的例子有两个 child 。在其他一些情况下,parentType 1 将有 a、b、c 作为 child 。所以它应该是通用的。
最佳答案
作为指南,switch
比 if-else
语句更好,因为它更具可读性。
如果我们在初始需求分析期间或之后随着需求变更的到来发现添加了新案例,则应确定变更轴并避免这两种情况(if else 和 switch)。
在这种情况下,我们需要遵守开闭原则
。 Swich case 语句不仅不好,因为 ocp 被破坏了,而且容易出错,如果我们错过在某个地方添加新的 case,那么可能会出现问题。
在这种情况下,必须通过抽象来处理案例(尝试通过抽象可以更改的内容来保护自己免受更改)。
您可以为此类案例定义一个(抽象的)父类,并且每个案例都可以映射到一个单独的子类。 假设我们有一个案例 x://内容;。内容可以放在我们可以在父类中拥有的抽象方法的实现中。如果我们添加了一个新案例,我们可以轻松定义一个新类并提供实现。客户端代码应仅依赖于抽象父类,并且可以在运行时注入(inject)具体类。
关于java - 带有 switch 的 case 语句 - case 或 if-else - 最佳设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42105711/