[英]considering if, else if, else statements when writing code (java)
[英]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)
或诸如此类的方法。
如果您编写了一组名为typeA
、 typeB
等的方法,是的,您最终会得到大量代码和大量长 if/elseif 链。 这就是为什么您通常不应该这样做的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.