Pergunta

Eu estou usando o Mediator para facilitar o teste de unidade de GUI objetos.

código psudo Exemplo:

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
  }

}

Isso é bom porque eu posso agora teste de unidade que acontece quando SomeButton é pressionado sem ter que criar uma janela.

A minha preocupação é que tomei um método que era privado e tornou pública para qualquer um que faz um mediador para chamada. tempos passados ??Eu tenho feito isso não me incomoda porque eu não tinha muitos métodos que eu tinha que fazer público.

Atualmente, estou refatoração uma classe muito grande para usar esse padrão e eu estou querendo saber se existe alguma maneira eu posso controlar a visibilidade de quem pode fazer uma MyMediator ou quais classes alguns dos métodos são públicos para. (Isto pode não ser possível ou mesmo necessário, mas eu pensei que eu ia perguntar.)

(estou usando C # 3.0 com .NET 3.5 SP1)

Foi útil?

Solução

O ponto é que você gostaria que a interface pública de uma classe para mostrar 'API' público que de classe, de modo a fazer métodos privados público você está fazendo a classe mais confuso e menos 'clean'?

Algumas coisas que você pode fazer: 1) pensar com o que realmente é a 'face pública' de seu mediador (ou objeto de classe humilde) e felizmente fazer esses métodos público. Mesmo que eles são utilizados apenas dentro do conjunto - não faz parte do rosto público da montagem - isso é bom porque aviso de que sua classe mediador em si não é declarado público. Assim, mesmo os seus métodos públicos ainda são internos ao conjunto.

2) Você pode falsificar os privates usando interno para privado (e, em seguida, definir o atributo InternalsVisibleTo da montagem se suas classes de teste estão em um conjunto separado).

3) Tome a abordagem 'caixa preta' para o teste de unidade pelo qual, em princípio, você nunca precisa testar os privates porque eles fazer o teste através do seu uso quando chamado a partir dos métodos públicos.

Outras dicas

Eu acho que não importa .. Quem tem uma instância do mediador, que não seja o gui? Se alguém faz, é que vai chamar o método? Se isso acontecer, que importa? Será que vai ser difícil de aviso, diagnosticar e corrigir o bug?

Eu acho que você pode conseguir o que você está procurando com eventos no entanto:

por exemplo.

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

}

Não tenho certeza c #, mas em Java você pode declarar algo como o acesso de nível de pacote (em java omitindo o especificador de acesso). O que eu faço é criar uma hierarquia de teste separado que é paralela a minha estrutura de pacotes, de modo a classe de teste com.a.b.c.MyClass, eu vou ter uma classe de teste com.a.b.c.MyClassTest, que pode, então, acessar legalmente os métodos pacote de acesso em MyClass.

Eu não tanto com a idéia de fazer tudo o público não só por causa de problemas de acesso, mas porque tumultua a interface - Eu prefiro a interface pública do expresso classe o ele faz, não como ele faz isso, o que é muitas vezes onde eu acabar se eu expor métodos que eu prefiro ser privado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top