Une structure enum déclarée dans sa propre classe est une variable membre de la classe de logique métier. Cette énumération représente essentiellement l'état de cette autre classe.Refactoring et suppression des instructions de requête lors d'un encerclement sur une structure enum
Bien que j'ai réexaminé le problème plusieurs fois, le remplacement ou l'élimination de ces déclarations de cas s'avère très frustrant pour moi.
Plusieurs méthodes de logique métier parcourent simplement l'énumération et modifient l'état de cette classe en affectant une autre valeur de la même énumération et d'autres propriétés.
public enum MyEnum{ A,B,C,D }
La classe logique métier a cette ENUM en tant que membre:
public class BusinessLogic {
private MyEnum CurrentSelection;
private int propertyX;
private int propertyY;
public void operation1(){
switch(CurrentSelection){
case A: {alter propertyX this way; break;}
case B: {alter propertyY this way; break;}
case C: {alter propertyX that way; break;}
case D: {alter propertyY that way; break;}
}
}
public void operation2(){
switch(CurrentSelection){
case A: {CurrentSelection=MyEnum.B; break;}
case B: {CurrentSelection=MyEnum.C; break;}
....etc
}
}
public void operation3(){
switch(CurrentSelection){
case A: {CurrentSelection=MyEnum.D; break;}
case B: {CurrentSelection=MyEnum.A; break;}
....etc
}
}
}
Une autre classe de client instancier la classe de logique métier, paraphant ses propriétés, puis en utilisant ses méthodes de fonctionnement. Ce que j'ai fait avec succès (avec l'aide de SO) encapsule les méthodes d'opération dans une structure de modèle de commande afin que je puisse appeler les opérations sans toutes les déclarations de cas. (here).
Je suppose que mon problème est de savoir comment encapsuler les instructions case dans ma classe de logique métier. Je soupçonne que j'aurais besoin de polymorphisme et des structures de données appropriées.
Les experts en refactoring suggèrent que chaque déclaration de cas soit une implémentation d'une interface commune. Mais si j'ai 3 méthodes d'itération sur une énumération de 4 membres, cela signifie que j'ai probablement besoin de 3 interfaces avec 4 implémentations chacune, ce qui me donne 12 classes (plus 3 interfaces). Ce ne serait pas une surcharge de classe? La logique fonctionne correctement avec ces 3 méthodes telles qu'elles sont, mais le problème sont les instructions de commutation/cas répétées.
Existe-t-il un moyen de refactoriser ces instructions de commutation, mais éviter une myriade d'autres classes dans le nom du polymorphisme? Serait-il possible de factoriser la partie itérative sur l'enum? Ou juste les cas (où la logique est) devraient être refactorisés?
En premier lieu j'ai enlevé ces méthodes complètement que je les avoir à mettre en œuvre une interface simple:
public interface Command {
void execute();
}
Ainsi, sa méthode de fonctionnement mis en œuvre l'interface de commande:
public class Operation1 implements Command {
private void doOperation1(){
switch(CurrentSelection){
..all the cases here
}
}
public void execute() {
doOperation1();
}
}
Comme je l'ai voyez ça, ça va m'acheter un cours de logique d'entreprise plus propre, mais la piste des cas de switch restera, non?
Merci pour la réponse. Oui, mais ces implémentations individuelles ne porteraient-elles pas toujours les instructions switch/case? Je nettoierais la logique métier et les classes client, mais les nouvelles classes implémentant chacune des 3 interfaces conserveraient les cas de commutation. Est-ce que mon raisonnement est correct, ou peut-être que cela ne vous ennuierait pas d'en dire un peu plus? – denchr
Vous pourriez avoir accès à la classe différente par l'énumération elle-même - ie l'enum implémente l'interface, ou quelque chose de similaire. vous n'avez donc pas à l'allumer du tout. Ceci est similaire au modèle de commande. – aperkins