Separação de preocupações versus desempenho?
-
20-09-2019 - |
Pergunta
eu tenho um ASP.NET MVC Site e estou tentando descobrir a separação do controlador e do modelo (repositório) e funcionalidade auxiliar HTML.
O objetivo é consultar uma tabela de banco de dados de informações sobre álbuns de fotos e exibi -las agrupadas por ano.
As etapas são:
- Banco de dados de consulta e retorno datatable das informações do banco de dados.
- Converta Datatable em AlbumCollection (Lista)
- Álbuns de balde por ano no albumdictionary
- Renderize todos os anos em uma tabela HTML separada.
Dado esse pedido, eu pude ver: 1,2,3 tudo no modelo e o controlador simplesmente liga a vista ao modelo de albumes ou 1,2 no modelo e se liga ao albumcollection e 3 em um html viewhelper ou 1,2 no Modelo 3 no controlador e se liga ao Dictionary do Álbum
Pensamentos?
Fazer todas as conversão no primeiro loop teria o melhor desempenho, mas não tenho certeza se é a melhor separação de preocupações.
Em particular para a pergunta acima, o feedback genérico seria interessante: quando a separação de preocupações anula o desempenho ou o vice -versa?
Solução
Eu tentaria manter o modelo livre de qualquer coisa que tenha a ver com a renderização.
Eu vejo o agrupamento por ano bem perto da renderização. É por isso que eu não o colocaria no modelo e também não no controlador. Uma abordagem comum deve ter um modelo de POCO e DAL/BLL e modelo mais chamado ViewModel (o modelo usado pela visão fortemente digitada). Este é um bom lugar para preparar os objetos para renderizar.
No ViewModel, eu usaria o LINQ para agrupar os álbuns por anos. Esperamos que isso seja rápido o suficiente.
Outras dicas
Tendo sido um usuário de um software verdadeiramente horrendo que eu certamente parecia bem de uma perspectiva orientada a objetos para os designers e foi possivelmente fácil de manter, quero ressaltar que os usuários descerão quase o desempenho quase toda vez.
Se a diferença de desempenho for insignificante, siga a separação de preocupações, se não for, faça o que for preciso para obter o melhor desempenho. Precisamos parar de nos preocupar tanto com os minutos extras para manter (talvez tocar esse código uma vez por ano, uma vez que estiver no Prod) e mais sobre lentidão para todos os usuários todos os dias. Gostamos de dizer que o tempo de desenvolvimento é tão caro que precisamos minimizá -lo, mas a verdade é que o tempo de desenvolvimento geralmente é muito mais barato do que a quantidade de tempo pedindo que nossos usuários desperdiçam diariamente.
Eu faria o bucketing no controlador apenas se seja:
O balde ocorre apenas uma vez e eu posso fazer isso com um ou dois simples declarações;
Ocorre mais de uma vez, mas posso fazer isso com apenas um
AlbumDictionary.BucketByYear()
declaração.
Caso contrário, eu usaria modelos para fazer isso.