[JAVA] Modèle de conception important pour améliorer la maintenabilité

introduction

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

Avant amélioration

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
}

Contenu

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.

Qu'est-ce qui ne va pas

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.

Après amélioration

code

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").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;
	}

Recommended Posts

Modèle de conception important pour améliorer la maintenabilité
Introduction aux modèles de conception (introduction)
Introduction aux modèles de conception (Builder)
Introduction aux modèles de conception (composite)
Introduction aux modèles de conception (poids mouche)
Introduction au prototype de modèles de conception
Introduction aux modèles de conception (Iterator)
Introduction aux modèles de conception (stratégie)
Introduction aux modèles de conception (méthode d'usine)
Introduction aux modèles de conception (Abstract Factory)
Divers modèles de conception
Modèles de conception Java
Étudier les modèles de conception du GoF
Pourquoi vous avez besoin d'un modèle de conception
[Java] Résumé des modèles de conception
Modèle de conception à essayer avec le modèle Swift-Iterator qui prend en charge Array et Dictionary
Modèles de conception à utiliser avec les bibliothèques Java fréquemment utilisées - Modèle d'usine
J'ai lu "7 modèles de conception pour refactoriser les composants MVC dans les rails" (écriture)