Em quase todos os projetos em que trabalho com uma equipe, o mesmo problema parece surgir. Alguém escreve código de interface do usuário que precisa de dados e escreve um método de acesso a dados:
AssetDto GetAssetById(int assetId)
Uma semana depois, outra pessoa está trabalhando em outra parte do aplicativo e também precisa de um, AssetDto
mas agora incluindo 'aprovadores', e escreve o seguinte:
AssetDto GetAssetWithApproversById(int assetId)
Um mês depois, alguém precisa de um ativo, mas agora inclui as 'perguntas' (ou os 'proprietários' ou as 'solicitações em execução', etc):
AssetDto GetAssetWithQuestionsById(int assetId)
AssetDto GetAssetWithOwnersById(int assetId)
AssetDto GetAssetWithRunningRequestsById(int assetId)
E fica ainda pior quando métodos como o GetAssetWithOwnerAndQuestionsById
começam a aparecer.
Você vê o padrão que emerge: um objeto é anexado a um gráfico de objetos grandes e você precisa de diferentes partes deste gráfico em locais diferentes.
Claro, eu gostaria de evitar um grande número de métodos que fazem quase o mesmo. É simplesmente uma questão de disciplina de equipe ou há algum padrão que eu possa usar para evitar isso? Em alguns casos, pode fazer sentido ter métodos separados, ou seja, obter um ativo com solicitações em execução pode ser caro, por isso não quero incluí-los o tempo todo. Como lidar com esses casos?
a = getAssetById(x)
e, em seguida, pode chamar a.questions etc. sem precisar carregá-las especificamente, pois o sistema ORM subjacente o carrega para você quando o acesso é tentado.