{"id":9930,"date":"2026-07-24T15:39:20","date_gmt":"2026-07-24T07:39:20","guid":{"rendered":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/"},"modified":"2026-07-26T17:26:05","modified_gmt":"2026-07-26T09:26:05","slug":"a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples","status":"publish","type":"post","link":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","title":{"rendered":"Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML"},"content":{"rendered":"<h1 class=\"qwen-markdown-heading\" dir=\"ltr\"><span class=\"qwen-markdown-text\" data-spm-anchor-id=\"a2ty_o01.29997173.0.i225.290055fbrGIlFE\">Introduction<\/span><\/h1>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Alors que le langage de mod\u00e9lisation unifi\u00e9 (UML) est la norme incontest\u00e9e de l&#8217;industrie pour visualiser l&#8217;architecture logicielle, il pr\u00e9sente une limitation intrins\u00e8que : les diagrammes sont excellents pour montrer <\/span><em class=\"qwen-markdown-em\" dir=\"ltr\"><span class=\"qwen-markdown-text\">ce que<\/span><\/em><span class=\"qwen-markdown-text\">un syst\u00e8me est compos\u00e9 de, mais ils ont du mal \u00e0 exprimer les r\u00e8gles m\u00e9tier complexes et nuanc\u00e9es qui r\u00e9gissent <\/span><em class=\"qwen-markdown-em\" dir=\"ltr\"><span class=\"qwen-markdown-text\">comment<\/span><\/em><span class=\"qwen-markdown-text\">il se comporte. Se fier uniquement aux \u00e9l\u00e9ments visuels comme les multiplicit\u00e9s et les types de base laisse souvent la logique critique du syst\u00e8me ambigu\u00eb, entra\u00eenant des malentendus pendant la phase de d\u00e9veloppement.<\/span><\/div>\n<div class=\"qwen-markdown-space\"><\/div>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Entrez le <\/span><strong class=\"qwen-markdown-strong\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Langage de contrainte des objets (OCL)<\/span><\/strong><span class=\"qwen-markdown-text\">. Si UML est le \u00ab squelette \u00bb de votre mod\u00e8le syst\u00e8me, OCL est le \u00ab syst\u00e8me nerveux \u00bb : il fournit des r\u00e8gles pr\u00e9cises, inambigu\u00ebs et formelles qui d\u00e9terminent le fonctionnement du squelette. En int\u00e9grant OCL \u00e0 UML, les concepteurs peuvent combler le foss\u00e9 entre la conception visuelle de haut niveau et la sp\u00e9cification math\u00e9matique rigoureuse, sans avoir \u00e0 \u00e9crire de code r\u00e9el.<\/span><\/div>\n<div class=\"qwen-markdown-space\"><\/div>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Ce guide complet explore la puissante synergie entre UML et OCL. Nous allons d\u00e9composer les concepts fondamentaux d&#8217;OCL, d\u00e9montrer comment attacher des contraintes aux classes, aux op\u00e9rations et aux machines \u00e0 \u00e9tats, et fournir des exemples pratiques et reproductibles <\/span><strong class=\"qwen-markdown-strong\" dir=\"ltr\"><span class=\"qwen-markdown-text\">PlantUML<\/span><\/strong><span class=\"qwen-markdown-text\">exemples. Que vous soyez en train de d\u00e9finir des invariants de classe simples ou d&#8217;\u00e9crire des r\u00e8gles m\u00e9tier complexes sur des associations crois\u00e9es, ce guide vous dotera des connaissances n\u00e9cessaires pour transformer vos mod\u00e8les de simples croquis en sp\u00e9cifications robustes et de qualit\u00e9 ing\u00e9nierie.<\/span><\/div>\n<p id=\"VRRnBro\"><img alt=\"UML + OCL = Unambiguous Design by Visual Paradigm\n\" class=\"alignnone wp-image-25380 size-full\" decoding=\"async\" height=\"928\" loading=\"lazy\" sizes=\"auto, (max-width: 1664px) 100vw, 1664px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png 1664w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9-300x167.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9-1030x574.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9-768x428.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9-1536x857.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9-150x84.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9-400x223.png 400w\" width=\"1664\"\/><\/p>\n<p data-nodeid=\"44739\">\n<p>Alors que UML (langage de mod\u00e9lisation unifi\u00e9) est exceptionnel pour visualiser le\u00a0<strong data-nodeid=\"44816\">structure<\/strong>\u00a0d&#8217;un syst\u00e8me, il manque de pr\u00e9cision pour exprimer des\u00a0<strong data-nodeid=\"44817\">r\u00e8gles m\u00e9tier et s\u00e9mantiques<\/strong>. C&#8217;est l\u00e0 que le\u00a0<strong data-nodeid=\"44818\">Langage de contrainte des objets (OCL)<\/strong>\u00a0intervient. OCL agit comme le \u00ab ciment \u00bb formel qui lie les diagrammes UML \u00e0 une logique m\u00e9tier stricte et inambigu\u00eb.<\/p>\n<p data-nodeid=\"44740\">Ce guide explique comment OCL s&#8217;int\u00e8gre \u00e0 UML, les concepts cl\u00e9s que vous devez conna\u00eetre, et fournit des exemples pratiques\u00a0<strong data-nodeid=\"44824\">PlantUML<\/strong>\u00a0exemples pour visualiser ces contraintes.<\/p>\n<hr data-nodeid=\"44741\"\/>\n<h2 data-nodeid=\"44742\">1. La synergie : comment OCL compl\u00e8te UML<\/h2>\n<p data-nodeid=\"44743\">Imaginez UML comme le \u00ab squelette \u00bb de votre syst\u00e8me (classes, associations, \u00e9tats) et OCL comme le \u00ab syst\u00e8me nerveux \u00bb (les r\u00e8gles, conditions et logique qui r\u00e9gissent le comportement du squelette).<\/p>\n<h3 data-nodeid=\"44744\">Repr\u00e9sentation visuelle dans UML<\/h3>\n<p data-nodeid=\"44745\">Dans UML standard, les contraintes OCL sont g\u00e9n\u00e9ralement repr\u00e9sent\u00e9es \u00e0 l&#8217;aide de\u00a0<strong data-nodeid=\"44841\">Notes<\/strong>\u00a0attach\u00e9es aux \u00e9l\u00e9ments de mod\u00e8le pertinents (classes, op\u00e9rations ou \u00e9tats).<\/p>\n<ul data-nodeid=\"44746\">\n<li data-nodeid=\"44747\">\n<p data-nodeid=\"44748\"><strong data-nodeid=\"44848\">St\u00e9r\u00e9otype :<\/strong>Souvent, les notes contenant de l&#8217;OCL re\u00e7oivent le<code data-backticks=\"1\" data-nodeid=\"44846\">{contrainte}<\/code>\u00a0st\u00e9r\u00e9otype.<\/p>\n<\/li>\n<li data-nodeid=\"44749\">\n<p data-nodeid=\"44750\"><strong data-nodeid=\"44855\">Contexte\u00a0:<\/strong>\u00a0Toute expression OCL commence par un\u00a0<code data-backticks=\"1\" data-nodeid=\"44853\">contexte<\/code>\u00a0mot-cl\u00e9, d\u00e9clarant quel \u00e9l\u00e9ment UML la r\u00e8gle s&#8217;applique.<\/p>\n<\/li>\n<\/ul>\n<hr data-nodeid=\"44751\"\/>\n<h2 data-nodeid=\"44752\">2. Concepts cl\u00e9s de l&#8217;OCL dans UML<\/h2>\n<h3 data-nodeid=\"44753\">A. Invariants de classe (<code data-backticks=\"1\" data-nodeid=\"44858\">inv<\/code>)<\/h3>\n<p data-nodeid=\"44754\">Les invariants sont des conditions qui doivent\u00a0<strong data-nodeid=\"44865\">toujours \u00eatre vraies<\/strong>\u00a0pour chaque instance d&#8217;une classe, ind\u00e9pendamment des op\u00e9rations appel\u00e9es.<\/p>\n<p data-nodeid=\"44755\"><strong data-nodeid=\"44870\">Concept cl\u00e9\u00a0:<\/strong>\u00a0Si un invariant est viol\u00e9, le syst\u00e8me se trouve dans un \u00e9tat invalide.<\/p>\n<p id=\"xgWMdFF\"><img alt=\"\" class=\"alignnone size-full wp-image-25373\" decoding=\"async\" height=\"868\" loading=\"lazy\" sizes=\"auto, (max-width: 1917px) 100vw, 1917px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314b03109d.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314b03109d.png 1917w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314b03109d-300x136.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314b03109d-1030x466.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314b03109d-768x348.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314b03109d-1536x695.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314b03109d-150x68.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314b03109d-400x181.png 400w\" width=\"1917\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">Plantuml<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:PPBFQiCm3CRlWRo3O9SjeoE7xR30Hl-mGc5iq3w1ugYfgICNMqdBnjvzThAMhht9-Zv9FmcFlQ2JjZ5fuhUQT-Ym0MNG-uc8qsKhj52ML_gB83_ti1MQejhMphPSpQon3cxcy_dpx35DqgHl0LFaxKIfu13uJXE04U3m_6YRabm1gp24wq4gqI0hAc19Q8QKzfyTkShXMjuOIqDL0LDh3I57mptijMo2lB_59hOTQky6hQATzLekfP_85_71wNeZODVddB4qosOz_e8xT1fPV95bKGYN43h8fRzd7OLipmyA6PW2DvGKWXf5TmGj6mezxN6Vi1lGi5EirzmT3x1iJJX2J09uCkk7lpoyla0EuSvzyleqPoWd2Onkj4Iai37GGH5Ly9Jdnv4ddFVe-pVrUW3ePcSq-IkgKT-HkEg_HPgCGnZ-r2y0\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">Plantuml<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:PLBHIWCn47m_k7yOy4KhbJxeWmL5AnO4KT0lsDvjwzfSSYQRAeeVL7-ZFsRIir3Rbv3CxipE3haAIbvZOyeYpCMsvAb1PIY4QrKlawXyLpdxB9-CmNQFTSeZgkOpxwAjRvnn7WVZyVZyvhGioc8jWH7P-NLLfGx5Lra0VL3tV8ZDXFqGpsc8dNMb2Hco5G_nn6GwICBZWdtjQQgtbYQ6wo56pXaccnkEyIxwaihlXzHasOvxrDLgRbqGtIrzPt_PFhpCNXHkkkqpKtkzExiWBsGr99Kk3yQmrylL58VoX-wIreRxk6S4PnB9CbgEYbTgI09MF-eJk5hEI6MAG34T0iEeLyiaajPKS51GLESbh9PPKEnY4yjJD2cQ30A1pVJa3yVb1GPmiGFt0zlsHZ3IIDgy_ZTsOxMbaE4sR-jnDXXiBBYDvdsc_tEnFn3Ij4RU8k_PxAybsTRhtrCML-cQljul\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"44756\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nskinparam classAttributeIconSize 0\r\nskinparam noteBackgroundColor #FFF9C4\r\n\r\nclass BankAccount {\r\n  - accountNumber: String\r\n  - balance: Real\r\n  - isOverdraftEnabled: Boolean\r\n  + withdraw(amount: Real)\r\n  + deposit(amount: Real)\r\n}\r\n\r\nnote right of BankAccount\r\n  **Invariants de classe :**\r\n  context BankAccount\r\n  \r\n  -- Le solde ne peut jamais \u00eatre n\u00e9gatif sauf si le d\u00e9couvert est autoris\u00e9\r\n  inv balanceRule: \r\n    self.balance &gt;= 0 ou self.isOverdraftEnabled\r\n  \r\n  -- La limite de d\u00e9couvert ne peut pas d\u00e9passer 500\r\n  inv overdraftLimit: \r\n    self.isOverdraftEnabled implique self.balance &gt;= -500\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:PLBHIWCn47m_k7yOy4KhbJxeWmL5AnO4KT0lsDvjwzfSSYQRAeeVL7-ZFsRIir3Rbv3CxipE3haAIbvZOyeYpCMsvAb1PIY4QrKlawXyLpdxB9-CmNQFTSeZgkOpxwAjRvnn7WVZyVZyvhGioc8jWH7P-NLLfGx5Lra0VL3tV8ZDXFqGpsc8dNMb2Hco5G_nn6GwICBZWdtjQQgtbYQ6wo56pXaccnkEyIxwaihlXzHasOvxrDLgRbqGtIrzPt_PFhpCNXHkkkqpKtkzExiWBsGr99Kk3yQmrylL58VoX-wIreRxk6S4PnB9CbgEYbTgI09MF-eJk5hEI6MAG34T0iEeLyiaajPKS51GLESbh9PPKEnY4yjJD2cQ30A1pVJa3yVb1GPmiGFt0zlsHZ3IIDgy_ZTsOxMbaE4sR-jnDXXiBBYDvdsc_tEnFn3Ij4RU8k_PxAybsTRhtrCML-cQljul\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:PPBFQiCm3CRlWRo3O9SjeoE7xR30Hl-mGc5iq3w1ugYfgICNMqdBnjvzThAMhht9-Zv9FmcFlQ2JjZ5fuhUQT-Ym0MNG-uc8qsKhj52ML_gB83_ti1MQejhMphPSpQon3cxcy_dpx35DqgHl0LFaxKIfu13uJXE04U3m_6YRabm1gp24wq4gqI0hAc19Q8QKzfyTkShXMjuOIqDL0LDh3I57mptijMo2lB_59hOTQky6hQATzLekfP_85_71wNeZODVddB4qosOz_e8xT1fPV95bKGYN43h8fRzd7OLipmyA6PW2DvGKWXf5TmGj6mezxN6Vi1lGi5EirzmT3x1iJJX2J09uCkk7lpoyla0EuSvzyleqPoWd2Onkj4Iai37GGH5Ly9Jdnv4ddFVe-pVrUW3ePcSq-IkgKT-HkEg_HPgCGnZ-r2y0\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"44757\">B. Contrats d&#8217;op\u00e9ration (<code data-backticks=\"1\" data-nodeid=\"44872\">pr\u00e9<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44874\">post<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44876\">corps<\/code>)<\/h3>\n<p data-nodeid=\"44758\">Les op\u00e9rations (m\u00e9thodes) peuvent avoir des contraintes qui d\u00e9finissent leur comportement avant et apr\u00e8s l&#8217;ex\u00e9cution.<\/p>\n<ul data-nodeid=\"44759\">\n<li data-nodeid=\"44760\">\n<p data-nodeid=\"44761\"><strong data-nodeid=\"44891\">Pr\u00e9-condition (<code data-backticks=\"1\" data-nodeid=\"44881\">pr\u00e9<\/code>):<\/strong>\u00a0Ce qui doit \u00eatre vrai\u00a0<em data-nodeid=\"44892\">avant<\/em>\u00a0l&#8217;op\u00e9ration commence. (Responsabilit\u00e9 de l&#8217;appelant).<\/p>\n<\/li>\n<li data-nodeid=\"44762\">\n<p data-nodeid=\"44763\"><strong data-nodeid=\"44905\">Post-condition (<code data-backticks=\"1\" data-nodeid=\"44895\">post<\/code>):<\/strong>\u00a0Ce qui sera vrai\u00a0<em data-nodeid=\"44906\">apr\u00e8s<\/em>\u00a0l&#8217;op\u00e9ration se termine. (Garantie de l&#8217;op\u00e9ration).<\/p>\n<\/li>\n<li data-nodeid=\"44764\">\n<p data-nodeid=\"44765\"><strong data-nodeid=\"44913\">Corps (<code data-backticks=\"1\" data-nodeid=\"44909\">corps<\/code>):<\/strong> D\u00e9finit la valeur de retour exacte pour les op\u00e9rations de requ\u00eate.<\/p>\n<\/li>\n<\/ul>\n<p id=\"sBOPitg\"><img alt=\"\" class=\"alignnone size-full wp-image-25374\" decoding=\"async\" height=\"875\" loading=\"lazy\" sizes=\"auto, (max-width: 1916px) 100vw, 1916px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314dc4244d.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314dc4244d.png 1916w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314dc4244d-300x137.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314dc4244d-1030x470.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314dc4244d-768x351.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314dc4244d-1536x701.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314dc4244d-150x69.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6314dc4244d-400x183.png 400w\" width=\"1916\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">Plantuml<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:TL9RIyCm57ulz3ySy6MhLdmHj8oo2nDySbx-G9QSTM5f4f8JS8h_tIGLwHXxA-TyrvFEFJ57eLTbuGzIM-PO3rmnxnT4Jcu3uJCt-br-8ToDCTeGBXa_TCu4BLP66GTNwuUd-_LZMPH5be3tlR5MwcuLFU2xB01ga8IzRs39kjd66H4ujSE2336rwACSDV26JANnDV0zyeC9D9ccAKTfQLXqI1-9CYmI_2Svfs3WPBSdCBkJ18bMLIyM7IDfDAoC9iSu-QQgqYx7g67Zi8wLXKoW1dBsFdXAbM6BWBsbOy964E4ddNWqpOMyrc437jNkDX-WRgFQEYbDfcDlu-dCNFhiAL7SW1iKqwn3dPgWoFAHUAel_PyyC2qYpmT5C6j11wL6ZaiZZWsy1dH7CF-d4RYJEcUuNFJy_W3Rh3QEmOrIo6bYdUGuhLiV-jGOOwRqKcKnZv_n__i5\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">Plantuml<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:VPBHIkGm58Rl2ts70tlXpAmLRuIroA2E8ooiCAo-GBOzhS4qgISdY-wopoFrDV9YUz8gL4Jlalxvyt_dJqyzA-BGcJppTzhsYbG7bL7Udp6J_XKOlrVENki_28VpCzOndglghYKNRBrnnX5ysNwxFDeUvrcUZLV0JbcDT5RTAlRmDyy02f0uNHdq9PohzcH7hWwQrvFMESlAyerZPKhu6GSqIVWAs3HOSK3QAOqTMbuiHSVu52QzHRwQUKTrSlzBD0aMIBUt3AvvGvNigzL6l9GOwptNnq6MsbaeLwiaZsW5x2WEXLHHwqc47mZzU1DOXDffbgs7-Co4y5lNc7nodl61tqIMvUVJz8GbU3JDmMjLnLe6s7OzFowMSoBd-GCYz9mOuh0FmGAbgyTlRHoip1U7CKZyxvAqVma2PMjn-c0OJjPWWp6px8sZtalaHHmQRIU06i7C-vCzuNsGHZxfukENImu9UKTOEMEalaLF-c5Ph7teKYiejEcPy-nKbl93_mS0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"44766\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nskinparam classAttributeIconSize 0\r\nskinparam noteBackgroundColor #E8F5E9\r\n\r\nclass PanierAchats {\r\n  - articles: Bag&lt;Produit&gt;\r\n  - montantTotal: R\u00e9el\r\n  + effectuerPaiement(): Re\u00e7u\r\n  + getMontantTotal(): R\u00e9el\r\n}\r\n\r\nnote right of PanierAchats\r\n  **Contrats d'op\u00e9ration :**\r\n  \r\n  -- Pr\u00e9-condition : Le panier ne doit pas \u00eatre vide\r\n  context PanierAchats::effectuerPaiement(): Re\u00e7u\r\n  pre: self.articles-&gt;notEmpty()\r\n  \r\n  -- Post-condition : Le panier est vid\u00e9, un re\u00e7u est g\u00e9n\u00e9r\u00e9\r\n  post: self.articles-&gt;isEmpty() and result &lt;&gt; null\r\n  \r\n  -- Corps : D\u00e9finition de l'op\u00e9ration de requ\u00eate\r\n  context PanierAchats::getMontantTotal(): R\u00e9el\r\n  corps: self.articles-&gt;collect(prix)-&gt;sum()\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:VPBHIkGm58Rl2ts70tlXpAmLRuIroA2E8ooiCAo-GBOzhS4qgISdY-wopoFrDV9YUz8gL4Jlalxvyt_dJqyzA-BGcJppTzhsYbG7bL7Udp6J_XKOlrVENki_28VpCzOndglghYKNRBrnnX5ysNwxFDeUvrcUZLV0JbcDT5RTAlRmDyy02f0uNHdq9PohzcH7hWwQrvFMESlAyerZPKhu6GSqIVWAs3HOSK3QAOqTMbuiHSVu52QzHRwQUKTrSlzBD0aMIBUt3AvvGvNigzL6l9GOwptNnq6MsbaeLwiaZsW5x2WEXLHHwqc47mZzU1DOXDffbgs7-Co4y5lNc7nodl61tqIMvUVJz8GbU3JDmMjLnLe6s7OzFowMSoBd-GCYz9mOuh0FmGAbgyTlRHoip1U7CKZyxvAqVma2PMjn-c0OJjPWWp6px8sZtalaHHmQRIU06i7C-vCzuNsGHZxfukENImu9UKTOEMEalaLF-c5Ph7teKYiejEcPy-nKbl93_mS0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:TL9RIyCm57ulz3ySy6MhLdmHj8oo2nDySbx-G9QSTM5f4f8JS8h_tIGLwHXxA-TyrvFEFJ57eLTbuGzIM-PO3rmnxnT4Jcu3uJCt-br-8ToDCTeGBXa_TCu4BLP66GTNwuUd-_LZMPH5be3tlR5MwcuLFU2xB01ga8IzRs39kjd66H4ujSE2336rwACSDV26JANnDV0zyeC9D9ccAKTfQLXqI1-9CYmI_2Svfs3WPBSdCBkJ18bMLIyM7IDfDAoC9iSu-QQgqYx7g67Zi8wLXKoW1dBsFdXAbM6BWBsbOy964E4ddNWqpOMyrc437jNkDX-WRgFQEYbDfcDlu-dCNFhiAL7SW1iKqwn3dPgWoFAHUAel_PyyC2qYpmT5C6j11wL6ZaiZZWsy1dH7CF-d4RYJEcUuNFJy_W3Rh3QEmOrIo6bYdUGuhLiV-jGOOwRqKcKnZv_n__i5\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"44767\">C. Valeurs d\u00e9riv\u00e9es et initiales (<code data-backticks=\"1\" data-nodeid=\"44915\">d\u00e9riv\u00e9<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44917\">init<\/code>)<\/h3>\n<p data-nodeid=\"44768\">Au lieu de stocker des donn\u00e9es redondantes, UML permet de marquer les attributs comme \u00e9tant<code data-backticks=\"1\" data-nodeid=\"44920\">{d\u00e9riv\u00e9}<\/code>\u00a0ou\u00a0<code data-backticks=\"1\" data-nodeid=\"44922\">{initial}<\/code>, avec OCL qui d\u00e9finit leur valeur exacte.<\/p>\n<p id=\"aQqRxLs\"><img alt=\"\" class=\"alignnone size-full wp-image-25375\" decoding=\"async\" height=\"868\" loading=\"lazy\" sizes=\"auto, (max-width: 1921px) 100vw, 1921px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63150cb1f64.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63150cb1f64.png 1921w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63150cb1f64-300x136.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63150cb1f64-1030x465.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63150cb1f64-768x347.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63150cb1f64-1536x694.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63150cb1f64-150x68.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63150cb1f64-400x181.png 400w\" width=\"1921\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">Plantuml<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:RP5FImCn4CNl2_iT1WJHXHRHMq3eV-Z5IyNxD3lT3iqc9Pc8Q-btDzcjHTHB23EFtxnvCmc2Nc9hoY8Ss1xHOmlQO0XJ4S_RABJMpcxua-3XfyOweHdgG-DTjFNS6UVXPlcqUbmjog8iUWGiswDn7H6SoW9W13lsGLwm9GMRHBVDKDwob_q29PNpEnHFDNb-f_eCsAJ6sWerv2yzjYoCvWmSfbgIJC7CEKDeuHd4nyGuPnlP9NXkzW9kTxMJ8LMr6FXmczWz3TxGH0ggghAWdpI2EHeTJNALRK3TMMnPep5TxgTaX3xa2bRgjzTX2GM1p6vytNFS4VgmOQlfrTNOtTt_cFZj9bqcJOr7Pq5xGc5d_v_v9uCiomcfInHaw_vUPJ59ttJiBm00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">Plantuml<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:RLBBQiCm4BmR_0yBFRGr99JsPYZa3RdqajBxnjuu8hAKhjQbRiW7z3TwQhx3FrR9CIQqlOZLxZ0pEzB82R9KfOuZjrDcZumbP1gT6ukmMbT2oyoQbVeWkBl462iqmMnNiArCFhNQCbpD7nRtYraSnL5B0VDohsrD18Su0XZ0Hh6J9omfXPLdDyMvlLOisncARuVpt3panEgDyYDWuGTB8rGGTpDbb2ZKHr1kd8c7fJ2nLXCQU0JXodCSWutW4bWLMm6xwUq4aYHvGKqLEyYRanTgJkI013fcVqcJ901RnG5CKMUL9WPztNmL13b1YKOrt-phsc2fNgkMsASbz2wzM9h-zdzUB0L7UZFiTn_MXEnMocJqR7EiRsulr9jFmTuR-AnTCA0HCcvEACgQ_wN_n1DWWIRjKYAJjqyPHoDV-d_m0m00\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"44769\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nskinparam classAttributeIconSize 0\r\nskinparam noteBackgroundColor #E3F2FD\r\n\r\nclass Employee {\r\n  - firstName: String\r\n  - birthDate: Date\r\n  - {derived} age: Integer\r\n  - {initial} isActive: Boolean = true\r\n}\r\n\r\nnote right of Employee\r\n  **Valeurs d\u00e9riv\u00e9es et initiales :**\r\n  \r\n  -- Calculer l'\u00e2ge de mani\u00e8re dynamique\r\n  context Employee::age: Integer\r\n  derive: self.birthDate.yearsSinceToday()\r\n  \r\n  -- \u00c9tat initial lors de la cr\u00e9ation\r\n  context Employee::isActive: Boolean\r\n  init: true\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:RLBBQiCm4BmR_0yBFRGr99JsPYZa3RdqajBxnjuu8hAKhjQbRiW7z3TwQhx3FrR9CIQqlOZLxZ0pEzB82R9KfOuZjrDcZumbP1gT6ukmMbT2oyoQbVeWkBl462iqmMnNiArCFhNQCbpD7nRtYraSnL5B0VDohsrD18Su0XZ0Hh6J9omfXPLdDyMvlLOisncARuVpt3panEgDyYDWuGTB8rGGTpDbb2ZKHr1kd8c7fJ2nLXCQU0JXodCSWutW4bWLMm6xwUq4aYHvGKqLEyYRanTgJkI013fcVqcJ901RnG5CKMUL9WPztNmL13b1YKOrt-phsc2fNgkMsASbz2wzM9h-zdzUB0L7UZFiTn_MXEnMocJqR7EiRsulr9jFmTuR-AnTCA0HCcvEACgQ_wN_n1DWWIRjKYAJjqyPHoDV-d_m0m00\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:RP5FImCn4CNl2_iT1WJHXHRHMq3eV-Z5IyNxD3lT3iqc9Pc8Q-btDzcjHTHB23EFtxnvCmc2Nc9hoY8Ss1xHOmlQO0XJ4S_RABJMpcxua-3XfyOweHdgG-DTjFNS6UVXPlcqUbmjog8iUWGiswDn7H6SoW9W13lsGLwm9GMRHBVDKDwob_q29PNpEnHFDNb-f_eCsAJ6sWerv2yzjYoCvWmSfbgIJC7CEKDeuHd4nyGuPnlP9NXkzW9kTxMJ8LMr6FXmczWz3TxGH0ggghAWdpI2EHeTJNALRK3TMMnPep5TxgTaX3xa2bRgjzTX2GM1p6vytNFS4VgmOQlfrTNOtTt_cFZj9bqcJOr7Pq5xGc5d_v_v9uCiomcfInHaw_vUPJ59ttJiBm00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>\u00c9diter Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"44770\">D. Gardes des machines d&#8217;\u00e9tat<\/h3>\n<p data-nodeid=\"44771\">Dans les diagrammes de machines d&#8217;\u00e9tat, les transitions peuvent avoir<strong data-nodeid=\"44930\">des gardes<\/strong>\u2014des expressions bool\u00e9ennes qui doivent \u00e9valuer \u00e0 vrai pour que la transition ait lieu. OCL est le langage standard pour \u00e9crire ces gardes.<\/p>\n<p id=\"rmaKYWP\"><img alt=\"\" class=\"alignnone size-full wp-image-25376\" decoding=\"async\" height=\"871\" loading=\"lazy\" sizes=\"auto, (max-width: 1911px) 100vw, 1911px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63153146a44.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63153146a44.png 1911w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63153146a44-300x137.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63153146a44-1030x469.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63153146a44-768x350.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63153146a44-1536x700.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63153146a44-150x68.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63153146a44-400x182.png 400w\" width=\"1911\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">Plantuml<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:RP91Qm8n48NlWVo7WHxKXIqjnSkYYzKgz5IfH_6Gkb5Jiqb8ib8f_U-TsTL5r9ncttip-IRiA4JXOrLgpi9U6IUyA06rACTYlTzwMvbYOhNry31xcVPdVSuuMoOhIDCS9bvYiE3iLDJYN9f2cUshSzuUX8OCGlLLgjZjKMiz-YRpozaVkTSwpMi-S7W6osWZgWDuViApkf__bDzo7I_p-R1juAmTHzd5JZbNHmDMH7XMoCKrgSDO9FPgkujWDzVed04aoQBUwjqSX5V2n2n9I5zR4-LFX0zVI4-2CWUyIUhD8pr35M08dTEy3gZIQIK3KB0-JR1-ErndV4np99cMBXu95Dk0o6u9pnisQ7CROeeaXOhA6l95utTxzp2phBN9SzXzWto-e0C28LhU9dPgBzxeHGOvc4hhIzeHblYx_GC0\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>\u00c9diter Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">Plantuml<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:RPBHJi8m58Rlb_GTJkB5OCcCnd2pm88W95v9zD9mKTS2bQwjNKSanWVoENmnpza02T2hxl__S_gTTiCgS1_gKhEeMYlZkESbe1RaY1VhfRUr4MEhhOUhwTsaD-snY4MloHpID8UnbnWKBDfj6d4cZL1cUU-Sjnkk8OEgVYjLw7Ifj6bzblbYqJUvfphrQp-mUGQlmGPK-t1xWsj-EVyitsKHZlFvu530eaCxohwib7DDjC8T4UuLSd5CgZ0MYRrQhWBOnIawYm2IvD5ik5VS5194_Fk3CqAM9EGLrWJv6U392-b9K6Q3fqczkAQhg2iOGBph6OCgdLOVjGHADgjDDXU8CussQOuuazA5BT5Y7H3UEUP-p9PlPgkG8efGGLa3GW9l_Kxt8cYM7Npo79QVGUzFY466VzusjQiM3_JO_HnChVKnxH2t-C_z0G00\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"44772\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nskinparam stateBackgroundColor #F3E5F5\r\n\r\n[*] --&gt; Created\r\nCreated --&gt; PendingApproval : submit()\r\n\r\nstate PendingApproval {\r\n}\r\n\r\nPendingApproval --&gt; Approved : [total &lt; 10000]\r\nPendingApproval --&gt; Rejected : [total &gt;= 10000]\r\n\r\nApproved --&gt; Shipped : ship()\r\nShipped --&gt; [*]\r\n\r\nnote right of PendingApproval\r\n  **Invariance d'\u00e9tat :**\r\n  context Order\r\n  inv: self.status = 'Pending' implique \r\n       self.submittedBy-&gt;notEmpty()\r\nend note\r\n\r\nnote right of Approved\r\n  **Post-condition de approve() :**\r\n  context Order::approve()\r\n  post: self.status = 'Approved' et \r\n        self.approvedDate &lt;&gt; null\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:RPBHJi8m58Rlb_GTJkB5OCcCnd2pm88W95v9zD9mKTS2bQwjNKSanWVoENmnpza02T2hxl__S_gTTiCgS1_gKhEeMYlZkESbe1RaY1VhfRUr4MEhhOUhwTsaD-snY4MloHpID8UnbnWKBDfj6d4cZL1cUU-Sjnkk8OEgVYjLw7Ifj6bzblbYqJUvfphrQp-mUGQlmGPK-t1xWsj-EVyitsKHZlFvu530eaCxohwib7DDjC8T4UuLSd5CgZ0MYRrQhWBOnIawYm2IvD5ik5VS5194_Fk3CqAM9EGLrWJv6U392-b9K6Q3fqczkAQhg2iOGBph6OCgdLOVjGHADgjDDXU8CussQOuuazA5BT5Y7H3UEUP-p9PlPgkG8efGGLa3GW9l_Kxt8cYM7Npo79QVGUzFY466VzusjQiM3_JO_HnChVKnxH2t-C_z0G00\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:RP91Qm8n48NlWVo7WHxKXIqjnSkYYzKgz5IfH_6Gkb5Jiqb8ib8f_U-TsTL5r9ncttip-IRiA4JXOrLgpi9U6IUyA06rACTYlTzwMvbYOhNry31xcVPdVSuuMoOhIDCS9bvYiE3iLDJYN9f2cUshSzuUX8OCGlLLgjZjKMiz-YRpozaVkTSwpMi-S7W6osWZgWDuViApkf__bDzo7I_p-R1juAmTHzd5JZbNHmDMH7XMoCKrgSDO9FPgkujWDzVed04aoQBUwjqSX5V2n2n9I5zR4-LFX0zVI4-2CWUyIUhD8pr35M08dTEy3gZIQIK3KB0-JR1-ErndV4np99cMBXu95Dk0o6u9pnisQ7CROeeaXOhA6l95utTxzp2phBN9SzXzWto-e0C28LhU9dPgBzxeHGOvc4hhIzeHblYx_GC0\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>\u00c9diter Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<hr data-nodeid=\"44773\"\/>\n<h2 data-nodeid=\"44774\">3. \u00c9tude de cas compl\u00e8te : le mod\u00e8le de l&#8217;entreprise<\/h2>\n<p data-nodeid=\"44775\">Appliquons OCL \u00e0 un diagramme de classes UML complexe impliquant<code data-backticks=\"1\" data-nodeid=\"44935\">Employee<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44937\">Department<\/code>, et<code data-backticks=\"1\" data-nodeid=\"44939\">Project<\/code>. Cela montre comment OCL navigue \u00e0 travers les associations et utilise les it\u00e9rateurs de collection (<code data-backticks=\"1\" data-nodeid=\"44941\">select<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44943\">forAll<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44945\">size<\/code>).<\/p>\n<p id=\"nWIRDWg\"><img alt=\"\" class=\"alignnone size-full wp-image-25377\" decoding=\"async\" height=\"762\" loading=\"lazy\" sizes=\"auto, (max-width: 949px) 100vw, 949px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315519982f.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315519982f.png 949w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315519982f-300x241.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315519982f-768x617.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315519982f-150x120.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315519982f-400x321.png 400w\" width=\"949\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">Plantuml<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:dLLjRzem4FwEn7yuCMa3DgBITTeKjQWj50bjQwUX_G2J7E3LiPdjiBAN_xvp73ifwxxi2tBEzzoTdtlkk3IMQLiMejinzrpkc6O5P88PSsMjvglIuY9JSib_89oqVQIoUCso-urMfSodIYWDp-Rp-UpcxLzkIkUeWylrzEHqrkrqErKMk2bsGXqGuMUt0p22vV8sXIMbbXjlM7Djx2qhyB5vnRNTpfWbi_lrnYtNU6mpJ31zI64k5BFEz1BO1lk351RIuWPrj_ExAMU6LBSjKDfGa2oB5UgMTsNygnwXCcQvaeRCQC_zrSJV_QJdyptclq6kT7YmURg0JrfznUn_ipVMAcGajtUI9CCUZ4RG6_VQZqpXkzBtPawjcK0UxKz3_IbKM4Fl925ttjQ6ZIFcE6F197N04CoVShebQCkd1NwKa9HejHAcoMYUJaceQ4x1b3lKUswgHvfoHNhaaWHY74TEeQ3vPcj1hIFAqJeSJXLzuWEnlsUQCsaDF8TRjkSRp_PmwFnSLVXW7s6hjenWdC0rCpo3E4tmkHIL1vTx9yJf5hDxAX75Egbq2PCB6BzhnJXDOagvWIjZLCQzrA3_iHIMxmJFk3qCGjI2FTIKcJfmtQZHnD0SKuhp2pXhPNYTm1VZWYyiQcQLfiXhfQ-46DGUouR1eZGMLbZDMau7SiGZKdqPpk7EJNvTHDjdDF7n-yuP71n-kTyaJB1hb0E5R-StQ9Lybi1KAsD6BJuYjNGVkvyn2KgAGoLMEaNX1349zue3s2roxIR0XlfhnwbtIw4kDV99CvC4GOucN6QYpD6uHxKv7tXONTORObhoRoN28YUXypL73Vtts3IlhAwhBHZUa30X5f8MjSpGz0UHEno_0ZmbudmA7CFvn1auuJZD5uuJYkEDxbHpY3Alrd8K_qfPgmgd_bbh0JZzp_pUQjHxfFZ6Fqt_iTe0_F9B7pCNfFX4EN4MFuMbuae9Io2Eub4fBUUQwu08kp4gLqbquQdZhOttmZGhFFHYpmJFFyJLsX90w7iICOq2VFl3nT4BB-c3_ct_0000\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>\u00c9diter Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">Plantuml<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:dLNDRjim3Bu7o3iGtM59jXXDrs63qGRzIGC4ADfYHHz0iPb4Yonbaforw_e-oyvxWxpOACjsb3Ixx6BO5Adl8_cHFZEMQPjdejamSouNJBCC4i6CERTMyt5kSPGeUSz_81o6Fb9Pl639VAfLBjDB9PI6DyFXS73rwPMRqYdgokNYyl1eq6mq6mKAN6KBePuGuRdP0EZ2_VrD3FS4BQVUCE7Qs1kMuRPvpBMT3PWbitjwuunhtBKP9fX-Yc4e5BFEz0xO55lj64RIuXHri_6oeJD0ucqpbBOY9FDiZ3hmBeol-0YLCCkLD6H6U-AF-lxicTBdIqnVG8vrbR3PJ-1Egw-O_2_wnbfSMHVtu32AEWVGxS91xo1CCeRlIi_Da5hJXxIsxm_rRnN3ClHMKkJ2syAmNXspYvWnIHqm5ERVKZgbqC0d2Du292LQhOJP89hza1HLcsCm-GBrafiYIPEFIOzSaa2Cgv5JA6W-dLbGaphAbRNJ6Sabqvn9QmYQJl2HQAEb1Ypvj2Wun9sEytNCyD5knHUjwK8lWY_hNrE1L5yOCuD4GOEWcrWvOiPvShbqmhoSOJ8doYWcKQ5Jw9z2xtDmtr44Dnlyb4dZBpD69Tnh45fPBYnV29vmkrwrg_ipzbWMqvGGPGkxVKCJJc0dft0SO7s8uC5omKq9HZZkGat5opN1J9G-5w9TUbzZNMewXbHn2-lVLYDWDcPvCbklW2sfd8HjoaOeATUhkW1kW6_TjYZfXStgzZrQopc32uUVxXbLK--QwuAgR-VN3f8vhXkHQCNDUaMyf6CNbgxqVP34sRMIA4k41UOMh2RoN0ZKy2ttNNG5APHOA8GkM_yHb0wGai6uWgrNJjJePyhdM2htqcivXZATkXiqYr4bz6wVoqJa1ECI3plMzc4btOyHZ5B2u1EdLiWbTmnRYGYQxut5VgrK6Z4XHf9-0J91qshN5SRUUy0ZAgy7mHwSz9s1KrnnC_OYkiXRtLjPQfHfiV7hkHehQrNc1ciGx1OtMjNlnPM8bYELUMUIDW5n_8-r2U0NQxnTlKhCU_ZKStvNBQnmp1CQqRpivowT8A1IEolMxcOuwj10-E9jBh6GIUXhdFC-RIp99RskbtaWZKeHKVsZsMZ32wCwsCdxZ3xe__uN\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"44776\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nskinparam classAttributeIconSize 0\r\nskinparam noteBackgroundColor #FFFDE7\r\nskinparam noteBorderColor #FBC02D\r\n\r\nclass Employee {\r\n  - SSN: String\r\n  - firstName: String\r\n  - birthDate: Date\r\n  - hireDate: Date\r\n  - salary: Float\r\n  + age(): Integer\r\n}\r\n\r\nclass Department {\r\n  - number: Integer\r\n  - name: String\r\n  - locations: Set&lt;String&gt;\r\n  - {derived} nbrEmployees: Integer\r\n}\r\n\r\nclass Project {\r\n  - number: Integer\r\n  - name: String\r\n  - location: String\r\n}\r\n\r\nEmployee \"0..*\" -- \"1\" Department : worksFor &gt; department\r\nEmployee \"0..*\" -- \"0..*\" Project : worksOn &gt; project\r\nEmployee \"1\" -- \"0..1\" Department : manages &gt; managedDept\r\nDepartment \"1\" -- \"0..*\" Project : controls &gt; projects\r\nEmployee \"1\" -- \"0..*\" Employee : supervisor &gt; subordinates\r\n\r\nnote right of Employee\r\n  **Invariants complexes et navigation :**\r\n  context Employee\r\n  \r\n  -- 1. R\u00e8gle de base sur les attributs\r\n  inv ageCheck: self.age() &gt;= 18\r\n  \r\n  -- 2. Navigation dans les associations (multiplicit\u00e9)\r\n  inv maxProjects: self.worksOn-&gt;size() &lt;= 4\r\n  \r\n  -- 3. Utilisation des it\u00e9rateurs (forAll)\r\n  -- Le superviseur doit \u00eatre embauch\u00e9 avant ses subordonn\u00e9s\r\n  inv hireOrder: self.subordinates-&gt;forAll(\r\n    sub | sub.hireDate &gt; self.hireDate\r\n  )\r\n  \r\n  -- 4. R\u00e8gle crois\u00e9e entre associations\r\n  -- Un employ\u00e9 ne peut travailler que sur des projets contr\u00f4l\u00e9s par son d\u00e9partement\r\n  inv projectControl: \r\n    self.worksFor.controls-&gt;includesAll(self.worksOn)\r\n    \r\n  -- 5. Identifiant unique (cl\u00e9)\r\n  inv uniqueSSN: Employee.allInstances()-&gt;forAll(e1, e2 | \r\n    e1 &lt;&gt; e2 implique e1.SSN &lt;&gt; e2.SSN\r\n  )\r\nend note\r\n\r\nnote bottom of Department\r\n  **Attribut d\u00e9riv\u00e9 :**\r\n  context Department::nbrEmployees: Integer\r\n  derive: self.worksFor-&gt;size()\r\nend note\r\n\r\nnote right of Project\r\n  **Invariance du projet :**\r\n  context Project\r\n  \r\n  -- La localisation du projet doit \u00eatre l'une des localisations du d\u00e9partement\r\n  inv validLocation: \r\n    self.controls.locations-&gt;includes(self.location)\r\nend note\r\n\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:dLNDRjim3Bu7o3iGtM59jXXDrs63qGRzIGC4ADfYHHz0iPb4Yonbaforw_e-oyvxWxpOACjsb3Ixx6BO5Adl8_cHFZEMQPjdejamSouNJBCC4i6CERTMyt5kSPGeUSz_81o6Fb9Pl639VAfLBjDB9PI6DyFXS73rwPMRqYdgokNYyl1eq6mq6mKAN6KBePuGuRdP0EZ2_VrD3FS4BQVUCE7Qs1kMuRPvpBMT3PWbitjwuunhtBKP9fX-Yc4e5BFEz0xO55lj64RIuXHri_6oeJD0ucqpbBOY9FDiZ3hmBeol-0YLCCkLD6H6U-AF-lxicTBdIqnVG8vrbR3PJ-1Egw-O_2_wnbfSMHVtu32AEWVGxS91xo1CCeRlIi_Da5hJXxIsxm_rRnN3ClHMKkJ2syAmNXspYvWnIHqm5ERVKZgbqC0d2Du292LQhOJP89hza1HLcsCm-GBrafiYIPEFIOzSaa2Cgv5JA6W-dLbGaphAbRNJ6Sabqvn9QmYQJl2HQAEb1Ypvj2Wun9sEytNCyD5knHUjwK8lWY_hNrE1L5yOCuD4GOEWcrWvOiPvShbqmhoSOJ8doYWcKQ5Jw9z2xtDmtr44Dnlyb4dZBpD69Tnh45fPBYnV29vmkrwrg_ipzbWMqvGGPGkxVKCJJc0dft0SO7s8uC5omKq9HZZkGat5opN1J9G-5w9TUbzZNMewXbHn2-lVLYDWDcPvCbklW2sfd8HjoaOeATUhkW1kW6_TjYZfXStgzZrQopc32uUVxXbLK--QwuAgR-VN3f8vhXkHQCNDUaMyf6CNbgxqVP34sRMIA4k41UOMh2RoN0ZKy2ttNNG5APHOA8GkM_yHb0wGai6uWgrNJjJePyhdM2htqcivXZATkXiqYr4bz6wVoqJa1ECI3plMzc4btOyHZ5B2u1EdLiWbTmnRYGYQxut5VgrK6Z4XHf9-0J91qshN5SRUUy0ZAgy7mHwSz9s1KrnnC_OYkiXRtLjPQfHfiV7hkHehQrNc1ciGx1OtMjNlnPM8bYELUMUIDW5n_8-r2U0NQxnTlKhCU_ZKStvNBQnmp1CQqRpivowT8A1IEolMxcOuwj10-E9jBh6GIUXhdFC-RIp99RskbtaWZKeHKVsZsMZ32wCwsCdxZ3xe__uN\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:dLLjRzem4FwEn7yuCMa3DgBITTeKjQWj50bjQwUX_G2J7E3LiPdjiBAN_xvp73ifwxxi2tBEzzoTdtlkk3IMQLiMejinzrpkc6O5P88PSsMjvglIuY9JSib_89oqVQIoUCso-urMfSodIYWDp-Rp-UpcxLzkIkUeWylrzEHqrkrqErKMk2bsGXqGuMUt0p22vV8sXIMbbXjlM7Djx2qhyB5vnRNTpfWbi_lrnYtNU6mpJ31zI64k5BFEz1BO1lk351RIuWPrj_ExAMU6LBSjKDfGa2oB5UgMTsNygnwXCcQvaeRCQC_zrSJV_QJdyptclq6kT7YmURg0JrfznUn_ipVMAcGajtUI9CCUZ4RG6_VQZqpXkzBtPawjcK0UxKz3_IbKM4Fl925ttjQ6ZIFcE6F197N04CoVShebQCkd1NwKa9HejHAcoMYUJaceQ4x1b3lKUswgHvfoHNhaaWHY74TEeQ3vPcj1hIFAqJeSJXLzuWEnlsUQCsaDF8TRjkSRp_PmwFnSLVXW7s6hjenWdC0rCpo3E4tmkHIL1vTx9yJf5hDxAX75Egbq2PCB6BzhnJXDOagvWIjZLCQzrA3_iHIMxmJFk3qCGjI2FTIKcJfmtQZHnD0SKuhp2pXhPNYTm1VZWYyiQcQLfiXhfQ-46DGUouR1eZGMLbZDMau7SiGZKdqPpk7EJNvTHDjdDF7n-yuP71n-kTyaJB1hb0E5R-StQ9Lybi1KAsD6BJuYjNGVkvyn2KgAGoLMEaNX1349zue3s2roxIR0XlfhnwbtIw4kDV99CvC4GOucN6QYpD6uHxKv7tXONTORObhoRoN28YUXypL73Vtts3IlhAwhBHZUa30X5f8MjSpGz0UHEno_0ZmbudmA7CFvn1auuJZD5uuJYkEDxbHpY3Alrd8K_qfPgmgd_bbh0JZzp_pUQjHxfFZ6Fqt_iTe0_F9B7pCNfFX4EN4MFuMbuae9Io2Eub4fBUUQwu08kp4gLqbquQdZhOttmZGhFFHYpmJFFyJLsX90w7iICOq2VFl3nT4BB-c3_ct_0000\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>\u00c9diter Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<hr data-nodeid=\"44777\"\/>\n<h2 data-nodeid=\"44778\">4. Techniques avanc\u00e9es OCL dans UML<\/h2>\n<h3 data-nodeid=\"44779\">A. Utilisation de<code data-backticks=\"1\" data-nodeid=\"44949\">laisser<\/code>\u00a0pour la lisibilit\u00e9<\/h3>\n<p data-nodeid=\"44780\">Lorsqu&#8217;une expression OCL devient trop complexe, utilisez le\u00a0<code data-backticks=\"1\" data-nodeid=\"44952\">laisser<\/code>mot-cl\u00e9 pour d\u00e9finir des variables locales dans la contrainte. Cela rend la note UML beaucoup plus facile \u00e0 lire.<\/p>\n<p id=\"jRJogLz\"><img alt=\"\" class=\"alignnone size-full wp-image-25378\" decoding=\"async\" height=\"870\" loading=\"lazy\" sizes=\"auto, (max-width: 1917px) 100vw, 1917px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a631597c90bc.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a631597c90bc.png 1917w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a631597c90bc-300x136.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a631597c90bc-1030x467.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a631597c90bc-768x349.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a631597c90bc-1536x697.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a631597c90bc-150x68.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a631597c90bc-400x182.png 400w\" width=\"1917\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">Plantuml<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:LL7DIiD04Bu7yWxVhMqWKX0leGaL4Un9eVW0s-qasMQpKtOdMXNVtKqCKc_BzpipkmsYl0ozJPFG6NTMNlNGLeLmB-BDOH3QQNPxyqbOfqcQJ1mU-xFb3o9yfGcGuvrz5vvTWJt9viNpYRHKQV8zEXmBmPkc5N3zvnnzMVOQZ6kmi2GBrEoXET9qWUN6w2BBHbMi5xh8F-VKckD1MJrO5VE5HLcqFFW0vOxGBUaE1nxSKNb3OJGOzpOD6YkVHc4nnG2n_TS_exlOrv17EVD085lVp3lcbMPhutxBgMsLLs7ebwjPQznL5AeIj-jfdYjmK-8kdf8YEfucJRRn6N_W1m00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">Plantuml<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:LP7HIiD044NV0_c7-zOs42c8BwKj5H7iaqBn0xR9D1sxsQqxixKgVf3VuO-v2K7gsp9px-NCtPMe2HfRcsToO7SqmRIeh16vLGsyZKhhohiDVn2cUPPd_GxtxT7wTo9yvXbGuis7Wpow6JQaywVWNwZIPPvzTGxdbH2usIlyxi_P-OhYMTco66NlK1D6bdI4euy1qH6iR_Wr4YgVJ7Gcp8gYyoKWfRF-o-evIjmPMqLB0PRWVBiD1FLgBEhHdc8W0IbEFz-1Tzoh19PRLf8kWDsfFuLTyv0WPDR70jQmI9BtKSDcdHYQD5iC6a38xgw69ifbvQrDBOptdNnIBYMsuycWhOsJYp0i5xYUTcGNi_a2DwbnSZMw1lDibPxfetu1\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"44781\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nskinparam classAttributeIconSize 0\r\n\r\nclass Employee {\r\n  - worksOn: Set&lt;Project&gt;\r\n}\r\n\r\nnote right of Employee\r\n  **Utilisation de 'let' pour une logique complexe :**\r\n  context Employee\r\n  \r\n  -- Calculer le nombre total d'heures et v\u00e9rifier les limites\r\n  inv workingHours: \r\n    laisser totalHours: Integer = \r\n      self.worksOn-&gt;collect(hours)-&gt;sum() \r\n    dans totalHours &gt;= 30 et totalHours &lt;= 50\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:LP7HIiD044NV0_c7-zOs42c8BwKj5H7iaqBn0xR9D1sxsQqxixKgVf3VuO-v2K7gsp9px-NCtPMe2HfRcsToO7SqmRIeh16vLGsyZKhhohiDVn2cUPPd_GxtxT7wTo9yvXbGuis7Wpow6JQaywVWNwZIPPvzTGxdbH2usIlyxi_P-OhYMTco66NlK1D6bdI4euy1qH6iR_Wr4YgVJ7Gcp8gYyoKWfRF-o-evIjmPMqLB0PRWVBiD1FLgBEhHdc8W0IbEFz-1Tzoh19PRLf8kWDsfFuLTyv0WPDR70jQmI9BtKSDcdHYQD5iC6a38xgw69ifbvQrDBOptdNnIBYMsuycWhOsJYp0i5xYUTcGNi_a2DwbnSZMw1lDibPxfetu1\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:LL7DIiD04Bu7yWxVhMqWKX0leGaL4Un9eVW0s-qasMQpKtOdMXNVtKqCKc_BzpipkmsYl0ozJPFG6NTMNlNGLeLmB-BDOH3QQNPxyqbOfqcQJ1mU-xFb3o9yfGcGuvrz5vvTWJt9viNpYRHKQV8zEXmBmPkc5N3zvnnzMVOQZ6kmi2GBrEoXET9qWUN6w2BBHbMi5xh8F-VKckD1MJrO5VE5HLcqFFW0vOxGBUaE1nxSKNb3OJGOzpOD6YkVHc4nnG2n_TS_exlOrv17EVD085lVp3lcbMPhutxBgMsLLs7ebwjPQznL5AeIj-jfdYjmK-8kdf8YEfucJRRn6N_W1m00\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"44782\">B. Gestion des valeurs pr\u00e9c\u00e9dentes dans les post-conditions (<code data-backticks=\"1\" data-nodeid=\"44955\">@pre<\/code>)<\/h3>\n<p data-nodeid=\"44783\">Lors de la d\u00e9finition d&#8217;une post-condition, vous devez souvent comparer l&#8217;\u00e9tat\u00a0<em data-nodeid=\"44968\">nouveau<\/em>\u00a0avec l&#8217;\u00e9tat\u00a0<em data-nodeid=\"44969\">ancien<\/em>\u00a0\u00e9tat. OCL utilise le\u00a0<code data-backticks=\"1\" data-nodeid=\"44966\">@pre<\/code>\u00a0suffixe pour acc\u00e9der \u00e0 la valeur d&#8217;une propri\u00e9t\u00e9 exactement comme elle \u00e9tait avant le d\u00e9but de l&#8217;op\u00e9ration.<\/p>\n<p id=\"kzEcVyQ\"><img alt=\"\" class=\"alignnone size-full wp-image-25379\" decoding=\"async\" height=\"875\" loading=\"lazy\" sizes=\"auto, (max-width: 1916px) 100vw, 1916px\" src=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315ba6f75b.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315ba6f75b.png 1916w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315ba6f75b-300x137.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315ba6f75b-1030x470.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315ba6f75b-768x351.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315ba6f75b-1536x701.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315ba6f75b-150x69.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a6315ba6f75b-400x183.png 400w\" width=\"1916\"\/><\/p>\n<div class=\"vpascode-viewer-container vpascode-fancy-active\">\n<div class=\"vpascode-header\">\n<span class=\"vpascode-lang-label\">Plantuml<\/span><br \/>\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:VL11JiCm4BnRyX_cM585SRQW2a8Sk24L7c2IRREgOrlsHb0GVyUEI0ySkEtCxEpERfV59fadfrK-iOyssGczipdVYoH-cuMU-k3t_4cuqKghHSD3cABrPtnf1RIWARfm9ie6UvBRnr-ug-eM8oTQgKqqMEihhRxhI1-4aFWu2i9X7LsjJVEQsH_HnKHWZ-UGfIrf1XOEFfkcgLs54FgGrMZCF_k09N2Bbv7WwVsI79a4d2653svOu7P1jIjIoi5NQomHJ57TuVfoDEx-43LlksFVktae-JUnR2O_e1wgLLVAyl0V\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 8px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<div class=\"vpascode-code-wrapper\">\n            <div class=\"vpascode-viewer-container vpascode-fancy-active\">\r\n                                <div class=\"vpascode-header\">\r\n                    <span class=\"vpascode-lang-label\">Plantuml<\/span>\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:VL51JiCm4Bn7oX_cHWaAucn15OGu876hU82RR5iBPsrvDwW5yI3UmSUmImCI1sxhcTtPcNKdQfDEewyhUNOSRR8ZUcz5RbMJMqzA3ttWbNibNDLLNHqvt8KnMZxWhQw05ZH67mv4Oh0YlRu_FPU5lS3E9PgXHJIOw_EwUY-I79IGt7Qd29jPkemspPCwxyIg2uo1qCL462mBF0bY46spkS4LNc2QfanbH6cliv0n_-m7ZW5QF9uH2urhd_MpD8VfXUoqFoNx_12GAFnlb-NU4UTqtdvt-mn6IXAOgOWMTmP2VdFvSnxS_05Ae7RfkFVJu7YxYDaJyO1oahhgSfc_vWi0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 8px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n                                <div class=\"vpascode-code-wrapper\">\r\n                    <pre class=\"lang-plantuml\" data-nodeid=\"44784\"><code class=\"language-plantuml\" data-language=\"plantuml\" class=\"language-plantuml\">@startuml\r\nskinparam classAttributeIconSize 0\r\n\r\nclass Company {\r\n  - employees: Set&lt;Employee&gt;\r\n  + hireEmployee(p: Employee)\r\n}\r\n\r\nnote right of Company\r\n  **Utilisation de @pre dans les post-conditions :**\r\n  context Company::hireEmployee(p: Employee)\r\n  \r\n  -- L'ensemble des nouveaux employ\u00e9s est l'ensemble ancien + la nouvelle personne\r\n  post: self.employees = self.employees@pre-&gt;including(p)\r\nend note\r\n@enduml\r\n<\/code><\/pre>                <\/div>\r\n                <div class=\"vpascode-actions\">\r\n                    <a href=\"https:\/\/www.vpascode.com\/#plantuml:VL51JiCm4Bn7oX_cHWaAucn15OGu876hU82RR5iBPsrvDwW5yI3UmSUmImCI1sxhcTtPcNKdQfDEewyhUNOSRR8ZUcz5RbMJMqzA3ttWbNibNDLLNHqvt8KnMZxWhQw05ZH67mv4Oh0YlRu_FPU5lS3E9PgXHJIOw_EwUY-I79IGt7Qd29jPkemspPCwxyIg2uo1qCL462mBF0bY46spkS4LNc2QfanbH6cliv0n_-m7ZW5QF9uH2urhd_MpD8VfXUoqFoNx_12GAFnlb-NU4UTqtdvt-mn6IXAOgOWMTmP2VdFvSnxS_05Ae7RfkFVJu7YxYDaJyO1oahhgSfc_vWi0\" \r\n                       target=\"_blank\" \r\n                       rel=\"noopener noreferrer\" \r\n                       class=\"vpascode-fancy-btn\">\r\n                        <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"margin-right: 6px;\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg>\r\n                        <span>Edit Plantuml in VPasCode<\/span>\r\n                    <\/a>\r\n                <\/div>\r\n            <\/div>\r\n            \n<\/p><\/div>\n<div class=\"vpascode-actions\">\n<a class=\"vpascode-fancy-btn\" href=\"https:\/\/www.vpascode.com\/#plantuml:VL11JiCm4BnRyX_cM585SRQW2a8Sk24L7c2IRREgOrlsHb0GVyUEI0ySkEtCxEpERfV59fadfrK-iOyssGczipdVYoH-cuMU-k3t_4cuqKghHSD3cABrPtnf1RIWARfm9ie6UvBRnr-ug-eM8oTQgKqqMEihhRxhI1-4aFWu2i9X7LsjJVEQsH_HnKHWZ-UGfIrf1XOEFfkcgLs54FgGrMZCF_k09N2Bbv7WwVsI79a4d2653svOu7P1jIjIoi5NQomHJ57TuVfoDEx-43LlksFVktae-JUnR2O_e1wgLLVAyl0V\" rel=\"noopener noreferrer\" target=\"_blank\"><br \/>\n<svg fill=\"none\" height=\"14\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2.5\" style=\"margin-right: 6px;\" viewbox=\"0 0 24 24\" width=\"14\"><path d=\"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"><\/path><path d=\"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z\"><\/path><\/svg><br \/>\n<span>Modifier Plantuml dans VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<hr data-nodeid=\"44785\"\/>\n<h2 data-nodeid=\"44786\">5. Meilleures pratiques pour OCL dans UML<\/h2>\n<ol data-nodeid=\"44787\">\n<li data-nodeid=\"44788\">\n<p data-nodeid=\"44789\"><strong data-nodeid=\"44977\">Nommez vos contraintes :<\/strong>\u00a0Donnez toujours un nom \u00e0 vos invariants et conditions (par exemple,\u00a0<code data-backticks=\"1\" data-nodeid=\"44975\">inv maxProjects:<\/code>). Cela facilite leur r\u00e9f\u00e9rence dans la documentation ou les matrices de tra\u00e7abilit\u00e9.<\/p>\n<\/li>\n<li data-nodeid=\"44790\">\n<p data-nodeid=\"44791\"><strong data-nodeid=\"44984\">Utilisez les notes de mani\u00e8re strat\u00e9gique :<\/strong>\u00a0Dans PlantUML et les outils UML visuels, n&#8217;encombrez pas la bo\u00eete de classe avec OCL. Placez OCL dans des notes adjacentes. Cela maintient le diagramme propre et lisible.<\/p>\n<\/li>\n<li data-nodeid=\"44792\">\n<p data-nodeid=\"44793\"><strong data-nodeid=\"44995\">Ne pas trop contraindre :<\/strong>\u00a0\u00c9crivez uniquement du OCL pour les r\u00e8gles qui ne peuvent pas \u00eatre facilement exprim\u00e9es via les multiplicit\u00e9s UML (par exemple,\u00a0<code data-backticks=\"1\" data-nodeid=\"44991\">0..1<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44993\">1..*<\/code>) ou les types de base. Si une r\u00e8gle peut \u00eatre montr\u00e9e visuellement, montrez-la visuellement.<\/p>\n<\/li>\n<li data-nodeid=\"44794\">\n<p data-nodeid=\"44795\"><strong data-nodeid=\"45008\">Utilisez les it\u00e9rateurs de collection :<\/strong>\u00a0Ma\u00eetrisez\u00a0<code data-backticks=\"1\" data-nodeid=\"45000\">-&gt;select()<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"45002\">-&gt;forAll()<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"45004\">-&gt;exists()<\/code>, et\u00a0<code data-backticks=\"1\" data-nodeid=\"45006\">-&gt;collect()<\/code>. Ce sont les outils les plus puissants pour naviguer dans les associations UML en OCL.<\/p>\n<\/li>\n<li data-nodeid=\"44796\">\n<p class=\"\" data-nodeid=\"44797\"><strong data-nodeid=\"45021\">V\u00e9rifiez les valeurs nulles\/ensembles vides :<\/strong>\u00a0Lorsque vous naviguez dans des associations optionnelles (multiplicit\u00e9\u00a0<code data-backticks=\"1\" data-nodeid=\"45013\">0..1<\/code>\u00a0ou\u00a0<code data-backticks=\"1\" data-nodeid=\"45015\">0..*<\/code>), utilisez toujours\u00a0<code data-backticks=\"1\" data-nodeid=\"45017\">-&gt;notEmpty()<\/code>\u00a0ou\u00a0<code data-backticks=\"1\" data-nodeid=\"45019\">-&gt;isEmpty()<\/code>\u00a0avant d&#8217;acc\u00e9der aux propri\u00e9t\u00e9s afin d&#8217;\u00e9viter les erreurs d&#8217;\u00e9valuation non d\u00e9finies.<\/p>\n<\/li>\n<\/ol>\n<p>\u00a0<\/p>\n<h1 class=\"qwen-markdown-heading\" dir=\"ltr\"><span class=\"qwen-markdown-text\" data-spm-anchor-id=\"a2ty_o01.29997173.0.i226.290055fbrGIlFE\">Conclusion<\/span><\/h1>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Dans le domaine du g\u00e9nie logiciel, l&#8217;ambigu\u00eft\u00e9 est l&#8217;ennemi de la qualit\u00e9. Bien que UML fournisse un vocabulaire visuel inestimable pour discuter de l&#8217;architecture du syst\u00e8me, c&#8217;est l&#8217;int\u00e9gration du langage de contraintes objet (OCL) qui transforme ces diagrammes visuels en sp\u00e9cifications rigoureuses et sans ambigu\u00eft\u00e9.<\/span><\/div>\n<div class=\"qwen-markdown-space\"><\/div>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Comme nous l&#8217;avons explor\u00e9 tout au long de ce guide, l&#8217;OCL agit comme le pont critique entre la conception de haut niveau et l&#8217;impl\u00e9mentation. En ma\u00eetrisant les invariants de classe, les contrats d&#8217;op\u00e9ration et les it\u00e9rateurs de collection, vous vous assurez que vos r\u00e8gles m\u00e9tier ne sont pas perdues dans la traduction entre l&#8217;\u00e9quipe de conception et les d\u00e9veloppeurs. En outre, l&#8217;utilisation d&#8217;outils comme PlantUML vous permet de maintenir vos contraintes OCL sous contr\u00f4le de version, lisibles et int\u00e9gr\u00e9es sans heurt \u00e0 c\u00f4t\u00e9 de vos diagrammes visuels.<\/span><\/div>\n<div class=\"qwen-markdown-space\"><\/div>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">En fin de compte, adopter l&#8217;OCL am\u00e9liore votre pratique de mod\u00e9lisation. Il transforme votre r\u00f4le, qui n&#8217;\u00e9tait auparavant que de \u00ab dessiner des bo\u00eetes et des lignes \u00bb, en une d\u00e9finition pr\u00e9cise et math\u00e9matique du syst\u00e8me. En embrassant la synergie entre la clart\u00e9 visuelle d&#8217;UML et la pr\u00e9cision formelle de l&#8217;OCL, vous posez une base solide pour construire un logiciel qui est non seulement bien con\u00e7u, mais strictement align\u00e9 avec les exigences r\u00e9elles du monde des affaires.<\/span><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Alors que le langage de mod\u00e9lisation unifi\u00e9 (UML) est la norme incontest\u00e9e de l&#8217;industrie pour visualiser l&#8217;architecture logicielle, il pr\u00e9sente une limitation intrins\u00e8que : les diagrammes sont excellents pour montrer ce queun syst\u00e8me est compos\u00e9 de, mais ils ont du mal \u00e0 exprimer les r\u00e8gles m\u00e9tier complexes et nuanc\u00e9es qui r\u00e9gissent commentil se comporte. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[36],"tags":[],"class_list":["post-9930","post","type-post","status-publish","format-standard","hentry","category-uml","loop-entry","clr"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML - Visual Paradigm Blog Fran\u00e7ais<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML - Visual Paradigm Blog Fran\u00e7ais\" \/>\n<meta property=\"og:description\" content=\"Introduction Alors que le langage de mod\u00e9lisation unifi\u00e9 (UML) est la norme incontest\u00e9e de l&#8217;industrie pour visualiser l&#8217;architecture logicielle, il pr\u00e9sente une limitation intrins\u00e8que : les diagrammes sont excellents pour montrer ce queun syst\u00e8me est compos\u00e9 de, mais ils ont du mal \u00e0 exprimer les r\u00e8gles m\u00e9tier complexes et nuanc\u00e9es qui r\u00e9gissent commentil se comporte. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\" \/>\n<meta property=\"og:site_name\" content=\"Visual Paradigm Blog Fran\u00e7ais\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-24T07:39:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-26T09:26:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png\" \/>\n<meta name=\"author\" content=\"Admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\",\"url\":\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\",\"name\":\"Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML - Visual Paradigm Blog Fran\u00e7ais\",\"isPartOf\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png\",\"datePublished\":\"2026-07-24T07:39:20+00:00\",\"dateModified\":\"2026-07-26T09:26:05+00:00\",\"author\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#primaryimage\",\"url\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png\",\"contentUrl\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.visual-paradigm.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/#website\",\"url\":\"https:\/\/blog.visual-paradigm.com\/fr\/\",\"name\":\"Visual Paradigm Blog Fran\u00e7ais\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.visual-paradigm.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\",\"name\":\"Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6b756c36f5e9132f6067fb4d22bef2e3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6b756c36f5e9132f6067fb4d22bef2e3?s=96&d=mm&r=g\",\"caption\":\"Admin\"},\"url\":\"https:\/\/blog.visual-paradigm.com\/fr\/author\/vpadminuser\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML - Visual Paradigm Blog Fran\u00e7ais","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","og_locale":"fr_FR","og_type":"article","og_title":"Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML - Visual Paradigm Blog Fran\u00e7ais","og_description":"Introduction Alors que le langage de mod\u00e9lisation unifi\u00e9 (UML) est la norme incontest\u00e9e de l&#8217;industrie pour visualiser l&#8217;architecture logicielle, il pr\u00e9sente une limitation intrins\u00e8que : les diagrammes sont excellents pour montrer ce queun syst\u00e8me est compos\u00e9 de, mais ils ont du mal \u00e0 exprimer les r\u00e8gles m\u00e9tier complexes et nuanc\u00e9es qui r\u00e9gissent commentil se comporte. [&hellip;]","og_url":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","og_site_name":"Visual Paradigm Blog Fran\u00e7ais","article_published_time":"2026-07-24T07:39:20+00:00","article_modified_time":"2026-07-26T09:26:05+00:00","og_image":[{"url":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png","type":"","width":"","height":""}],"author":"Admin","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Admin","Dur\u00e9e de lecture estim\u00e9e":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","url":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","name":"Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML - Visual Paradigm Blog Fran\u00e7ais","isPartOf":{"@id":"https:\/\/blog.visual-paradigm.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#primaryimage"},"image":{"@id":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png","datePublished":"2026-07-24T07:39:20+00:00","dateModified":"2026-07-26T09:26:05+00:00","author":{"@id":"https:\/\/blog.visual-paradigm.com\/fr\/#\/schema\/person\/a649c442f11a53040710ddec750926c6"},"breadcrumb":{"@id":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#primaryimage","url":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png","contentUrl":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63167c3b9c9.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.visual-paradigm.com\/fr\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.visual-paradigm.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Un guide complet pour utiliser OCL dans UML avec des exemples PlantUML"}]},{"@type":"WebSite","@id":"https:\/\/blog.visual-paradigm.com\/fr\/#website","url":"https:\/\/blog.visual-paradigm.com\/fr\/","name":"Visual Paradigm Blog Fran\u00e7ais","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.visual-paradigm.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/blog.visual-paradigm.com\/fr\/#\/schema\/person\/a649c442f11a53040710ddec750926c6","name":"Admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.visual-paradigm.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6b756c36f5e9132f6067fb4d22bef2e3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6b756c36f5e9132f6067fb4d22bef2e3?s=96&d=mm&r=g","caption":"Admin"},"url":"https:\/\/blog.visual-paradigm.com\/fr\/author\/vpadminuser\/"}]}},"modified_by":"Admin","_links":{"self":[{"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/posts\/9930","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/comments?post=9930"}],"version-history":[{"count":0,"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/posts\/9930\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/media?parent=9930"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/categories?post=9930"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/fr\/wp-json\/wp\/v2\/tags?post=9930"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}