MVC: modèles entièrement peuplés ou modèles partiellement remplis?

10

Celui-ci me hante depuis si longtemps. Lors de la programmation MVC, quelle est selon vous la meilleure pratique de programmation? Doit-on utiliser des modèles entièrement remplis ou partiellement remplis, surtout quand je sais que pour cette tâche particulière, je n'aurai besoin que de 2 champs de l'objet modèle qui en a 5 autres?

Parfois, il semble criminel de remplir une liste de 20 objets modèles avec toutes les valeurs de la base de données lorsque vous savez que vous n'en aurez besoin que de quelques-uns.

Bien sûr, le modèle partiel signifie que vous devrez écrire une méthode de plus dans votre DAO en dehors de celle qui récupère tout. Ce qui signifie plus de code à maintenir?

D'un autre côté, tout tirer de DB avec des modèles entièrement peuplés signifie qu'une méthode sert tout, mais cela va évidemment vous donner des frais généraux de performance.

Je peux voir ORM (comme Hibernate ou ActiveRecord of Rails) favoriser les tendances dans la programmation MVC et les bases de données comme les modèles complets BigTable de Google est une tendance acceptée. Mais que se passe-t-il si vous utilisez toujours un bon vieux JDBC?

Le matériel est bon marché, le développement est coûteux. Est-ce vraiment vrai même lorsque l'application doit évoluer à quelques centaines de milliers de demandes par heure?

Pritam Barhate
la source
1
"D'un autre côté, tout tirer de DB avec des modèles entièrement peuplés signifie qu'une seule méthode sert tout, mais cela va évidemment vous donner des frais généraux de performances." Vraiment? Avez-vous mesuré les frais généraux de performance de cette pratique?
S.Lott
>> Vraiment? Avez-vous mesuré les frais généraux de performance de cette pratique? << - Je m'attendais à celui-ci. Non, je ne l'ai pas fait. Mais il serait intéressant de mesurer et de prouver le contraire autrement.
Pritam Barhate
Il est difficile de prouver que les frais généraux n'existent pas. Vous pouvez facilement chicaner sur de nombreux détails en affirmant que les mesures ne sont pas valables dans certaines situations. C'est beaucoup plus agréable si vous utilisez votre configuration "typique" de base de données, le langage d'application, etc., et profilez votre configuration préférée pour montrer quels sont les frais généraux réels afin que nous n'ayons pas à ergoter sur les différents facteurs que nous avons omis de nos mesures .
S.Lott
1
J'ai trouvé un excellent article qui couvre la question de l'exposition de votre modèle de domaine par rapport à l'envoi d'un DTO à msdn.microsoft.com/en-us/magazine/ee236638.aspx .
Mayo

Réponses:

3

Vous avez deux options:

1) Laissez certains champs du modèle vides

2) Créez un modèle "lite" supplémentaire pour votre situation spécifique

Lequel choisir dépend à nouveau des deux choses:

a) Combien de champs du modèle "complet" vont être ignorés

b) Combien de fois ce modèle "léger" sera instancié

S'il n'y a que quelques champs ou plus qui peuvent être remplis, il est normal de choisir 1).

Si b) n'est qu'une situation individuelle exceptionnelle, il est peut-être inutile de créer un modèle supplémentaire uniquement pour un cas d'utilisation.

Une autre approche consiste à définir un modèle "allégé" et à en hériter le modèle "complet".


la source
Merci d'avoir répondu. Il est logique de créer un modèle léger en fonction des besoins. Mais parfois, je me demande si une telle stratégie ne créera pas trop de classes de modèles? Surtout si je crée des modèles spécifiques aux vues plutôt que des modèles spécifiques à la logique métier.
Pritam Barhate,
3

Si votre vue n'a besoin que de 2 propriétés du modèle, vous avez (probablement) le mauvais modèle pour ce cas d'utilisation! Je chercherais à créer un modèle adapté à la vue, à enregistrer les recherches de base de données supplémentaires et à ne remplir que les données dont vous avez besoin. Si une vue ultérieure a besoin de plus de détails, vous devez demander, puis-je obtenir les données supplémentaires plus tard ou dois-je les obtenir toutes à l'avance ...

Vous pouvez également envisager une sorte d'évaluation paresseuse, de sorte que les valeurs sont remplies lorsque vous en avez besoin. Cela peut bien fonctionner, mais c'est évidemment plus de travail et peut finir par provoquer plusieurs allers-retours vers la base de données, ce qui n'est pas génial si vous finissez souvent par le faire.

Cela dit, si vous sélectionnez essentiellement quelques champs supplémentaires dans une table ou une vue, le coût d'obtention de ces données supplémentaires est, à toutes fins utiles, nul (OK, il y a plus d'octets sur le fil, mais les coûts les plus importants sont probablement être dans la création et la suppression d'une connexion), donc s'il y a une chance que vous ayez besoin de données supplémentaires, je remplirais probablement le modèle une fois que vous êtes satisfait, vous avez le bon modèle .

Le matériel est bon marché, mais aucune quantité de matériel ne peut faire bien fonctionner un mauvais design.

Steve
la source
2
>> Si votre vue n'a besoin que de 2 propriétés du modèle, alors vous avez le mauvais modèle! << - Ne doit pas toujours être porté. Le cas typique affiche la liste des résultats de recherche dans les applications métier. Par exemple, dans un CRM - client - la plupart du temps, un seul affiche le nom et un ou deux champs importants dans une liste de recherche. Mais le CRM aura plusieurs autres domaines associés à ce client.
Pritam Barhate
1
La question dit que dans ce cas, seules 2 propriétés sont nécessaires.
Steve
-2

Le modèle n'est pas un DAO.

Et une autre chose: si vous dites que vous avez 20 modèles (clients, de votre exemple), alors ce n'est pas un modèle MVC. Le modèle de domaine ne correspond pas directement à une seule ligne de table. Au lieu de cela, il devrait être responsable de toutes les opérations effectuées avec vos «clients».

Dans votre exemple, "Client" n'est pas un modèle de domaine, mais simplement un objet à l'intérieur du modèle.

Quant à l'interaction avec la base de données, cette responsabilité devrait être déléguée à un objet mappeur de données , qui devrait savoir comment stocker et récupérer vos instances de la classe Client.

mefisto
la source
PS: si vous avez une logique de base de données à l'intérieur du modèle, cela poussera la logique métier du domaine dans le contrôleur.
mefisto
1
Une classe qui fait tout pour les clients est une mauvaise idée car elle sera difficile à maintenir.
Andy