{"componentChunkName":"component---src-templates-lecture-template-js","path":"/lectures/ateliers/ddd/agregats-repo","result":{"data":{"mdx":{"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"slug\": \"ateliers/ddd/agregats-repo\",\n  \"title\": \"DDD : Agrégats et repositories\",\n  \"type\": \"homework\",\n  \"time\": null\n};\n\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\n\nvar Solution = makeShortcode(\"Solution\");\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"Conception des aggr\\xE9gats\"), mdx(\"p\", null, \"Nous avons vu 3 principaux \\xE9l\\xE9ments de la conception dirig\\xE9e par le domaine.\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"la notion de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"ubiquitous language\"), \" : faire en sorte que les concepts et le vocabulaire du domaine se retrouvent dans notre code\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"les aggr\\xE9gats : une technique pour regrouper des objets afin de garantir la consistence du domaine\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"les \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"value objects\"), \" et les \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"entities\"), \" : deux types d'objets qui ont une notion d'identit\\xE9 diff\\xE9rente\")), mdx(\"p\", null, \"Un des sujets qu'il est facile de mal comprendre est la conception des aggr\\xE9gats et leur relation avec les repositories.\"), mdx(\"h2\", null, \"Exercice : retour sur les concepts \\xE9voqu\\xE9s jusqu'\\xE0 maintenant\"), mdx(\"p\", null, \"Si nous retournons \\xE0 l'atelier sur la gestion des patients, nous avons\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"une t\\xEAte d'aggr\\xE9gat avec la classe \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\"), \" contient un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\"), \" contient une liste de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SejourHorsQuebec\"))), mdx(\"p\", null, \"Quelle notion du DDD a men\\xE9 au nommage de ces classes?\"), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"p\", null, \"Il s'agit du \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"ubiquitous language\"), \". Les notions \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\"), \", \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\"), \" et \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SejourHorsQuebec\"), \" font partie du domaine et sont utilis\\xE9es par les personnes de la RAMQ qui traitent les dossiers d'assurabilit\\xE9. C'est pourquoi on les retours dans notre code.\")), mdx(\"p\", null, \"Parmi ces 3 classes, lesquelles seraient des \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"value object\"), \"?\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SejourHorsQuebec\"))), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"p\", null, \"R\\xE9ponse B et C :\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Un historique est purement d\\xE9fini par ses attributs (date de naissance, date d'inscription, date de dec\\xE8s)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Un s\\xE9jour est purement d\\xE9fini par ses attributs (date de d\\xE9part, dur\\xE9e et motif)\")), mdx(\"p\", null, \"\\xC0 l'inverse, un PatientAssurable peut \\xE9voluer dans le temps tout en poss\\xE9dant une identit\\xE9 propre.\")), mdx(\"p\", null, \"De ce fait, quels probl\\xE8mes voyez-vous dans la conception des objets?\"), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\"), \" est une entit\\xE9 et devrait donc pouvoir \\xEAtre identifi\\xE9e sans se baser sur ses attributs. Il lui faudrait un champ d'identification unique\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\"), \" est un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"value object\"), \" et devrait donc \\xEAtre immuable. Les m\\xE9thodes \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"ajouterSejour\"), \", \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"ajouterDeces\"), \", \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"ajouterInscriptionRAMQ\"), \" ne devraient pas changer l'instance \\xE0 laquelle elles sont attach\\xE9es. Il faudrait plut\\xF4t recr\\xE9er une nouvelle instance lorsqu'on veut un nouvel historique.\"))), mdx(\"p\", null, \"Le r\\xF4le principal des aggr\\xE9gats est de garantir le respect des r\\xE8gles du domaine et notamment des invariants. Pouvez-vous identifier les diff\\xE9rents invariants garantis par l'aggr\\xE9gat \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\")), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Il est invalide d'avoir une date de d\\xE9c\\xE8s avant la date de naissance\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Il est invalide d'avoir un s\\xE9jour avant sa naissance ou apr\\xE8s son d\\xE9c\\xE8s\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Il est invalide d'avoir 2 s\\xE9jours diff\\xE9rents avec des dates qui se chevauchent\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Il est invalide de s'inscrire avant sa naissance ou apr\\xE8s son d\\xE9c\\xE8s\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Un patient n'est pas assur\\xE9 avant sa naissance ou apr\\xE8s son d\\xE9c\\xE8s\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Un patient doit \\xEAtre inscrit pour \\xEAtre assur\\xE9\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Un patient qui quitte le Qu\\xE9bec pour plus de 183 jours n'est plus assur\\xE9 sauf s'il quitte pour travailler ou \\xE9tudier\"))), mdx(\"h2\", null, \"Exercice : aggr\\xE9gats et repository\"), mdx(\"p\", null, \"L'universit\\xE9 Laval se munit d'un forum de discussion similaire \\xE0 \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.reddit.com/\"\n  }), \"Reddit\"), \". Ce forum est organis\\xE9 en sous-forums (annonces g\\xE9n\\xE9rales, vie \\xE9tudiante, g\\xE9nie informatique, m\\xE9decine etc.). Les utilisateurs peuvent poster des messages dans les sous-forums, \\\"upvoter\\\" ces messages et/ou y r\\xE9pondre, ils peuvent \\xE9galement s'abonner \\xE0 des sous-forums pour avoir les nouvelles dans leur fil d'actualit\\xE9.\"), mdx(\"p\", null, \"Nous allons mod\\xE9liser ce domaine avec 2 aggr\\xE9gats :\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"les utilisateurs\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"le forum, qui contient les sous-forum, les messages et les r\\xE9ponses\")), mdx(\"p\", null, \"Veuillez cloner le \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://github.com/GLO4002UL/officiel-ddd-aggregats-repo\"\n  }), \"repository github\")), mdx(\"h3\", null, \"Aggr\\xE9gat Utilisateur\"), mdx(\"p\", null, \"Commen\\xE7ons par \\xE9tudier le code se rapportant aux utilisateurs\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Dans le package \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"domaine.utilisateurs\"), \" nous avons un aggr\\xE9gat. \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Utilisateur\"), \" (identif\\xE9e par son courriel) est la t\\xEAte d'aggr\\xE9gat. \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Courriel\"), \" est un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"value object\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Dans le package \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"persistence.accesdonnees\"), \" nous avons \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"UtilisateurJSON\"), \" qui repr\\xE9sente la structure de donn\\xE9es d'un utilisateur au format JSON et \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"UtilisationJSONDAO\"), \" pour lire et \\xE9crire des utilisateurs dans un fichier.\")), mdx(\"p\", null, \"Votre premier exercice consiste \\xE0 cr\\xE9er une interface \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"UtilisateurRepository\"), \" ainsi qu'une impl\\xE9mentation de cette interface qui utilisera la DAO et les structures de donn\\xE9es pour lire et \\xE9crire dans un fichier.\\nPour cela, il faut faire compiler puis passer les tests dans la classe \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"_exercice1.UtilisateurRepositoryJSONTest\"), \".\"), mdx(\"p\", null, \"Conseils :\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Assurez vous de cr\\xE9er les bonnes classes et interfaces aux bons endroits.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Faites passer les tests un \\xE0 la fois\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Une fois tous les tests unitaires au vert, vous pouvez verifier vos r\\xE9sultats avec un scenario d'ensemble dans \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"_exercice1.UtilisateurRepositoryJSONVerificationComplete\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ne modifiez pas le code fourni, vous devez seulement cr\\xE9er du nouveau code qui utilise l'existant.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ne vous pr\\xE9-occupez pas trop de la gestion d'erreurs et de fonctionnalit\\xE9s avanc\\xE9es. Le but est de bien comprendre le lien entre aggr\\xE9gats et repository ainsi que de placer les interfaces et impl\\xE9mentations aux bons endroits. Nous n'essayons pas de faire un repository parfait.\")), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"p\", null, \"Liste de v\\xE9rification\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Est-ce que votre interface \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"UtilisateurRepository\"), \" se trouve bien dans le package \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"domain\"), \"? (normalement dans \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"domain.utilisateurs\"), \")?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Est-ce que votre impl\\xE9mentation \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"UtilisateurRepositoryJSON\"), \" se trouve bien dans le package \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"persistence\"), \"? Est-ce que le \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"UtilisateurJSONDAO\"), \" est utilis\\xE9 par le \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"UtilisateurRepositoryJSON\"), \" pour ses op\\xE9rations?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"N'y a-t-il bien aucune d\\xE9pendance de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"domain\"), \" vers \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"persistence\"), \"?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tous les tests de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"_exercice1\"), \" sont au vert?\"))), mdx(\"h3\", null, \"Aggr\\xE9gat Forum\"), mdx(\"p\", null, \"Passons maintenant \\xE0 l'aggr\\xE9gat \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Forum\"), \" qui contient des \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Message\"), \"s organis\\xE9s en \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SousForum\"), \"s et qui peuvent avoir des \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Reponse\"), \"s associ\\xE9es.\\nDe la m\\xEAme facon que pour \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Utilisateur\"), \", vous avez du code de DAO et des structures de donn\\xE9es JSON qui sont fournies.\"), mdx(\"p\", null, \"Avant de vous lancer dans la cr\\xE9ation des repository, \\xE9tudiez bien le code du domaine. Une erreur s'est gliss\\xE9e dans la conception des aggr\\xE9gats, pouvez-vous la rep\\xE9rer?\"), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"p\", null, \"Comparez le champ \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"auteur\"), \" de \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Message\"), \" et de \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Reponse\"), \".\"), mdx(\"p\", null, \"Pour l'un, nous avons un value-object \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Courriel\"), \", l'autre r\\xE9f\\xE9rence l'aggr\\xE9gat \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Utilisateur\"), \" directement. Il est tr\\xE8s rare et peu recommand\\xE9 qu'un aggr\\xE9gat r\\xE9f\\xE9rence un autre aggr\\xE9gat. \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Message\"), \" et \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Reponse\"), \" doivent utiliser \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Courriel\"), \" tous les deux.\")), mdx(\"p\", null, \"Proc\\xE9dez \\xE0 la correction n\\xE9cessaire. Le compilateur vous guidera vers d'autres erreurs \\xE0 corriger ce qui ne devrait pas vous prendre trop de temps.\\nUne fois cette correction faite, vous pouvez commencer \\xE0 impl\\xE9menter l'interface \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"ForumRepository\"), \" en cr\\xE9ant un Repository capable d'interagir avec les DAO JSON fournies. Les tests dans \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"_exercice2.ForumRepositoryJSONTest\"), \" sont la pour vous guider.\\nEncore une fois, il n'est pas question d'impl\\xE9menter un Repository parfait avec de nombreuses fonctionnalit\\xE9s et une gestion d'erreur en b\\xE9ton. Concentrez vous sur\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Comprendre qu'un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Repository\"), \" est responsable de la persistence d'un aggr\\xE9gat correspondant (dans notre cas, simple lecture et \\xE9criture)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Faire passer les tests, une \\xE9tape \\xE0 la fois en \\xE9crivant du code propre. Souvenez vous des ateliers de r\\xE9usinage et des principes OO pourra vous aider \\xE0 maintenir votre code lisible et maintenable.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Respecter le sens des d\\xE9pendances (l'interface vs l'impl\\xE9mentation du repository, dans quel couche etc.)\")), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"p\", null, \"Liste de v\\xE9rification\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Est-ce que votre interface \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"ForumRepository\"), \" se trouve bien dans le package \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"domain\"), \"? (normalement dans \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"domain.messages\"), \")?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Est-ce que votre impl\\xE9mentation \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"ForumRepositoryJSON\"), \" se trouve bien dans le package \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"persistence\"), \"? Est-ce qu'elle utilise les DAO pour les \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SousForum\"), \", les \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Message\"), \" et les \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"Reponse\"), \"?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"N'y a-t-il bien aucune d\\xE9pendance de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"domain\"), \" vers \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"persistence\"), \"?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tous les tests de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"_exercice2.ForumRepositoryJSONTest\"), \" sont au vert?\"))), mdx(\"h2\", null, \"Pour aller plus loin\"), mdx(\"p\", null, \"Ce \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://www.dddcommunity.org/wp-content/uploads/files/pdf_articles/Vernon_2011_1.pdf\"\n  }), \"document de r\\xE9f\\xE9rence\"), \" de Vaugh Vernon offre une bonne vue d'ensemble sur la conception des aggr\\xE9gats :\\nIl est fortement recommand\\xE9 de le lire.\"));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"slug":"ateliers/ddd/agregats-repo","title":"DDD : Agrégats et repositories","type":"homework","time":null}}},"pageContext":{"slug":"ateliers/ddd/agregats-repo","previous":null,"next":null,"breadcrumbs":[{"url":"/curriculum","label":"Curriculum"},{"label":"Semaine 11"},{"label":"Atelier de la semaine"},{"url":"/lectures/ateliers/ddd/agregats-repo","label":"DDD : Agrégats et repositories"}]}}}