Quanta lógica de negócios deve existir na camada do controlador?


39

Às vezes, temos alguma lógica de negócios representada no código do controlador de nossos aplicativos. Geralmente, essa lógica diferencia os métodos a serem chamados do modelo e / ou os argumentos a serem transmitidos.

Outro exemplo disso é um conjunto de funções utilitárias existentes no controlador que podem funcionar para formatar ou higienizar os dados retornados do modelo, de acordo com um conjunto de regras de negócios.

Isso funciona, mas estou me perguntando se está flertando com um desastre. Se houver lógica comercial compartilhada entre o controlador e o modelo, as duas camadas não serão mais separáveis ​​e alguém que herdará o código poderá ficar confuso com essa desigualdade na localização do código relacionado à lógica comercial.

Minha pergunta é quanta lógica de negócios deve ser permitida no controlador e em que circunstâncias, se houver?


1
Ótima pergunta. Estou ansioso para ver as opiniões das pessoas.
Nathan Taylor

Respostas:


20

Idealmente nenhum

Mas isso nem sempre é possível. Não posso fornecer números concretos, como 20% ou 10 linhas, isso é subjetivo a ponto de não ser possível responder. Posso descrever como uso padrões de design e circunstâncias que exigem dobrá-los um pouco.

Na minha opinião, depende inteiramente do objetivo do aplicativo. Construindo uma API REST simples para postar? Esqueça a separação limpa ou até mesmo um padrão. Você pode produzir uma versão funcional em menos de uma hora. Construindo algo maior? Provavelmente é melhor trabalhar nisso.

Construir sistemas individualmente contidos é o objetivo. Se você começar a escrever uma lógica comercial específica de como dois sistemas interagem, isso é um problema. Sem olhar mais fundo, não posso dar uma opinião.

Os padrões de design são moldes, alguns gostam de aderir estritamente a eles com base no código principal e bem escrito. A adesão estrita a um padrão provavelmente não fornecerá um código incorreto , mas pode levar mais tempo e fazer com que você escreva muito mais código.

Os padrões de design são flexíveis, ajuste-os para atender às suas necessidades. Dobre-os demais e eles quebram. Saiba o que você precisa e escolha um padrão de design mais próximo disso.


10

O menos possível. De preferência nenhum.

O controlador deve se preocupar em aceitar a solicitação, solicitar ao serviço de domínio correto para processar a solicitação e entregar a resposta para a exibição correta.

Nesse processo, toda a "lógica de negócios" deve existir nos serviços de domínio.

Se você tiver uma funcionalidade que retira objetos de domínio e cria modelos de exibição a partir deles, isso pode coexistir razoavelmente com o controlador. Mas esse deve ser um código que existe apenas para o benefício das visualizações correspondentes. Se houver uma regra no nível de negócios sobre higienização de dados, ela deverá existir no seu domínio / nível de serviço (com os testes de unidade apropriados).


10

O termo "lógica de negócios" costuma ser confuso porque as pessoas têm opiniões diferentes sobre o que isso significa. Na minha opinião, o termo "lógica de negócios" abrange duas áreas

  • Lógica do domínio
  • Lógica de Aplicação

A lógica do domínio é uma lógica relacionada à área principal com a qual sua empresa se relaciona; portanto, se escrever um aplicativo para contadores, regras fiscais, regras de contabilidade etc. farão parte da lógica do domínio.

Lógica de aplicativo é uma lógica relacionada ao fato de você estar executando um programa de computador. Isso pode incluir coisas como exportação de importação CSV, assistentes etc. Também pode conter coisas como a criação de e-mails de senha esquecidos.

O tipo de "lógica de negócios" que você pode colocar na camada do controlador é lógica de aplicativo. Talvez nem toda a lógica do aplicativo deva ir para lá. Mas você nunca deve colocar a lógica do domínio na camada do controlador. Obviamente, isso deve estar na camada de domínio.

