[JAVA] Wichtiges Entwurfsmuster zur Verbesserung der Wartbarkeit

Einführung

Hallo. Es ist Kecho. Haben Sie Code erstellt, der nicht einfach zu warten ist? Hier ist der Code, auf den ich bereits hingewiesen und den ich verbessert habe.

Vor der Verbesserung

Code

public class Main {
	public static void main(String[] args) throws Exception {
		if (args[0].equals(ExecPattern.A.toString())) {
			exeA(args[1]);
		} else if (args[0].equals(ExecPattern.B.toString())) {
			exeB(args[1]);
		} else {
			throw new Exception("illigal request parameter");
		}
	}

	private static void exeA(String input) {
		// something
	}

	private static void exeB(String input) {
		// something
	}
}
public enum ExecPattern {
	A, B
}

Inhalt

Der Prozess wird durch die IF-Anweisung unter Verwendung des ersten zum Zeitpunkt der Ausführung übergebenen Arguments verzweigt. Eigentlich habe ich eine Logikklasse vorbereitet und mich für den Logikteil entschieden.

Was ist los

In diesem Fall muss eine neue IF-Anweisung hinzugefügt werden, wenn ein neues Ausführungsmuster C hinzugefügt wird. Es ist weniger wartbar und häufige Aktualisierungen der Controller-Klasse sind nicht sehr wünschenswert. Im Idealfall sollten zusätzliche Änderungen minimiert werden.

Nach der Verbesserung

Code

abstract class ExecLogic {
	abstract void execute(String args);
}

Eine abstrakte Klasse, die von der Logic-Klasse geerbt wurde. In diesem Fall erben A-Klasse und B-Klasse.

public class A extends ExecLogic {
	@Override
	void execute(String args) {
		// something
	}
}
public class B extends ExecLogic {
	@Override
	void execute(String args) {
		// something
	}
}

Die Logik wird in den Klassen A und B beschrieben.

public class Main {
	public static void main(String[] args) throws Exception {
		ExecLogic logic = (ExecLogic) Class.forName(args[0]).getDeclaredConstructor().newInstance(); //※1
		logic.execute(args[1]);
	}
}

In der Hauptklasse werden Instanzen der Klassen A und B aus den Laufzeitargumenten erstellt und die Verarbeitung ausgeführt.

Class.forName("className").getDeclaredConstructor().newInstance()Lassen Sie uns verwenden.


 Referenz: https://qiita.com/deaf_tadashi/items/3c3118e660861fb43434

## Was hat sich verbessert
 Erwägen Sie, tatsächlich eine C-Klasse hinzuzufügen.
 Sie müssen lediglich eine C-Klasse hinzufügen und die Logik darin schreiben.
 Für die Controller-Klasse ist keine Änderung erforderlich.
 Wir haben jetzt ein Minimum an Änderungen beim Hinzufügen erreicht.

# Bonus
 In Wirklichkeit müssen Sie die Laufzeitargumente validieren.
 Daher muss vermieden werden, dass die Anzahl der Korrekturen erhöht wird.
 Lassen Sie es uns wie folgt implementieren.

```java
	private static boolean validate(String[] args) {
		boolean res = false;
		for (ExecPattern execPattern : ExecPattern.values()) {
			if (execPattern.toString().equals(args[0])) {
				res = true;
			}
		}
		return res;
	}

Recommended Posts

Wichtiges Entwurfsmuster zur Verbesserung der Wartbarkeit
Einführung in Entwurfsmuster (Einführung)
Einführung in Entwurfsmuster (Builder)
Einführung in Entwurfsmuster (Composite)
Einführung in Designmuster (Fliegengewicht)
Einführung in Entwurfsmuster Prototyp
Einführung in Entwurfsmuster (Iterator)
Einführung in Entwurfsmuster (Strategie)
Einführung in Entwurfsmuster (Factory-Methode)
Einführung in Design Patterns (Abstract Factory)
Verschiedene Designmuster
Java-Entwurfsmuster
Studieren Sie GoF-Entwurfsmuster
Warum Designmuster benötigt werden
[Java] Zusammenfassung der Entwurfsmuster
Entwerfen Sie ein Muster, um es mit dem Swift-Iterator-Muster zu versuchen, das Array und Dictionary unterstützt
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fabrikmuster
Ich las "7 Entwurfsmuster zum Refaktorieren von MVC-Komponenten in Schienen" (Schreiben)