解决气味
有時我們可能會在代碼庫中遇到一些巨大的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
總結
- 上一篇: 行政部备案是什么意思(行政部备案)
- 下一篇: 安卓短信铃声文件夹(安卓短信铃声)