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.
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
}
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.
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.
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 "). NewInstance ()`
von Java 9 veraltet.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