繁体   English   中英

在不使用许多 if else 语句的情况下编写代码

[英]Writing code without using many if else statements

这是我使用 if 和 else if 的代码逻辑,

Search search = new Search(); 
Request request = new Request()
Client client = new Client();

String typeA = data.getTypeA();  // data object passing as argument to method
String typeB = data.getTypeB();
String typeC = data.getTypeC();
String typeD = data.getTypeD();

if(typeA!=null) {
    search.setType("A");  
    search.setValue(typeA);  // Type A value   
    request.setSerach(search);  
    return client.invokeTypeA(request);
}
else if(typeB!=null){
    search.setType("B");  
    search.setValue(typeB);  // Type B value   
    request.setSerach(search);  
    return client.invokeTypeB(request); 
}
else if (typeC!=null){
      ... 
      ... 
    return client.invokeTypeC(request); 
}
else if(typeD!=null){
      ... 
      ... 
    return client.invokeTypeD(request); 
}

在这里,这段代码运行良好,但我只需要知道,不使用 if 和 else if 的任何其他方式来执行相同的功能。 Of-curse Switch 在那里,但我相信还有其他一些不错的方法可用。 如果我了解其他方法,至少我不期望确切的解决方案,我将深入研究并提高我的编码技能。 请我可以为我的功能获得一些糟糕的替代方法。

根据我在您的代码中的理解,您要求配置来设置您的搜索。

因此,在面向 Object 的开发风格中,您应该避免提出以下问题:

if (type is X) 
   ...
else if (type is Y) 
   ...
else if (type is Z)

这被认为是糟糕的 OO 设计。

OO方式是使用动态调度。 因此,您将拥有一个由 UI 配置的过滤器class,然后您将使其对搜索应用更改,如下所示:

filter.applyOn(search);
request.setSearch(search);
client.invoke(search);

然后像这样添加一个 Enum 或 Class :

DataType type = data.getType();

// where
abstract class DataType {
    // lambda
    public static DataType instanceFor(....) {
        return (search) ->
            {  search.setType(this.getName()); .... };   
    }

    public abstract void applyOn(Search search);
}

但是,如果这是不可能的,并且您必须使用类似 if 的语句,请考虑使用 Map 代替,如下所示:

map.put("valueA", this::methodA);
map.put("valueB", this::methodB);
map.put("valueC", this::methodC);

map.computeIfAbsent(data.getType(), (s,r,c) -> {}).apply(search,request,client);

这将是另一种避免 if 的方法。

没有“直接”的答案; 如果有的话,那意味着有两种方法可以做完全相同的事情,那将是糟糕的语言设计,所以这是一件好事。

当然,还有替代方案,但它们不是“插入”——它们需要更改 if/elseif 块周围的代码。

例如,假设 data 有.getTypeInfos() ,它返回TypeInfo对象。 TypeInfo 类似于:

@Value
public class TypeInfo {
    String resultText;
    SearchType type;
}

public enum SearchType {
    A, B, C, D;
}

注意: TypeInfo是一个可怕的名字。 但是,您的代码片段已被删除所有上下文信息。

那么你可以这样做:

for (TypeInfo info : data.getTypeInfos()) {
    if (info.getResultText() == null) continue;
    search.setType(info.getType());
    search.setValue(info.getResultText());
    request.setSearch(search);
    return client.invoke(request);
}

Java 高度标称和结构化; 一旦您决定创建一个名为getTypeA的方法和一个名为getTypeB的方法,就是这样 - 现在很难尝试编写将要调用的方法的名称概念作为参数的代码。 所以,不要那样做。 如果getTypeA()getTypeB()的结构相似,请创建一个名为getType(Type t)或诸如此类的方法。

如果您编写了一组名为typeAtypeB等的方法,是的,您最终会得到大量代码和大量长 if/elseif 链。 这就是为什么您通常不应该这样做的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM