{"componentChunkName":"component---src-templates-lecture-template-js","path":"/lectures/ateliers/ddd/agregats-base","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-base\",\n  \"title\": \"DDD : Agrégats\",\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 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(\"h2\", null, \"Vue d'ensemble\"), mdx(\"p\", null, \"Un aggr\\xE9gat est un regroupement d'objets. C'est un concept assez simple mais qui cache de nombreuses subtilit\\xE9s. Commen\\xE7ons par les r\\xE8gles de base d'un aggr\\xE9gat\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Une fronti\\xE8re claire : les objets qui font partie de l'aggr\\xE9gat sont internes \\xE0 celui ci, les objets qui n'en font pas partie sont externes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Un point d'entr\\xE9e unique : les objets externes inter-agissent avec l'aggr\\xE9gat via un seul objet qui s'appelle la t\\xEAte d'aggr\\xE9gat.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"R\\xE8gle fondamentale d'un aggr\\xE9gat : tous les interactions provenant d'objets externes doivent passer par la t\\xEAte d'aggr\\xE9gat\")), mdx(\"p\", null, \"Cela signifie que les objets externes ne peuvent pas manipuler les objets internes, ils ne peuvent interagir qu'avec la t\\xEAte d'aggr\\xE9gat. G\\xE9n\\xE9ralement, les aggr\\xE9gats ne doivent pas avoir de \\\"fuites\\\", c'est \\xE0 dire que la t\\xEAte d'aggr\\xE9gat ne doit pas passer de r\\xE9f\\xE9rences vers ses objets internes \\xE0 l'ext\\xE9rieur.\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1024\",\n      \"margin\": \"0\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/2ff25facd0a961a1f9611c0a0f8f53e5/7e4a6/agregat-vue-ensemble.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"74.84662576687117%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Vue d'ensemble d'un agregat\",\n    \"title\": \"Vue d'ensemble d'un agregat\",\n    \"src\": \"/static/2ff25facd0a961a1f9611c0a0f8f53e5/a6d36/agregat-vue-ensemble.png\",\n    \"srcSet\": [\"/static/2ff25facd0a961a1f9611c0a0f8f53e5/222b7/agregat-vue-ensemble.png 163w\", \"/static/2ff25facd0a961a1f9611c0a0f8f53e5/ff46a/agregat-vue-ensemble.png 325w\", \"/static/2ff25facd0a961a1f9611c0a0f8f53e5/a6d36/agregat-vue-ensemble.png 650w\", \"/static/2ff25facd0a961a1f9611c0a0f8f53e5/7e4a6/agregat-vue-ensemble.png 952w\"],\n    \"sizes\": \"(max-width: 650px) 100vw, 650px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(\"h2\", null, \"Pourquoi des aggr\\xE9gats?\"), mdx(\"p\", null, \"\\xC0 votre avis, pourquoi utiliser des aggr\\xE9gats dans votre domaine?\\nA. Rendre les objets internes immuables\\nB. Simplifier les interactions entre les objets du domaine\\nC. Pr\\xE9server des r\\xE8gles d'int\\xE9grit\\xE9 du domaine\\nD. Rendre le cours plus compliqu\\xE9 pour les \\xE9tudiants\"), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"p\", null, \"R\\xE9ponse B et C :\"), mdx(\"p\", null, \"B: Tr\\xE8s souvent, la complexit\\xE9 du domaine, et notamment les interactions/relations entre ses diff\\xE9rents concepts, ne peut \\xEAtre repr\\xE9sent\\xE9e telle qu'elle dans le code. C'est une sur-simplification de penser que l'orient\\xE9 objet a pour but de repr\\xE9senter la r\\xE9alit\\xE9. En emp\\xEAchant des interactions directs avec ses objets internes, l'aggr\\xE9gat permet de simplifier le mod\\xE8le d'interaction dans le code.\"), mdx(\"p\", null, \"C: La t\\xEAte d'aggr\\xE9gat joue un r\\xF4le cl\\xE9 pour maintenir l'int\\xE9grit\\xE9 du domaine. En tant que point d'entr\\xE9e des interactions externes \\xE0 l'aggr\\xE9gat, elle s'assure que l'\\xE9tat interne de l'aggr\\xE9gat reste coh\\xE9rent dans le temps.\"), mdx(\"p\", null, \"La r\\xE9ponse A est fausse car on n'emp\\xEAche pas les objets internes de changer, on veut simplement contr\\xF4ler la fa\\xE7on dont ils sont manipul\\xE9s.\"), mdx(\"p\", null, \"La r\\xE9ponse D est fausse car le cours est assez compliqu\\xE9 sans devoir en rajouter :)\")), mdx(\"h2\", null, \"Exercice\"), mdx(\"p\", null, \"Notre logiciel de gestion de clinique a du succ\\xE8s, de nouveaux besoins apparaissent notamment pour g\\xE9rer l'assurabilit\\xE9 des patients.\\nOuvrez le code dans \", mdx(\"a\", _extends({\n    parentName: \"p\"\n  }, {\n    \"href\": \"https://github.com/GLO4002UL/officiel-ddd-aggregats-base\"\n  }), \"ce repository github\"), \", vous y trouverez un exemple d'aggr\\xE9gat :\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"la t\\xEAte d'aggr\\xE9gat est \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\"), \", elle contient un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\"), \" contient les dates significatives dans la vie du patient (naissance, inscription, d\\xE9c\\xE8s) ainsi que la liste des \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SejoursHorsQuebec\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SejourHorsQuebec\"), \" contient une date de d\\xE9part, une dur\\xE9e en jours et une raison (s\\xE9jour personnel ou professionel/\\xE9tudes)\")), mdx(\"p\", null, \"Prenez le temps de lire le code, quel diagramme correspond au design de ce code?\"), mdx(\"p\", null, mdx(\"span\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1024\",\n      \"margin\": \"0\"\n    }\n  }), \"\\n      \", mdx(\"a\", _extends({\n    parentName: \"span\"\n  }, {\n    \"className\": \"gatsby-resp-image-link\",\n    \"href\": \"/static/f6f4d53d7a4ad8bb2915fa574877f3af/a88f6/agregat-diagrammes.png\",\n    \"style\": {\n      \"display\": \"block\"\n    },\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }), \"\\n    \", mdx(\"span\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"46.012269938650306%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"display\": \"block\"\n    }\n  })), \"\\n  \", mdx(\"img\", _extends({\n    parentName: \"a\"\n  }, {\n    \"className\": \"gatsby-resp-image-image\",\n    \"alt\": \"Diagramme\",\n    \"title\": \"Diagramme\",\n    \"src\": \"/static/f6f4d53d7a4ad8bb2915fa574877f3af/a6d36/agregat-diagrammes.png\",\n    \"srcSet\": [\"/static/f6f4d53d7a4ad8bb2915fa574877f3af/222b7/agregat-diagrammes.png 163w\", \"/static/f6f4d53d7a4ad8bb2915fa574877f3af/ff46a/agregat-diagrammes.png 325w\", \"/static/f6f4d53d7a4ad8bb2915fa574877f3af/a6d36/agregat-diagrammes.png 650w\", \"/static/f6f4d53d7a4ad8bb2915fa574877f3af/e548f/agregat-diagrammes.png 975w\", \"/static/f6f4d53d7a4ad8bb2915fa574877f3af/3c492/agregat-diagrammes.png 1300w\", \"/static/f6f4d53d7a4ad8bb2915fa574877f3af/a88f6/agregat-diagrammes.png 1900w\"],\n    \"sizes\": \"(max-width: 650px) 100vw, 650px\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    },\n    \"loading\": \"lazy\"\n  })), \"\\n  \"), \"\\n    \")), mdx(Solution, {\n    mdxType: \"Solution\"\n  }, mdx(\"p\", null, \"Reponse 1.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"La reponse 2 est fausse car un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\"), \" ne donne pas acc\\xE8s \\xE0 \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\"), \" (pas de m\\xE9thode \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"obtenirHistorique\"), \"). Cela briserait l'encapsulation de l'aggr\\xE9gat.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"La reponse 3 est fausse car un \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\"), \" n'a pas de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SejourHorsQuebec\"), \" directement.\"))), mdx(\"h2\", null, \"Implementation de l'agregat\"), mdx(\"p\", null, \"Ouvrez le code dans le projet clinic-aggregate, votre but est de faire passer les tests unitaires en implementant l'aggregat \", mdx(\"code\", _extends({\n    parentName: \"p\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\"), \".\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Commencez par faire passer les tests de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"SejourHorsQuebec\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Ensuite, faites passer les tests de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"HistoriquePatient\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Terminez par faire passer les tests de \", mdx(\"code\", _extends({\n    parentName: \"li\"\n  }, {\n    \"className\": \"language-text\"\n  }), \"PatientAssurable\"))), mdx(\"p\", null, \"Pour chaque serie de test, facilitez-vous la vie en les faisant passer un \\xE0 la fois et non tous d'un coup !\"));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"slug":"ateliers/ddd/agregats-base","title":"DDD : Agrégats","type":"homework","time":null}}},"pageContext":{"slug":"ateliers/ddd/agregats-base","previous":null,"next":"/lectures/ateliers/refactoring/delegates","breadcrumbs":[{"url":"/curriculum","label":"Curriculum"},{"label":"Semaine 3"},{"label":"Atelier de la semaine"},{"url":"/lectures/ateliers/ddd/agregats-base","label":"DDD : Agrégats"}]}}}