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:
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 ...
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.
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:
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