Question

Comment créeriez-vous un modèle de domaine pour cet exemple simple? Une recette peut contenir de nombreux ingrédients et un ingrédient peut être utilisé dans de nombreuses recettes. Quelle quantité de chaque ingrédient utilisé dans chaque recette est également stockée. J'ai conçu les trois tables de base de données suivantes pour stocker ces données et les relations.

J'essaie maintenant de créer un modèle de domaine pour représenter cela. J'ai un exemple de base avec deux classes. J'ai ensuite eu des problèmes avec ce modèle lorsque j'ai pensé créer un nouvel ingrédient. Il devrait y avoir une classe sans la quantité. Comment cela devrait-il être modélisé?

Tables de base de données

texte de remplacement http://img190.imageshack.us/img190/340/databasex .png

Modèle de domaine

texte de remplacement http://img24.imageshack.us/img24/8859/classesy .png

Était-ce utile?

La solution

Si vous essayez de faire une conception pilotée par un domaine, ne commencez pas par des tables. Élaborez d’abord un modèle conceptuel qui reflète votre domaine sous-jacent. Je suis d’accord avec ndp: RecipeIngredient est un nom / concept un peu maladroit, du point de vue de DDD.

Je pense que le modèle a besoin des concepts suivants: recette, ingrédient, mesure et préparation de recette.

Une recette est une agrégation d’ingrédients. Chaque ingrédient appartenant à une recette doit être associé à une mesure, en tant que spécification de la préparation. Vous devez également modéliser la préparation de recette pour associer la quantité réelle de chaque ingrédient utilisé lors d'une préparation spécifique de la recette.

Une mesure comprend l’unité et la quantité (par exemple 2 tasses, 0,5 oz, 250 gr, 2 c. à table ...).

Je vois ici deux choses différentes qui pourraient être mélangées pendant l'analyse et qui devraient rester séparées: recette / ingrédient / mesure en tant que spécification afin de cuire quelque chose (une instance pour chaque recette) et recette de préparation / ingrédient / mesure en béton préparation d'une recette, faite par une personne donnée à un moment donné, et utilisant éventuellement différentes mesures (tous les ingrédients sont doublés car la spécification de la recette est pour deux assiettes et vous avez quatre invités ... quelque chose comme ça).

Vous pouvez aller plus loin et commencer à modéliser des éléments tels que certains ingrédients contenant un ensemble d'ingrédients échangeables (par exemple, si vous n'avez pas de fromage de chèvre, utilisez de la mozzarella), un livre de recettes qui recueille un ensemble de recettes de la même catégorie, un temps de cuisson. pour la recette, etc.

Autres conseils

Dans votre modèle de domaine, créez une classe RecipeIngredient contenant une référence à un ingrédient spécifique et une quantité.

Modifiez ensuite la liste Recipe.Ingredients pour qu'elle contienne des objets RecipeIngredient. Enfin, supprimez Quantité de la classe d’ingrédients.

Juste un conseil: la plupart des modélisateurs de domaine puristes diraient que vous devez créer votre modèle de domaine en premier lieu et ne vous préoccuper de la base de données que beaucoup plus tard.

Puisque vous avez des données dans votre table de jointure (quantité), la réponse est qu'il vous faut une classe pour la représenter. (Il existe d'autres alternatives, mais ne mérite pas d'être envisagée.)

Au fur et à mesure que votre modèle grandit, vous devrez sans doute ajouter plus de données ici. Par exemple, comment définissez-vous l'ordre des ingrédients dans la recette?

RecipeIngredient est un nom (et un concept) maladroit, du point de vue de la conception dirigée par le domaine. Vous pourrez peut-être trouver différents noms qui se sentent mieux. Mais en général, il s’agit d’un détail de mise en œuvre nécessaire. Désolé, je ne dispose pas du livre DDD d'Evan pour fournir une référence.

Je pense que vous êtes tous perdus. L’affiche originale avait la bonne impulsion, mais empruntait le mauvais chemin. En fait, la table de mappage qu'il montre, utilisant l'ancienne heuristique de Riehl (combinant les noms des relations l et r), semble traiter du fait qu'il s'agit d'une mappage plusieurs à plusieurs. Mais ce qui se passe réellement, c’est que vous avez besoin d’une classe role (l’approche de modélisation de domaine de Coad les a beaucoup utilisées). Voici la chose cependant: c'est ce que Ingredient est déjà! L'abstraction manquante ici ouvre une boîte de Pandore: c'est la chose qui est ajoutée. On pourrait penser que ce serait une classe de base, par exemple. Aliments (puisque nous ne pouvons littéralement pas, par définition, ajouter d'éléments immangeables à une recette), mais vous devez alors comptabiliser tous les aliments, ou vous pouvez simplement les nommer.

Le bon modèle, à mon avis, est Recette contient des ingrédients contenant une certaine quantité d'un aliment spécifique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top