7
votes

Motif de commande vs réflexion

J'ai le contrôleur qui exécute certaines commandes en fonction du nom de la commande, extrait de l'URL. Le point principal est de ne pas utiliser si et basculer des clauses. Comme je sache, il n'y a que de deux manières à faire - 1) Motif de commande 2) Réflexion.

//Command pattern
class Controller{
  private HashMap<String,Command> commands;
  public void executeCommand(String commandName){
    commands.get(commandName).execute();
  }
  ...
}

//reflection
class Controller{
  public void readCommand(){
    ....
  }
  public void executeCommand(String commandName){
    this.getClass().getMethod(commandName+"Command").invoke(this);
  }
  ...
}


2 commentaires

Que se passe-t-il si l'utilisateur entre exécutez ? Cela causera-t-il exécutéecommand pour essayer de vous appeler de manière récursive? Utilisation de la réflexion de cette manière, où vous utilisez une chaîne entrée par l'utilisateur pour déterminer le nom de la méthode à exécuter, regarde très dangereux. Pourrait aussi bien mettre un signe sur votre programme disant "hé, cybercriminels! De cette façon !!!"


@AJB Merci de votre commentaire. Je sais que c'est pourquoi nous utilisons URL mapper via XML (URL -> composant, commandement). J'ai écrit "tiré de l'URL" pour réussir l'idée.


3 Réponses :


4
votes
  1. La première façon est meilleure, utilisez des réflexions uniquement lorsque vous n'avez pas d'autres options.
  2. Dans une application, il devrait y avoir une approche pour résoudre un type de problème.
  3. Je pense que la première approche va bien. (beaucoup mieux que si / sinon bloque)

0 commentaires

0
votes

Je pense qu'il y a 2 différentes manières pour votre première approche. Chaque commande pourrait être une sous-classe de la commande abstrait de la classe. Ou chaque commande pourrait être une instance de la commande de classe. Cela dépend de la flexibilité qui est supposée être flexible et sont les paramètres et les valeurs de retour pour les commandes? Avec des sous-classes, cela ressemblerait à ceci (juste pour avoir l'idée): XXX

Ici mes réponses:

  1. Votre premier moyen est meilleur. Préfère toujours les motifs de conception sur Réflexion.
  2. Désolé, je ne comprends pas la question 2. Mais cela n'a pas de point d'interrogation de toute façon, je ne le sauve pas :)
  3. Vous voudrez peut-être regarder dans le modèle de conception de stratégie , où chaque commande pourrait même être faite de différentes parties de sous-commandes. Une autre idée serait le modèle de conception d'usine . Dans ce cas vous mettrait chaque commande dans une classe, puis utilisez le chargeur de classe pour Chargez la classe par nom.

1 commentaires

Merci pour votre réponse. Je pense que vous avez mal compris la question un peu. Le modèle de commande est sur la manière de sélectionner de manière dynamique la méthode nécessaire par chaîne. Par exemple, chaîne "AAA" - Méthode1 (), "BBB" - Méthode2 () sans utiliser si et commutateurs.



1
votes

Lequel est le meilleur?

Évidemment, le premier est meilleur. Même si vous avez cité que vous utilisez le modèle de commande, ce n'est pas complet de «commande». Modèle de commande aura la commande (abstrait), la commande concrete, le récepteur, l'invocataire et le client .

Regardez cette question:

Utilisation du modèle de conception de commande

Outre le commandement PATTEN, je voudrais mettre en évidence les avantages et les inconvénients de la réflexion.

pros:

  1. Manipulation Injection de dépendance
  2. Développer des cadres de plug and play

    contre:

    1. Les appels de réflexion sont plus lents
    2. Vous pouvez enfreindre la sécurité et exploser l'application avec une mauvaise intention (par exemple, définir des variables privées d'une classe, qui est invisible à d'autres catégories)

      Regardez la question liée à la question de la réflexion:

      Qu'est-ce que la réflexion et pourquoi est-ce utile?

      est-il normal dans une application pour que les développeurs utilisent l'une des méthodes qu'ils souhaitent.

      Il est normal que les développeurs ont choisi la meilleure méthode pour résoudre un problème particulier.

      Y a-t-il d'autres moyens?

      Cela dépend du type de problème que vous allez aborder. Les modèles de conception fournissent des solutions aux problèmes récurrents.

      Toutes la solution ne peut pas être adaptée aux modèles de conception existants. Vous avez peut-être développé de nouveaux modèles pour résoudre votre problème.


0 commentaires