Domanda

Sto utilizzando il modello mediatore per facilitare il test unitario degli oggetti della GUI.

pseudocodice Esempio:

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
  }

}

Questo è bello perché ora posso testare cosa succede quando si preme SomeButton senza dover creare una finestra.

La mia preoccupazione è che ho preso un metodo che era privato e l'ho reso pubblico affinché chiunque faccia un Mediatore possa chiamarlo.Le volte passate l'ho fatto e non mi ha disturbato perché non avevo molti metodi da rendere pubblici.

Attualmente sto effettuando il refactoring di una classe molto grande per utilizzare questo modello e mi chiedo se esiste un modo per controllare la visibilità di chi può creare un MyMediator o per quali classi alcuni metodi sono pubblici.(Questo potrebbe non essere possibile o addirittura necessario, ma ho pensato di chiedere.)

(Sto utilizzando C# 3.0 con .NET 3.5 SP1)

È stato utile?

Soluzione

Il punto è che vorresti che l'interfaccia pubblica di una classe mostrasse l'"API" pubblica di quella classe, quindi rendendo pubblici i metodi privati ​​stai rendendo la classe più confusa e meno "pulita"?

Alcune cose che puoi fare:1) pensa a quale sia effettivamente il "volto pubblico" della tua classe mediatore (o umile oggetto) e rendi felicemente pubblici questi metodi.Anche se vengono utilizzati solo all'interno dell'assemblea - non come parte del volto pubblico dell'assemblea - va bene perché tieni presente che la tua stessa classe mediatore non è dichiarata pubblica.Quindi anche i suoi metodi pubblici sono ancora interni all’assemblea.

2) È possibile confondere i privati ​​utilizzando internal per private (e quindi impostare l'attributo InternalsVisibleTo dell'assembly se le classi di test si trovano in un assembly separato).

3) Adottare l'approccio della "scatola nera" ai test unitari in base al quale in linea di principio non è mai necessario testare i privati ​​perché vengono testati tramite il loro utilizzo quando chiamati dai metodi pubblici.

Altri suggerimenti

Credo che non importa .. Chi ha un'istanza del mediatore, diverso dal gui? Se qualcuno lo fa, sta andando a chiamare il metodo? Se lo fa, cosa importa? Sarà difficile da notare, diagnosticare e risolvere il bug?

Penso che si può ottenere quello che state cercando con gli eventi però:

per es.

/* 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)
{

}

Non sei sicuro di C #, ma in Java è possibile dichiarare qualcosa come l'accesso a livello di pacchetto (in java omettendo lo specificatore di accesso). Quello che faccio è creare una gerarchia di prova separata che mette in parallelo la mia struttura del pacchetto, in modo da classe di test com.a.b.c.MyClass, avrò un com.a.b.c.MyClassTest classe di test, che possono quindi accedere legalmente ai metodi pacchetto di accesso in MyClass.

non mi così tanto come l'idea di fare tutto quello pubblico, non solo a causa di problemi di accesso, ma perché ingombra l'interfaccia - Preferirei l'interfaccia pubblica della classe espressa cosa lo fa, non è come lo fa, che è spesso dove finisco se espongo metodi preferirei essere privato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top