有时候,代码中充斥着大量的if-else语句并不是让你的同事们完全理解的正确方式。
所以,无论你是初学者还是已经很擅长你的工作,都应该让你的代码更加复杂和可读。
你需要尝试的第一件事是在你的代码中去除if-else语句。以下是一些建议。
1: 立即返回
假设有以下的代码:
public boolean isValid(String condition) {
boolean result;
if (condition != null){
if (condition.equals("hi") {
result = true;
} else {
result = false;
}
} else {
result= false;
}
return result;
}
这种代码通常用于提前返回,删除了不必要的else。
public boolean isValid(String condition) {
if (condition == null) {
return false;
}
if (condition.equals("hi") {
return true
}
return false;
}
这种方法通常只适用于简单的结构,我们可以提前返回来消除一些不必要的if-else语句。
2: 枚举
比如以下代码:
public String getLabel(int status) {
String label;
if (1 == status) {
label = "Padding";
} else if (2 == status) {
label = "Paid";
} else if (3 == status) {
label = "Success";
} else if (4 == status) {
label = "Failed";
}
return label;
}
也许你可以说,没有人写这样的代码。但实际上,这种写法是相当常见的。每个公司都有这样的代码
这种代码用枚举就能解决:
@Getter
@AllArgsConstructor
public enum StatusLabelEnum {
Padding(1, "Padding"),
Paid(2, "Paid"),
Success(3, "Success"),
Failed(4, "Failed"),
;
private int status;
private String label;
public static String getLabelByStatus(int status) {
for (StatusLabelEnum labelEnum : StatusLabelEnum.values()) {
if (labelEnum.getStatus() == status) {
return labelEnum.getLabel();
}
}
return "Unknown";
}
}
通过这种枚举,上述代码可以直接优化为一行代码:
public String getLabel(int status) {
return StatusLabelEnum.getLabelByStatus(status);
}
当然正常的项目不是这么简单的k-v键值对的,还有更复杂的逻辑,如果返回值是固定的,枚举也是一个简单的解决方案。
3: Optional 来解决if判断
我相信你们肯定有项目,在这些项目中有一个非空的判断,如果为空,则抛出异常或返回值。:
public int getOrderStatus(UUID id) {
Order order = getOrderById(id);
if (order == null) {
return 1;
} else {
return order.getOrderStatus();
}
}
我们可以使用Optional来非常优雅地解决它:
public int getOrderStatus(UUID id) {
Order order = getOrderById(id);
return Optional.ofNullable(order).map(Order::getOrderStatus).orElse(1);
}
4: 数据表驱动
表驱动方法是一种允许您在不使用过多的if-else语句的情况下,在表格中查找信息的方法。
如有以下代码:
if ("code1".equals(action)) {
doAction1();
} else if ("code2".equals(action)) {
doAction2();
} else if ("code3".equals(action)) {
doAction3();
} else if ("code4".equals(action)) {
doAction4();
} else if ("code5".equals(action)) {
doAction5();
}
优化代码:
//Definition
Map<String, Function<?> action> actionMap = new HashMap<>();
action.put("code1",() -> {doAction1()});
action.put("code2",() -> {doAction2()});
action.put("code3",() -> {doAction3()});
action.put("code4",() -> {doAction4()});
action.put("code5",() -> {doAction5()});
//use case
actionMap.get(action).apply();
这并不是一种很好的实现表驱动方法的方式,因为代码可能会显得非常臃肿
多实现类的方法优化:
//1. Define interface
public interface ActionService {
void doAction();
}
//2. Define implementations
public class ActionService1 implements ActionService{
public void doAction() {
//do something
}
}
//3. add to table
Map<String, ActionService> actionMap = new HashMap<>();
action.put("code1",new ActionService1());
action.put("code2",new ActionService2());
action.put("code3",new ActionService3());
action.put("code4",new ActionService4());
action.put("code5",new ActionService5());
//4. use it
actionMap.get(action).doAction();