臭くて長いif-elseを消す

3934 ワード

背景
現在の職場の原因のため、プロジェクトはまだ09年に創立されたので、歴史の残した問題も比較的に多くて、開発の規範があまり完備していないことを加えて、プロジェクトの中には1つの方法が何百何千行に達して、if-elseは更に10数個連続して書いても疲れません.
強迫症としては本当に耐えられない反面,コードの可読性や拡張性が大幅に低下している.次の記事では、if-elseを最適化するいくつかの一般的なスキームについて、異なるシーンと組み合わせて説明します.
一、巧用三目演算子
このシーンはよくありますが、開発中にif-elseに出会ったとき、三目演算子で置き換えることができるのではないかと考えてみてください.もちろんいいです.さもないと、私は文章を書いて何をしますか.ハハハ.
//   
public static void before(boolean condition){
    int temp;
    if (condition) {
        temp = 1;![file](/img/bVcKKKx)
    } else{
        temp = 2;
    }
    System.out.println(temp);
}
//   
public static void after(boolean condition){
    int temp = condition ? 1 : 2;
    System.out.println(temp);
}

二、あなたが学んだ列挙を使う
列挙クラスを使用して、異なる分岐に対する論理判断を完了し、列挙によって論理条件を集中的に管理しやすく、メンテナンスもより適切である.コードは次のとおりです.
//   
public static void before(String code) {
    String msg = null;
    if ("00001".equals(code)) {
        msg = "        ";
    } else if ("00002".equals(code)) {
        msg = "      ";
    }
    System.out.println(msg);
    }
//   
public enum CacheEnums {
    CACHE_DATA_IS_NULL("00001", "        "),
    DATA_FORMATE_EXCEPTION("00002", "      ");
    private String code;
    private String msg;
​
    CacheEnums(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
​
    public String getCode() {
        return code;
    }
​
    public void setCode(String code) {
        this.code = code;
    }
​
    public String getMsg() {
        return msg;
    }
​
    public void setMsg(String msg) {
        this.msg = msg;
    }
​
    public static CacheEnums of(String code){
        for (CacheEnums temp : CacheEnums.values()) {
            if (temp.getCode().equals(code)) {
                return temp;
            }
        }
        return null;
    }
}

最適化されたコードは、msgを取得しようとすると、一言で終わり、if-elseを書く必要はありません.
//   
public static void after(String code) {
    String msg = CacheEnums.of(code).getCode();
    System.out.println(msg);
}

三、あなたが学んだelseを忘れる(合理的な分析の基礎の上で)
ビジネスロジックの開発過程では、パラメータの合法性を検証したり、ビジネスロジックに合致しているかどうかをチェックしたりする方法をよく書きます.条件に合わないとreturnや異常投げをします.一部の学生の書き方:
//   
public static int before(boolean condition1,boolean condition2) {
    if (!condition1){
        return 0;
    }else if (condition2){
        return 1;
    }else{
        return 99;
    }
}
//   
public static int after(boolean condition1,boolean condition2) {
    if (condition1){
        return 0;
    }
    if (condition2){
        return 1;
    }
    return 99;
}

四、策略モード
使用できる上戦略モードのシーンは相対的に特殊で、よくある例を挙げると、スーパーのレジシステムの決済モジュールには、ダブル10割引活動、満減活動、会員ポイント交換消費券など、多くの決済方法があります.彼らはすべて決済業務に属しているので、戦略モデルを通じて、異なる決済方式を設計して、解結合と拡張しやすい目的を達成することができます.次のコードは、私のプロジェクトで実際に開発した例で説明します.今回の改造点は、既存のリクエストを送信する方法にメッセージを他のプラットフォームに転送する機能を追加することです.今後、より多くのプラットフォームが増加する可能性があることを考慮して、ここでは戦略モデルを採用し、将来の機能拡張を便利にします.以下は、簡易ポリシー・モードです.
/**
 * Description:     
 */
public interface Route {
​
    //      
    void handler(Object object);
}
/**
 * Description:     
 */
public class RouteContext {
​
    //         
    private Route route;
​
    public RouteContext(Route route) {
        this.route = route;
        this.init();
    }
​
    //        handler  
    public void handler(Route route, Object object) {
        this.route = route;
        route.handler(object);
    }
​
    public void init() {
        //         
    }
}
/**
 * Description:   
 */
public class MQType implements Route{
    @Override
    public void handler(Object object) {
        //       
    }
}
/**
 * Description:   
 */
public class OtherType implements Route{
    @Override
    public void handler(Object object) {
        //       
    }
}

これにより、異なるビジネスロジックが異なる実装クラスに対応し、大きなコードを揉む必要がなくなり、各ルーティング方式が独立して維持され、拡張しやすくなり、呼び出し側も感知されません.
もっと多くの文章は微信でJavaスタックの公衆番号を検索してください!