Mehrschichtige, verschachtelte Problemoptimierung von bedingten Anweisungen hilft Ihnen, Code zu schreiben, der Kollegen nicht beschweren lässt

Der Artikel wurde zuerst auf dem öffentlichen Konto (Moon with Feiyu) veröffentlicht und dann mit der persönlichen Website synchronisiert: xiaoflyfish.cn/

Wenn es dir gefällt, werde ich in Zukunft weitere Artikelserien teilen!

Ich habe das Gefühl, dass ich etwas gewonnen habe, ich hoffe, Ihnen helfen zu können, es zu mögen, weiterzuleiten, danke, danke

  • WeChat-Suche: Flying Fish on the Moon, Freunde finden, der Interview-Austauschgruppe beitreten

Antworten Sie auf 666 im Hintergrund des offiziellen Kontos, Sie können kostenlose E-Books erhalten

Vorwort

Im „Alibaba Development Manual“ gibt es folgende Vorschläge und Lösungen zu mehrfachen if-else-Verzweigungen und Verschachtelungen:

Bildbeschreibung hier einfügen

Daher stellt dieser Artikel mehrere Optimierungsschemata vor, um Ihnen einige Ideen zu geben

Fall

Folgendes ist typischer Code, auf den Sie in der Entwicklung stoßen könnten:

public String getTweetTitle(int type) {
        String result;
        if (type == 0) {
            throw new IllegalArgumentException("参数有误");
        }

        //长贴-->获得长帖标题
        if (isPaperTweet(type)) {
            result = getPaperTweetTitle();
        } else {
            // 视频贴-->获得视频贴标题
            if (isVideoTweet(type)) {
                result = getVideoTitle();
            } else {
                result = getDefaultTitle();
            }
        }
        return result;
    }
复制代码

Wie können wir in diesem Fall die Probleme mit mehreren Zweigen und der Verschachtelung von Zweigen ersetzen? Wie lässt sich der Code einfacher warten und erweitern?

Sie können selbst darüber nachdenken ...  

Bildbeschreibung hier einfügen

Im Folgenden stelle ich einige Methoden vor

Wachaussage

Das Buch "Refactoring - Improving the Design of Existing Code" hat die folgende Beschreibung:

Wenn eine Bedingung extrem selten ist, sollte sie selbst überprüft und von der Funktion zurückgegeben werden, sobald die Bedingung wahr ist. Solche getrennten Prüfungen werden oft als „Wächtererklärungen“ bezeichnet.

Bildbeschreibung hier einfügen

Bildbeschreibung hier einfügen

Mithilfe von Guard-Anweisungen können wir das obige Beispiel wie folgt ändern:

public String getTweetTitle(int type) {
        // 条件检查
        if (type == 0) {
            throw new IllegalArgumentException("参数有误");
        }

        // 长贴-->获得长帖标题
        if (isPaperTweet(type)) {
            return getPaperTweetTitle();
        }

        // 视频贴-->获得视频贴标题
        if (isVideoTweet(type)) {
            return getVideoTitle();
        }

        return getDefaultTitle();
    }
复制代码

Überprüfen Sie zuerst die Bedingung und konvertieren Sie dann die if-else-Logik in das entsprechende Guard-Statement-Format.

aufzählen

„Effective Java Chinese Edition“ in Artikel 30: Aufzählung anstelle von int-Konstanten verwenden Abschnitt hat eine Beschreibung: Aufzählung verwenden, um Verzweigungsanweisung zu ersetzen, obwohl es die Einfachheit verliert, ist es sicherer und flexibler.

Durch das Definieren einer abstrakten Funktion innerhalb der Aufzählung überschreibt jede Aufzählungskonstante die Funktion, sodass das erwartete Berechnungsergebnis erhalten werden kann, indem die Funktion aufgerufen wird, nachdem die Aufzählungskonstante gemäß dem Aufzählungswert erhalten wurde.

Der Beispielcode lautet wie folgt:

public enum TweetStrategyEnum {

    PAPER(1) {
        @Override
        double getTitle() {
            return "长贴标题";
        }
    },
    VIDEO_TWEET(2) {
        @Override
        double getTitle() {
            return "视频贴标题";
        }
    },
    DEFAULT_TWEET(3) {
        @Override
        double getTitle() {
            return "短贴标题";
        }
    };

    private final int type;

    TweetStrategyEnum(int type) {
        this.type = type;
    }

    abstract String getTitle();

    public static TweetStrategyEnum valueOf(int type) {
        for (TweetStrategyEnum tweetStrategyEnum : TweetStrategyEnum.values()) {
            if (tweetStrategyEnum.type == type) {
                return tweetStrategyEnum;
            }
        }
        return null;
    }
}
复制代码

