MVC Pattern - Como obter erros do modelo para o controlador?

5

Digamos que eu tenha uma configuração típica do MVC. O controlador passa alguma entrada para o modelo e pede para fazer algo com ele. Mas a validação dos dados falha ou há algum outro problema. Qual é a melhor maneira de fazer com que esses erros passem de volta para o controlador, o que os transmitirá para a exibição a ser exibida ao usuário?

No momento, só tenho uma matriz errors no meu modelo. Quando ocorrer algum erro, simplesmente adiciono as mensagens de erro a esse array e return false ao controlador, para que ele saiba que ocorreram erros. E no controlador, eu faço isso:

boolean result = model.process( input );

if (! result)
{
   view.displayErrors( model.getErrors() );
   return;
}
else
   view.displaySuccess();

Existe uma maneira melhor de lidar com isso?

    
por Click Upvote 01.02.2013 / 23:26
fonte

1 resposta

6

Então, o que você está sugerindo / fazendo atualmente é um método, e é certamente uma maneira válida de coletar informações adicionais sobre mensagens de erro.

É uma abordagem razoavelmente leve - o chamador obtém sucesso | mensagem de falha e, em seguida, cabe ao chamador para cavar mais fundo para obter informações adicionais se assim o importa. A desvantagem é o que você aludiu com os comentários - e se houver vários problemas dentro da validação?

Não seria muito difícil estender essa abordagem para que o responsável pela chamada faça um loop em uma chamada GetErrorDetails() até que esse método retorne um indicador "sem mais erros".

Outra questão potencial com essa abordagem é a suposição implícita de que o chamador está na melhor posição para lidar com quaisquer mensagens de erro. Como você está usando o MVC, o controlador não é sempre a melhor camada para corrigir esse problema. Os erros de validação precisam ser enviados de volta à Visualização para que o usuário possa corrigir o problema. Não estou me concentrando neste aspecto, pois existem alguns contra-argumentos válidos para indicar que o Controlador poderia / deveria indicar o erro. Essa discussão não é o ponto da sua pergunta.

Alteração 1
Como alternativa, considere criar um objeto completo para retornar erros. Em vez do booleano que você está retornando no momento, você retornará esse objeto de erro.

Obviamente, o objeto de erro precisará ter um valor para indicar sucesso | falha sucesso parcial | tanto faz. O benefício é que agora você pode adicionar uma coleção de erros dentro do próprio objeto de erro.

Aqui está um pseudo-código para você ter uma ideia do que estou sugerindo.

ErrorParent()
{
  bool success;
  List errorMsgs;
}

ErrorMessages()
{
  string message;
  int  severity;
  List callstack;
}

O chamador tem que trabalhar um pouco mais para determinar o sucesso, mas é uma verificação ErrorParent.success igualmente simples, em oposição a uma verificação success . Sim, sim, conheço os problemas de digitar mais alguns caracteres ...

Se o chamador se importar com os erros, ele poderá iterar sobre a coleção ErrorParent.errorMsgs e ver o que deu errado. Se o chamador não se importar com os erros, ele pode passar o objeto de erro para um manipulador de erros e permitir que o manipulador faça todo o trabalho pesado.

Alternativa 2
Em vez de retornar um bool para sucesso / erro, você poderia retornar um valor numérico. O valor numérico indicaria o número de validações com falha. O Controlador poderia passar esse erro numérico para retornar ao manipulador de erros "melhor" para aquela situação, e então o manipulador de erro executaria um loop sobre o método GetErrorDetails() .

    
por 02.02.2013 / 18:40
fonte