MVP (Controlador de supervisão) A exibição atualiza o modelo?

8

Eu tenho lido sobre MVP, especificamente Supervisionando Controller. Uma coisa que estou tendo dificuldade em entender é como o View interage com o Modelo.

Entendi que o apresentador deveria atualizar o modelo e que o View lê do modelo. O Presenter também pode atualizar a exibição por meio de uma interface. O artigo de Martin Fowler sobre isso parece mostrar exatamente isso ( http://martinfowler.com/eaaDev/SupervisingPresenter.html ).

No entanto, outros artigos / blogs mostram a visualização atualizando o modelo diretamente ( https://blogs.msdn.microsoft.com/erwinvandervalk/2009/08/14/the-difference-between-model-view-viewmodel-and-other- padrões de apresentação separados / ).

Sei que esses são apenas padrões, portanto, haverá implementações diferentes, mas a exibição da atualização do modelo parece estar fazendo muito mais do que deveria.

Digamos, por exemplo, eu tive uma classe de pessoa que continha um nome e número de telefone. A visualização pode exibir esse nome e número e um botão de envio para alterar o nome e o número da pessoa. Quando o botão enviar é clicado, eu esperaria que a atualização fosse realizada no Presenter e não na View. No entanto, o artigo que referi propõe que a visualização pode atualizar diretamente o modelo.

Então, a visualização deve sempre atualizar o modelo? Ou isso deve ser tratado apenas pelo apresentador?

EDITAR:

Código do artigo do MSDN:

public class PersonalDataView : UserControl, IPersonalDataView
{
    protected TextBox _firstNameTextBox;

    public void SetPersonalData(PersonalData data)
    {
        _firstNameTextBox.Value = data.FirstName;
    }

    public void UpdatePersonalData(PersonalData data)
    {
        data.FirstName = _firstNameTextBox.Value;
    }
}
Eric
fonte

Respostas:

6

Existem várias variantes do MVP desde o seu design original em 1996 por Mike Potel . Martin Fowler discute alguns deles em outro artigo sobre arquitetura de GUI .

Uma das principais diferenças entre as variantes é se a visualização é totalmente isolada do modelo ou não:

  • No primeiro caso, o apresentador é o homem no meio de uma "visão passiva" e o modelo.
  • No segundo caso, o apresentador é um "controlador supervisor", mas há interações diretamente entre a visualização e o modelo. O artigo de Potel descreve bem o tipo de interação: a visualização pode solicitar dados do modelo e o modelo pode notificar a visualização de alguns eventos.

Em nenhum dos casos, a visualização alteraria diretamente o modelo. A mudança do modelo ocorre sempre através do Presenter (ou do controlador em um MVC).

Observação 1: O artigo do MSDN mostra apenas uma seta diretamente da exibição para o modelo, em sua introdução na parte MVC (Model View Controller). A seta está na direção errada, mas o texto está correto: a visualização pode acessar o modelo e mudar a si mesma (ou seja, não o modelo, mas redesenhar a si mesma) após a alteração dos dados do modelo.

Observação 2: O artigo do MSDN também mostra o padrão MVVM da Microsoft, que é aproximadamente um MVP, mas o apresentador é ambiguamente chamado de "ViewModel". Porém, novamente, a Visualização não atualiza o modelo diretamente.

Sua edição:

O código da sua edição mostra uma ligação de dados bidirecional, em que a atualização de dados na exibição acionaria diretamente uma alteração no modelo. Isso de fato contradiz o padrão original do MVP, no qual a View informa o apresentador das alterações desejadas por meio de um "Interator" e o Presenter tem o monopólio de invocar "Commands" para atualizar o modelo.

Observação 3: acho que o autor deste blog do MSDN estava mais interessado em introduzir a arquitetura MVVM do que em escrever um artigo abrangente e abrangente, como Martin Fowler, sobre as demais arquiteturas. Penso também que a arquitetura de ligação de dados ADO da Microsoft, que remonta aos primeiros dias da estrutura .net, favorecia um design misto e tornava um MVP clássico menos trivial de implementar (era necessário um DataObjectSource para isolar o acesso ao modelo de dados).

Christophe
fonte
1
Obrigado pela resposta. Fiz uma edição na minha pergunta. O artigo do MSDN explica o MVP Supervision Controller e mostra onde o modelo é passado como parâmetro no método UpdatePersonalData. Esse método atualiza diretamente o modelo. Isso parece contradizer o que você está dizendo quando diz: "Em nenhum dos casos, a visualização alteraria diretamente o modelo. A alteração do modelo ocorre sempre através do Presenter (ou do controlador em um MVC)". Eu realmente não gosto da idéia de o modelo ser atualizado na visualização e concordo com a sua interpretação. É isso, apenas interpretação?
Eric
1
@EricS Acho que o autor deste artigo do blog do MSDN interpretou mal o termo "acesso a dados" no MVP como uma ligação de dados bidirecional. Eu editei minha resposta para destacar isso.
Christophe
1
@EricS A propósito, confirma-se que o termo ligação de dados entre visualização e modelo é restrito no artigo de Martin Fowler "A visualização geralmente usa alguma forma de Ligação de Dados para preencher grande parte das informações de seus campos. Onde a Ligação de Dados não está ativa para interações mais complexas, o controlador entra em ação ".
Christophe
1
Ainda estou tentando entender a ligação de dados e o que realmente é e não é. Sem uma estrutura para fazer qualquer ligação de dados para mim, posso implementar a ligação de dados usando apenas getters e setters? Nesse caso, se eu quisesse implementar apenas uma ligação de dados unidirecional, teria apenas um getter que obtém dados do modelo, mas nunca atualiza o modelo. Em vez disso, a atualização do modelo seria delegada ao apresentador.
Eric
1

No artigo Fowler's Supervising Presenter, que você vinculou na sua pergunta:

Fatore a interface do usuário em uma visualização e controlador em que a visualização manipule mapeamento simples para o modelo subjacente e o controlador manipule a resposta de entrada e a lógica complexa da visualização.

Diz claramente que, para todas as tarefas simples, a visualização pode falar diretamente com o modelo. Portanto, isso não contradiz o artigo do MSDN. Isso ocorre exatamente porque, para mapeamento / associação simples de propriedades, você não precisa envolver outra camada, pois isso apenas complicaria as coisas sem muitos benefícios.

Novamente, Fowler fala sobre isso no final do artigo:

[...] a questão motriz é a quantidade de comportamento que resta na exibição. A Visão Passiva é um padrão muito semelhante ao Supervisão de Controlador, mas com a diferença de que a Visão Passiva coloca todo o comportamento de atualização da visão no controlador, incluindo casos simples. Isso resulta em programação extra, mas significa que todo o comportamento da apresentação é testável. A escolha entre os dois depende de que tipo de suporte de Ligação de Dados você possui e se está feliz em deixar isso não testado pelos testes do controlador.

Você deve ter em mente algumas coisas:

  • Certifique-se de que o modelo seja o "mestre" dos dados a qualquer momento. Isso significa que o View nunca deve gravar diretamente nos campos do modelo (de qualquer maneira, é uma má ideia). Propriedades está ok se o seu idioma as suportar. Dessa forma, o modelo ainda pode reagir a qualquer atualização de seus dados (por exemplo, calculando outro campo).
  • Não combine seu modelo com a vista. O modelo deve ser testado independentemente e, em princípio, você poderá alterar a visualização sem afetar o modelo. Isso significa que o modelo nunca deve chamar diretamente a visualização. Use interfaces, ou provavelmente o melhor aqui, o padrão Observer. O View pode se inscrever no modelo para atualizações.
  • Nunca coloque nenhuma lógica (comercial) na exibição. Se você se encontra escrevendo ifinstruções no código de exibição, pense se essas devem pertencer ao apresentador ou modelo.
jhyot
fonte