Rufen Sie bei Verwendung das Aufzählungsobjekt gemäß dem Aufzählungswert ab und rufen Sie direkt die Strategie auf, die der Aufzählungskonstante entspricht:

public void getTitle() {
        TweetStrategyEnum tweetStrategyEnum = TweetStrategyEnum.valueOf(1);
        if(tweetStrategyEnum != null){
            System.out.println(tweetStrategyEnum.getTitle());
        }
    }
复制代码

Zustandsmodus

Im Kapitel „Zen der Entwurfsmuster“ heißt es:

Bildbeschreibung hier einfügen

Einer der Vorteile des Zustandsmusters ist "klare Struktur". Der Zustandsmodus verkörpert das Open-Closed-Prinzip und das Single-Responsibility-Prinzip und ist einfach zu erweitern und zu pflegen.

Die sogenannte klare Struktur soll die Verwendung zu vieler switch-case- oder if-else-Anweisungen vermeiden, die Komplexität des Programms vermeiden und die Wartbarkeit des Programms verbessern.

Der im Buch "Zen of Design Patterns" bereitgestellte Fall ist dem im Artikel angegebenen sehr ähnlich. Je nach aktuellem Stand werden unterschiedliche Verhaltensweisen ausgeführt. Wenn Sie interessiert sind, können Sie ihn nachschlagen.

Optimieren Sie auch den obigen Fallcode:

Definieren Sie eine Zustandsverhaltensschnittstelle

public interface TweetState {
    String getTitle();
}
复制代码

Definieren Sie mehrere konkrete Zustandsimplementierungen

public class VideoTweetState implements TweetState{
    @Override
    public String getTitle() {
        return "视频贴";
    }
}

public class PaperTweetState implements TweetState{
    @Override
    public String getTitle() {
        return "长贴标题";
    }
}

public class DefaultTweetState implements TweetState{
    @Override
    public String getTitle() {
        return "短贴标题";
    }
}
复制代码

Definieren Sie einen Client für die staatliche Verwendung

public class Client {

    private TweetState tweetState;

    public TweetState getTweetState() {
        return tweetState;
    }

    public void setTweetState(TweetState tweetState) {
        this.tweetState = tweetState;
    }

    public void getTitle() {
        tweetState.getTitle();
    }
}
复制代码

Äußere Verwendung

public static void main(String[] args) {
        Client client = new Client();
        client.setTweetState(new VideoTweetState());
        client.getTitle();
    }
复制代码

Strategie + Fabrikmuster

Zuerst abstrahieren wir jeden bedingten Logikcodeblock in eine öffentliche Schnittstelle, wir können den folgenden Code erhalten:

public interface ITweetService {
    String getTitle();
}
复制代码

Gemäß jeder logischen Bedingung definieren wir die entsprechende Strategieimplementierungsklasse, und der folgende Code kann erhalten werden:

public class PaperTweetServiceImpl implements ITweetService{
    @Override
    public String getTitle() {
        return "长贴标题";
    }
}

public class VideoTweetServiceImpl implements ITweetService{
    @Override
    public String getTitle() {
        return "视频贴标题";
    }
}
复制代码

Als Nächstes definieren wir die Policy-Factory-Klasse zur Verwaltung dieser Policy-Klassen wie folgt:

public class TweetServicesFactory {

    private static final Map<String, ITweetService> map = new HashMap<>();
    static {
        map.put("paperTweet", new PaperTweetServiceImpl());
        map.put("videoTweet", new VideoTweetServiceImpl());
    }
    public static ITweetService getTweetService(String type) {
        return map.get(type);
    }
}
public static void main(String[] args) {
        ITweetService tweetService = TweetServicesFactory.getITweetService(1);
        tweetService.getTitle();
    }
复制代码

Zusammenfassen

In diesem Artikel geht es hauptsächlich darum, wie man die if-else-Anweisungserweiterung und mehrstufige Verschachtelungsprobleme löst. Es kann durch Guard-Anweisung, Aufzählung, Zustandsmodus, Strategie + Fabrikmodus usw. gelöst werden. Wenn Sie eine bessere Lösung haben, können Sie mit mir kommunizieren

Ich hoffe, Sie können versuchen, diese Methoden in der tatsächlichen Entwicklung zu verwenden, um eleganteren Code zu schreiben.

endlich

Fühlen Sie sich wohl, denken Sie daran zu liken, weiterzuleiten, zu teilen, danke

WeChat-Suche: Flying Fish on the Moon, Freunde finden, der Interview-Austauschgruppe beitreten

Antworten Sie auf 666 im Hintergrund des offiziellen Kontos, Sie können kostenlose E-Books erhalten

Ich denke du magst

Origin juejin.im/post/7079251131020345351
Empfohlen
Rangfolge