MVC: modelos totalmente preenchidos ou modelos parcialmente preenchidos?

10

Este me assombrou por tanto tempo. Ao fazer a programação MVC, o que você acha que é a melhor prática de programação? Deve-se usar modelos totalmente preenchidos ou parcialmente preenchidos, especialmente quando eu sei que, para esta tarefa em particular, vou precisar de apenas 2 campos do objeto de modelo que possui outros 5?

Às vezes, parece criminoso preencher uma lista de 20 objetos de modelo com todos os valores do banco de dados quando você sabe que precisará apenas de alguns deles.

Obviamente, modelo parcial significa que você precisará escrever mais um método no seu DAO além daquele que busca tudo. O que significa mais código para manter?

Por outro lado, extrair tudo do DB com modelos totalmente preenchidos significa que um método serve a todos, mas isso obviamente fornecerá uma sobrecarga de desempenho.

Eu posso ver o ORM (como o Hibernate ou o ActiveRecord of Rails) favorecendo tendências na programação MVC e bancos de dados como os modelos completos do BigTable do Google são aceitos. Mas e se você ainda estiver usando o bom e velho JDBC?

O hardware é barato, o desenvolvimento é caro. Isso é verdade mesmo quando o aplicativo precisa ser escalado para algumas centenas de milhares de solicitações por hora?

Pritam Barhate
fonte
11
"Por outro lado, extrair tudo do DB com modelos totalmente preenchidos significa que um método serve a todos, mas isso obviamente dará a você uma sobrecarga de desempenho". Você mediu alguma sobrecarga de desempenho desta prática?
S.Lott
>> Sério? Você mediu alguma sobrecarga de desempenho dessa prática? << - Eu esperava essa. Não, eu não tenho. Mas seria interessante medir e provar errado de outra maneira.
Pritam Barhate
É difícil provar que as despesas gerais não existem. Você pode discutir facilmente muitos detalhes, alegando que as medidas não são válidas para alguma situação. É muito melhor se você usar sua configuração "típica" de banco de dados, idioma do aplicativo, etc., e criar um perfil de sua configuração preferida para mostrar quais são as despesas gerais reais, para que não tenhamos que discutir os vários fatores que deixamos de fora de nossas medidas .
S.Lott
11
Encontrei um excelente artigo que aborda a questão de expor seu modelo de domínio versus enviar um DTO em msdn.microsoft.com/en-us/magazine/ee236638.aspx .
Mayo

Respostas:

3

Você tem duas opções:

1) Deixe alguns campos no modelo não preenchidos

2) Crie um modelo "leve" extra para sua situação específica

Qual escolher depende das duas coisas novamente:

a) Quantos campos do modelo "completo" serão ignorados

b) Com que frequência esse modelo "leve" será instanciado

Se houver apenas alguns ou mais campos que podem ser preenchidos, não há problema em 1).

Se b) for apenas uma situação individual excepcional, talvez não faça sentido criar um modelo extra apenas para um caso de uso.

Outra abordagem é definir um modelo "leve" e herdar o modelo "completo" dele.


fonte
Obrigado pela resposta. Faz sentido criar um modelo leve, dependendo da necessidade. Mas às vezes me pergunto se essa estratégia não criará muitas classes de modelos? Especialmente se eu estiver criando modelos específicos para visualizações em vez de modelos específicos para lógica de negócios.
Pritam Barhate
3

Se sua visualização precisar apenas de duas propriedades do modelo, você (provavelmente) terá o modelo errado para esse caso de uso! Gostaria de criar um modelo para se adequar à visualização, salvar as pesquisas extras de banco de dados e preencher apenas os dados necessários. Se uma visualização subseqüente precisar de mais detalhes, é necessário perguntar, obtenho os dados extras mais tarde ou devo obtê-los com antecedência ...

Como alternativa, você pode considerar algum tipo de avaliação preguiçosa; portanto, os valores são preenchidos quando você precisar deles. Isso pode funcionar bem, mas obviamente é mais trabalhoso e pode causar várias viagens de ida e volta ao banco de dados, o que não é ótimo se você acabar fazendo muito.

Dito isto, se você estiver basicamente selecionando alguns campos extras de uma tabela ou exibição, o custo de obter esses dados extras será zero, para todos os efeitos, para todos os efeitos (OK, há mais bytes no fio, mas os maiores custos provavelmente para criar e derrubar uma conexão); portanto, se houver uma chance de que você precise de alguns dados extras, provavelmente preencherei o modelo completamente quando estiver satisfeito com o modelo certo .

O hardware é barato, mas nenhuma quantidade de hardware pode fazer um projeto ruim funcionar bem.

Steve
fonte
2
>> Se sua visualização precisa apenas de 2 propriedades do modelo, você tem o modelo errado! << - Não precisa ser usado sempre. Caso típico está mostrando a lista de resultados da pesquisa em aplicativos de negócios. Por exemplo, em um CRM - cliente - a maioria mostrará apenas o nome e um ou 2 campos importantes em uma lista de pesquisa. Mas o CRM terá muitos outros campos associados a esse cliente.
Pritam Barhate
11
A pergunta diz que, neste caso, são necessárias apenas 2 propriedades.
26411 Steve
-2

O modelo não é um DAO.

E outra coisa: se você diz que possui 20 modelos (clientes, do seu exemplo), esse não é um modelo MVC. O modelo de domínio não é mapeado diretamente para uma única linha da tabela. Em vez disso, deve ser responsável por todas as operações realizadas com seus "clientes".

No seu exemplo, "Cliente" não é um modelo de domínio, mas apenas um objeto dentro do modelo.

Quanto à interação com o banco de dados, essa responsabilidade deve ser delegada a um objeto de mapeador de dados , que deve saber como armazenar e buscar suas instâncias da classe Customer.

mefisto
fonte
PS se você tiver uma lógica de banco de dados dentro do modelo, ela empurrará a lógica de negócios do domínio para o controlador.
Mefisto
11
Uma classe que faz tudo para os clientes é uma péssima idéia, pois será difícil mantê-la.
Andy