有时我们可能会在代码库中遇到一些巨大的if语句。 这些语句必须维护并一次又一次地更改相同的代码块。 在if语句检查变量是否属于某个值范围内的情况下,这也是常见的。
假设您有一个枚举
public enum FoodType {FRUIT,VEGETABLES,RED_MEAT,WHITE_MEAT,FISH,DIARY,CERIAL
}
并且您有一个功能可以提出一些建议
public String recommend(FoodType foodType) {if(foodType==FoodType.FISH||foodType==FoodType.RED_MEAT||foodType==FoodType.WHITE_MEAT) {//execute a procedure} else if(foodType==FoodType.FRUIT||foodType==FoodType.VEGETABLES) {//execute a procedure} else {//execute a procedure}}
如您所见,现在已做出决定。 该决定与碰巧属于特定人群的某些类型的食物有关。
鱼,红肉和白肉对那些偏爱蛋白质的用户有益,而水果和蔬菜更适合以纤维为基础的饮食。
在将来的情况下,可能会增加该枚举,并添加更多的食物类型。 如果代码块必须更改。 同样,如果在其他文件中使用了这种复杂的if语句,则必须更改每个文件。 不仅您将拥有巨大的if块,而且还必须在每个文件上维护一个块,这可能容易出错。
为了避免这种情况,您可以将if语句的内容更改为一个函数。
package com.gkatzioura;import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;import static com.gkatzioura.FoodType.*;public class DietFilter {private static final Set FOODS_WITH_PROTEIN = Collections.unmodifiableSet(new HashSet(Arrays.asList(FISH,RED_MEAT,WHITE_MEAT)));private static final Set FOODS_WITH_FIBER = Collections.unmodifiableSet(new HashSet(Arrays.asList(FRUIT,VEGETABLES)));public static boolean proteinBased(FoodType foodType) {return FOODS_WITH_PROTEIN.contains(foodType);}public static boolean fiberBased(FoodType foodType) {return FOODS_WITH_FIBER.contains(foodType);}}
因此,我们没有在if语句中添加每种食物类型的案例,而是创建了一个函数来检查给定的参数是否属于特定组。
因此,您的if语句将变为此。
public String recommend(FoodType foodType) {if(DietFilter.proteinBased(foodType)) {//execute a procedure} else if(DietFilter.fiberBased(foodType)) {//execute a procedure} else {//execute a procedure}}
如果将更多食物类型添加到枚举中,则开发人员将只需更改集合的结构并添加额外的食物类型。
这将比更改代码的多个部分容易得多,并且可读性更高。
翻译自: https://www.javacodegeeks.com/2018/07/fixing-if-smell.html