if...else優化篇(一)
- 前言
- 一、為什么要優化if...else代碼?
- 二、案例分析
- 1.場景一
- 1.1上面代碼,提供3種解決思路,
- 1.1.1 使用多型實作優化
- 1.1.2 使用反射實作優化
- 1.1.3 使用列舉實作優化
- 2.場景二
- 上面代碼,利用陣列來優化,
- 3.場景三
- 3.場景四
- 總結
- 優化存在的誤區
前言
你的代碼中是否存在著大量的if/else,無從下手呢?在實際專案開發中,不是一成不變的,軟體的更新,維護,修改需求,都需要代碼有良好的可拓展性,所以軟體系統的可拓展性是十分的重要的,然而過多的if…else,會大大的降低代碼的可拓展性,
提示:該偏博文從多個案例講解如何優化if/else,來提升可拓展性,降低耦合,
一、為什么要優化if…else代碼?
實際專案開發中,軟體的需求不是一成不變的,軟體的更新,維護,都需要代碼有良好的可拓展性,所以軟體系統的可拓展性是十分的重要的,然而過多的if…else,會大大的降低代碼的可拓展性,
二、案例分析
1.場景一
- 需求:根據不同的值來判定,不同的模式
代碼如下(示例):
//待優化
public void StrategyCase(String condition){
//判斷空值
if(condition == null)
return;
if(condition.equals("FlightMode")){
//飛行模式
}else if(condition.equals("PowerSavingMode")){
//省電模式
}else if(condition.equals("SuperPowerSavingMode")){
//超級省電模式
}
/*.......{
等等模式
}*/
}
1.1上面代碼,提供3種解決思路,
在設計模式中,有講到,將會變化部分拿出來封裝,降低代碼的耦合和可拓展性,
1.1.1 使用多型實作優化
//介面
public interface StrategyMode {
void run();
}
//實作介面【創建一個PowerSavingMode類】
public class FlightMode implements StrategyMode{
@Override
public void run() {
//This is flight mode.
System.out.println("This is flight mode.");
}
}
//實作介面【創建一個PowerSavingMode類】
public class PowerSavingMode implements StrategyMode{
@Override
public void run() {
//This is power saving mode.
System.out.println("This is power saving mode.");
}
}
//實作介面【創建一個SuperPowerSavingMode類】
public class SuperPowerSavingMode implements StrategyMode{
@Override
public void run() {
//This is super power saving mode.
System.out.println("This is super power saving mode.");
}
}
import java.util.HashMap;
import java.util.Map;
public class StrategyFather {
static Map<String,StrategyMode> map = new HashMap<>();
public void addMode(String str, StrategyMode mode) {
map.put(str, mode);
}
}
//測驗類
public class Test extends StrategyFather{
//用于存盤對應的模式
public static void main(String[] args) {
Test test = new Test();
//測驗
test.StrategyCase("FlightMode");
test.StrategyCase("PowerSavingMode");
test.StrategyCase("SuperPowerSavingMode");
}
public Test() {
//添加模式
addMode("FlightMode", new FlightMode());
addMode("PowerSavingMode", new PowerSavingMode());
addMode("SuperPowerSavingMode", new SuperPowerSavingMode());
}
public void StrategyCase(String condition){
StrategyMode mode = map.get(condition);
mode.run();
}
}
實際上,呼叫者,只需要知道StrategyCase里面的兩句代碼就行了,實作細節都已經封裝了起來,
該優化的弊端是需要通過Map來添加對應的模式,根據鍵值來查找對應的模式,
1.1.2 使用反射實作優化
- 思路:該案例傳入的就是字串,那么只要模式字串的名字與方法名字對應那么就可以通過字串來找到對應的方法,并且呼叫就好了,
//存盤模式行為的類
public class ModeBehavior {
//飛行模式
public void FlightMode() {
System.out.println("This is flight mode.");
}
//省電模式
public void PowerSavingMode() {
System.out.println("This is power saving mode.");
}
//超級省電模式
public void SuperPowerSavingMode() {
System.out.println("This is super power saving mode.");
}
}
//測驗類
import java.lang.reflect.Method;
public class Test{
public static void main(String[] args) {
new Test();
}
public Test(){
ModeBehavior modeBehavior = new ModeBehavior();
//只需要傳入對應的模式名,就能找到對應的模式應該執行的方法,
StrategyCase("SuperPowerSavingMode",modeBehavior);
StrategyCase("FlightMode",modeBehavior);
StrategyCase("PowerSavingMode",modeBehavior);
}
//這里實作反射
public void StrategyCase(String str,Object obj) {
Class modeClazz = obj.getClass();
try {
Method method = modeClazz.getDeclaredMethod(str);
method.invoke(obj);
} catch (Exception e) {
//不存在該方法
System.out.println("該模式不存在");
}
}
}
1.1.3 使用列舉實作優化
- 思路:列舉也可以存盤方法,根據名稱找到對應的方法,
public enum EnumRealization {
FlightMode{
public void run() {
System.out.println("This is flight mode.");
}
},
PowerSavingMode{
public void run() {
System.out.println("This is power saving mode.");
}
},
SuperPowerSavingMode{
public void run() {
System.out.println("This is super power saving mode.");
}
};
public abstract void run();
}
//測驗類
public class Test{
public static void main(String[] args) {
Test enumTest = new Test();
enumTest.StrategyCase("FlightMode");
enumTest.StrategyCase("PowerSavingMode");
}
public void StrategyCase(String condition) {
EnumRealization enumRealization = EnumRealization.valueOf(condition);
enumRealization.run();
}
}
2.場景二
- 需求:給定一個月份,回傳該月有多少天,資料以2021年作為測驗年份,
- 思路:利用陣列存盤值,通過索引查找,
代碼如下(示例):
/*
獲取月份天數
待優化
*/
public int getMonthDays(int number) {
if(number == 1) return 31;
if(number == 2) return 28;
if(number == 3) return 31;
if(number == 4) return 30;
if(number == 5) return 30;
if(number == 6) return 30;
if(number == 7) return 30;
if(number == 8) return 30;
if(number == 9) return 30;
if(number == 10) return 30;
if(number == 11) return 30;
if(number == 12) return 31;
//不存在
return -1;
}
上面代碼,利用陣列來優化,
/*獲取月份天數(優化)*/
int[] mMonthDay = {31,28,31,30,31,30,31,31,30,31,30,31};
public int getMonthDays(int number) {
//越界判定(一般不在這判定)
if(number < 1 || number > 12) return -1;
return mMonthDay[--number];
}
3.場景三
- 思路:利用條件取反,邏輯表達能更加的清晰,
代碼如下(示例):
//待優化
if(status){
//do something
}else{
return "value";
}
//利用條件取反,邏輯表達能更加的清晰,
if(!status){
return "value";
}
//do something
3.場景四
- 需求:有時候需要通過boolean來確定狀態,如果為真,變為false,如果為假變為true
- 思路:取反
代碼如下(示例):
//待優化
boolean bo = true;
if(!bo) {
bo = true;
}else {
bo = false;
}
//優化后
boolean bo = true;
bo = !bo;
總結
一般建議if最好不要超過三層,代碼中存在過多的if…else會減低代碼的可讀性,后期的維護難度也會加大,
優化存在的誤區
不要得了優化病,如果是為了單純的減少if…else的層數去優化,沒有任何的意義,還增加了代碼的復雜程度,對自己有利的事情,才值得我們去動腦子去優化,不是嗎!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265899.html
標籤:java
上一篇:服務注冊與發現--eureka
