Question

J'utilise le modèle de médiateur pour faciliter les tests unitaires des objets de l'interface graphique.

code psudo Exemple:

Class MyGuiClass
{
  //...  Declare and initialize mediator to be a MyMediator
  private void On_SomeButtonPressed()
  {
     mediator.SomeButtonWasPressed();
  }
}

Class MyMeditator
{
  public void On_SomeButtonPressed()
  {
     //.. Do something now that the button was pressed
  }

}

Ceci est bien parce que je peux maintenant test unitaire ce qui se passe quand on appuie sur SomeButton sans avoir à créer une fenêtre.

Je crains que j'ai pris une méthode qui a été privé et l'a rendu public pour toute personne qui fait un médiateur pour appeler. PASSÉS Je l'ai fait cela ne me dérange pas parce que je n'ai pas eu beaucoup de méthodes que je devais rendre publics.

Je suis actuellement refactoring une très grande classe à utiliser ce modèle et je me demande s'il y a someway je peux contrôler la visibilité qui peut faire une MyMediator ou quelles classes certaines méthodes sont publiques pour. (Cela peut ne pas être possible, voire nécessaire, mais je pensais que je demanderais.)

(J'utilise C # 3.0 avec .NET 3.5 SP1)

Était-ce utile?

La solution

Le point est que vous souhaitez l'interface publique d'une classe pour montrer « API » du public de cette classe, donc à faire des méthodes privées publiques que vous faites la classe plus confuse et moins « propre »?

Quelques choses que vous pouvez faire: 1) réfléchir à ce qui est en fait la classe « visage public » de votre médiateur (ou un objet humble) et faire joyeusement les méthodes publiques. Même si elles ne sont utilisées dans l'assemblage - ne fait pas partie de la face publique de l'Assemblée - c'est bien parce avis que lui-même votre classe de médiateur n'est pas déclarée publique. Ainsi, même ses méthodes publiques sont toujours internes à l'assemblée.

2) Vous pouvez truquer les soldats à l'aide interne privé (et puis définissez l'attribut InternalsVisibleTo de l'assemblée si vos cours d'essai sont dans un ensemble séparé).

3) Prendre l'approche « boîte noire » pour les tests unitaires où, en principe, vous ne devez jamais tester les soldats parce qu'ils sont testés par leur utilisation en cas d'appel des méthodes publiques.

Autres conseils

Je pense que peu importe .. Qui a une instance du médiateur, autre que le IUG? Si quelqu'un, cela va appeler la méthode? Si elle le fait, est-il important? Sera-ce difficile à remarquer, diagnostiquer et corriger le bug?

Je pense que vous pouvez réaliser ce que vous cherchez des événements si:

par exemple.

/* in the gui class (view) */
public event EventHandler OnButtonClicked;

/* in the mediator */
public MyMediator(MyView view) 
{
    view.OnButtonClicked += HandleButtonClicked;
}

private void HandleButtonClicked(object sender, EventArgs e)
{

}

ne suis pas sûr c #, mais en Java vous pouvez déclarer quelque chose que l'accès au niveau du package (en java en omettant le prescripteur d'accès). Ce que je fais est de créer une hiérarchie de test distincte qui est parallèle à la structure de mon paquet, donc à la classe de test com.a.b.c.MyClass, je vais avoir une classe de test com.a.b.c.MyClassTest, qui peut alors accéder en toute légalité les méthodes paquet d'accès à MyClass.

Je ne tellement comme l'idée de faire tout public, non seulement en raison de problèmes d'accès, mais parce qu'elle encombre l'interface - je préfère l'interface publique de la classe express ce il ne, pas comment il le fait, ce qui est souvent là où je finis si j'expose les méthodes que je préfère être privé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top