Você estava falando sobre lógica para formatar ou higienizar dados. A formatação deve definitivamente ser a lógica do aplicativo. A higienização, por outro lado, pode ser lógica de domínio, se a higienização de dados for baseada em regras de domínio. Isso depende do contexto.


4

Os controladores devem ser muito claros na lógica do domínio.

Os controladores devem delegar tarefas como recuperar um registro do armazenamento de dados por meio de uma camada abstrata de serviço / repositório e passar dados de volta ao armazenamento de dados pelo mesmo serviço (ou relacionado). Quanto à mecânica e ao melhor trabalho entre essas operações, geralmente eles pertencem a outro lugar que não o controlador.

Costumo me adicionar métodos de limpeza de dados pequenos aos meus controladores, que salvam os dados de volta à loja e, embora seja uma solução eficaz, eles não se encaixam bem com a função pretendida do controlador. Idealmente, qualquer coisa que modifique, valide ou analise seu modelo deve ocorrer muito próximo, se não dentro, do próprio modelo. Por exemplo, se você precisar 'limpar' um objeto de modelo antes de armazená-lo, considere ter um método SanitizeInputs () no modelo ou como parte do serviço que trata de armazenar o modelo.


3

De um ponto de vista pragmático, descobri que você acaba com a lógica no seu controlador ou o comportamento do controlador em seu modelo quando está tentando fazer algo para o qual não existe uma boa abordagem compatível com padrões. Duplamente, se você estiver escrevendo um aplicativo que não tenha uma grande infraestrutura por trás dele.

Você pode ir de qualquer maneira, mas geralmente tento pensar se é provável que o bit estranho apareça em mais de uma ação do controlador, se for o caso. Se isso não está claro, tento pensar se é mais "adequado" em um lugar do que no outro. Na falta de que eu normalmente o coloquei no modelo apenas para mantê-lo fora do controlador (preferência pessoal por controladores menores e objetos de dados mais fortes, YMMV)

Uma terceira opção seria referenciar os itens de utilidade como uma classe de utilidade separada, mas isso também é um pouco contra o padrão na opinião de muitos.

Além disso, só porque você não segue rigorosamente um padrão, não está necessariamente flertando com um desastre. A menos que você realmente espere uma quantidade significativa de código reutilizado neste projeto, eu me preocuparia muito mais com o fato de o projeto ser consistente consigo mesmo (ou seja: não inverta onde você coloca esses bits quando escolhe um local) do que uma reescrita que, por algum motivo, queira salvar parte do meio do projeto. Documente / comente onde e por que você se desviou do padrão comum e defina o padrão esperado para este aplicativo.

O MVC foi um desvio dos padrões estabelecidos em um ponto.


3

Como muitos outros conceitos interessantes em programação, o MVC é um paradigma poderoso para trazer estrutura e foco a uma família de estratégias próximas ou similares para implementar determinados cenários.

Como muitos outros conceitos de programação, o MVC simplifica a realidade, descarta pequenos detalhes e fornece um modelo bruto de estrutura de arame a seguir. Como muitas outras simplificações da realidade, funciona como trazer a estrutura ao caos, como visto pela mente humana.

Ainda assim, como muitos outros conceitos de programação, o MVS é apenas uma simplificação da realidade. Não é perfeito e não é completo. É por isso que não é possível ajustar um cenário do mundo real a um modelo simplificado demais. Portanto, surgem muitas questões semelhantes a esta.

  • Quanta lógica deve entrar em um controlador?

  • Se uma visão deve conter alguma lógica condicional?

  • Se um modelo deve conter dados adicionais não encontrados diretamente nas entidades comerciais?

Todas essas são questões nascidas na tentativa de ajustar o código para se ajustar à idéia conceitual do MVC de maneira precisa e completa.

Minha resposta para você é não tente. MVC fornece estrutura. Crie seu aplicativo em torno dessa base, mas não espere que ele se encaixe perfeitamente. Haverá desvios, é normal. Apenas observe para mantê-los sob controle.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.