Bonjour. C'est Kecho. Avez-vous créé du code qui n'est pas facile à maintenir? Voici le code que j'ai souligné plus tôt et amélioré.
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
}
Le processus est branché par l'instruction IF en utilisant le premier argument passé au moment de l'exécution. En fait, j'ai préparé un cours de logique et je suis sorti pour la partie logique.
Dans ce cas, il est nécessaire d'ajouter une nouvelle instruction IF lorsqu'un nouveau modèle d'exécution C est ajouté. C'est moins maintenable et les mises à jour fréquentes de la classe de contrôleur ne sont pas très souhaitables. Idéalement, toute modification supplémentaire devrait être minimisée.
abstract class ExecLogic {
abstract void execute(String args);
}
Une classe abstraite héritée par la classe Logic. Dans ce cas, la classe A et la classe B héritent.
public class A extends ExecLogic {
@Override
void execute(String args) {
// something
}
}
public class B extends ExecLogic {
@Override
void execute(String args) {
// something
}
}
La logique est décrite dans les classes A et B.
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]);
}
}
Dans la classe Main, les instances de classe A et B sont créées à partir des arguments d'exécution et le traitement est exécuté.
Class.forName ("className"). NewInstance ()
est obsolète à partir de Java 9.Class.forName("className").getDeclaredConstructor().newInstance()Utilisons.
Référence: https://qiita.com/deaf_tadashi/items/3c3118e660861fb43434
## Ce qui s'est amélioré
Envisagez d'ajouter une classe C.
Tout ce que vous avez à faire est d'ajouter une classe C et d'écrire la logique à l'intérieur.
Aucune modification n'est requise pour la classe de contrôleur.
Nous avons maintenant réalisé un minimum de modifications lors de l'ajout.
# prime
En réalité, je pense que vous devrez valider les arguments d'exécution.
Par conséquent, il est nécessaire d'éviter d'augmenter le nombre de corrections.
Implémentons-le comme suit.
```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;
}