{"id":11701,"date":"2026-07-24T15:39:20","date_gmt":"2026-07-24T07:39:20","guid":{"rendered":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/"},"modified":"2026-07-26T17:31:03","modified_gmt":"2026-07-26T09:31:03","slug":"a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples","status":"publish","type":"post","link":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","title":{"rendered":"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 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\">Gi\u1edbi Thi\u1ec7u<\/span><\/h1>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">M\u1eb7c d\u00f9 Ng\u00f4n ng\u1eef M\u00f4 H\u00ecnh H\u00f3a \u0110\u01a1n Nh\u1ea5t (UML) l\u00e0 ti\u00eau chu\u1ea9n ng\u00e0nh kh\u00f4ng th\u1ec3 tranh c\u00e3i \u0111\u1ec3 tr\u1ef1c quan h\u00f3a ki\u1ebfn tr\u00fac ph\u1ea7n m\u1ec1m, n\u00f3 c\u00f3 m\u1ed9t h\u1ea1n ch\u1ebf b\u1ea9m sinh: c\u00e1c s\u01a1 \u0111\u1ed3 r\u1ea5t tuy\u1ec7t v\u1eddi trong vi\u1ec7c th\u1ec3 hi\u1ec7n<\/span><em class=\"qwen-markdown-em\" dir=\"ltr\"><span class=\"qwen-markdown-text\">c\u00e1i g\u00ec<\/span><\/em><span class=\"qwen-markdown-text\">m\u1ed9t h\u1ec7 th\u1ed1ng \u0111\u01b0\u1ee3c t\u1ea1o th\u00e0nh t\u1eeb nh\u1eefng g\u00ec, nh\u01b0ng ch\u00fang g\u1eb7p kh\u00f3 kh\u0103n trong vi\u1ec7c th\u1ec3 hi\u1ec7n c\u00e1c quy t\u1eafc kinh doanh ph\u1ee9c t\u1ea1p, tinh t\u1ebf \u0111i\u1ec1u khi\u1ec3n<\/span><em class=\"qwen-markdown-em\" dir=\"ltr\"><span class=\"qwen-markdown-text\">c\u00e1ch<\/span><\/em><span class=\"qwen-markdown-text\">n\u00f3 ho\u1ea1t \u0111\u1ed9ng. D\u1ef1a ho\u00e0n to\u00e0n v\u00e0o c\u00e1c y\u1ebfu t\u1ed1 tr\u1ef1c quan nh\u01b0 b\u1ed9i s\u1ed1 v\u00e0 ki\u1ec3u d\u1eef li\u1ec7u c\u01a1 b\u1ea3n th\u01b0\u1eddng \u0111\u1ec3 l\u1ea1i logic h\u1ec7 th\u1ed1ng quan tr\u1ecdng m\u01a1 h\u1ed3, d\u1eabn \u0111\u1ebfn hi\u1ec3u nh\u1ea7m trong giai \u0111o\u1ea1n ph\u00e1t tri\u1ec3n.<\/span><\/div>\n<div class=\"qwen-markdown-space\"><\/div>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Xin gi\u1edbi thi\u1ec7u<\/span><strong class=\"qwen-markdown-strong\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Ng\u00f4n ng\u1eef R\u00e0ng bu\u1ed9c \u0110\u1ed1i t\u01b0\u1ee3ng (OCL)<\/span><\/strong><span class=\"qwen-markdown-text\">. N\u1ebfu UML l\u00e0 &#8220;khung x\u01b0\u01a1ng&#8221; c\u1ee7a m\u00f4 h\u00ecnh h\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n, th\u00ec OCL l\u00e0 &#8220;h\u1ec7 th\u1ea7n kinh&#8221;\u2014cung c\u1ea5p c\u00e1c quy t\u1eafc ch\u00ednh x\u00e1c, r\u00f5 r\u00e0ng v\u00e0 h\u00ecnh th\u1ee9c, quy \u0111\u1ecbnh c\u00e1ch khung x\u01b0\u01a1ng v\u1eadn h\u00e0nh. B\u1eb1ng c\u00e1ch t\u00edch h\u1ee3p OCL v\u1edbi UML, c\u00e1c nh\u00e0 m\u00f4 h\u00ecnh c\u00f3 th\u1ec3 l\u1ea5p \u0111\u1ea7y kho\u1ea3ng c\u00e1ch gi\u1eefa thi\u1ebft k\u1ebf tr\u1ef1c quan c\u1ea5p cao v\u00e0 \u0111\u1eb7c t\u1ea3 to\u00e1n h\u1ecdc nghi\u00eam ng\u1eb7t, m\u00e0 kh\u00f4ng c\u1ea7n vi\u1ebft m\u00e3 th\u1ef1c t\u1ebf.<\/span><\/div>\n<div class=\"qwen-markdown-space\"><\/div>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">H\u01b0\u1edbng d\u1eabn to\u00e0n di\u1ec7n n\u00e0y kh\u00e1m ph\u00e1 s\u1ef1 k\u1ebft h\u1ee3p m\u1ea1nh m\u1ebd gi\u1eefa UML v\u00e0 OCL. Ch\u00fang ta s\u1ebd ph\u00e2n t\u00edch c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i c\u1ee7a OCL, minh h\u1ecda c\u00e1ch g\u1eafn c\u00e1c r\u00e0ng bu\u1ed9c v\u00e0o l\u1edbp, thao t\u00e1c v\u00e0 m\u00e1y tr\u1ea1ng th\u00e1i, v\u00e0 cung c\u1ea5p c\u00e1c v\u00ed d\u1ee5 th\u1ef1c t\u1ebf, c\u00f3 th\u1ec3 t\u00e1i t\u1ea1o \u0111\u01b0\u1ee3c<\/span><strong class=\"qwen-markdown-strong\" dir=\"ltr\"><span class=\"qwen-markdown-text\">PlantUML<\/span><\/strong><span class=\"qwen-markdown-text\">v\u00ed d\u1ee5. D\u00f9 b\u1ea1n \u0111ang \u0111\u1ecbnh ngh\u0129a c\u00e1c b\u1ea5t bi\u1ebfn l\u1edbp \u0111\u01a1n gi\u1ea3n hay vi\u1ebft c\u00e1c quy t\u1eafc kinh doanh ph\u1ee9c t\u1ea1p ch\u00e9o li\u00ean k\u1ebft, h\u01b0\u1edbng d\u1eabn n\u00e0y s\u1ebd trang b\u1ecb cho b\u1ea1n ki\u1ebfn th\u1ee9c \u0111\u1ec3 n\u00e2ng t\u1ea7m m\u00f4 h\u00ecnh t\u1eeb nh\u1eefng b\u1ea3n ph\u00e1c th\u1ea3o \u0111\u01a1n thu\u1ea7n l\u00ean th\u00e0nh c\u00e1c \u0111\u1eb7c t\u1ea3 v\u1eefng ch\u1eafc, \u0111\u1ea1t ti\u00eau chu\u1ea9n k\u1ef9 thu\u1eadt.<\/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>Trong khi UML (Ng\u00f4n ng\u1eef M\u00f4 h\u00ecnh H\u00f3a \u0110\u01a1n Nh\u1ea5t) xu\u1ea5t s\u1eafc trong vi\u1ec7c tr\u1ef1c quan h\u00f3a\u00a0<strong data-nodeid=\"44816\">c\u1ea5u tr\u00fac<\/strong>\u00a0c\u1ee7a m\u1ed9t h\u1ec7 th\u1ed1ng, nh\u01b0ng n\u00f3 thi\u1ebfu \u0111\u1ed9 ch\u00ednh x\u00e1c \u0111\u1ec3 th\u1ec3 hi\u1ec7n c\u00e1c\u00a0<strong data-nodeid=\"44817\">quy t\u1eafc kinh doanh v\u00e0 ng\u1eef ngh\u0129a<\/strong>. \u0110\u00e2y ch\u00ednh l\u00e0 n\u01a1i\u00a0<strong data-nodeid=\"44818\">Ng\u00f4n ng\u1eef R\u00e0ng bu\u1ed9c \u0110\u1ed1i t\u01b0\u1ee3ng (OCL)<\/strong>\u00a0ph\u00e1t huy vai tr\u00f2. OCL ho\u1ea1t \u0111\u1ed9ng nh\u01b0 &#8220;keo d\u00e1n&#8221; h\u00ecnh th\u1ee9c, k\u1ebft n\u1ed1i c\u00e1c s\u01a1 \u0111\u1ed3 UML v\u1edbi logic kinh doanh nghi\u00eam ng\u1eb7t, r\u00f5 r\u00e0ng.<\/p>\n<p data-nodeid=\"44740\">H\u01b0\u1edbng d\u1eabn n\u00e0y gi\u1ea3i th\u00edch c\u00e1ch OCL t\u00edch h\u1ee3p v\u1edbi UML, c\u00e1c kh\u00e1i ni\u1ec7m c\u1ed1t l\u00f5i b\u1ea1n c\u1ea7n bi\u1ebft, v\u00e0 cung c\u1ea5p c\u00e1c v\u00ed d\u1ee5 th\u1ef1c t\u1ebf\u00a0<strong data-nodeid=\"44824\">PlantUML<\/strong>\u00a0v\u00ed d\u1ee5 \u0111\u1ec3 tr\u1ef1c quan h\u00f3a c\u00e1c r\u00e0ng bu\u1ed9c n\u00e0y.<\/p>\n<hr data-nodeid=\"44741\"\/>\n<h2 data-nodeid=\"44742\">1. S\u1ef1 K\u1ebft H\u1ee3p: OCL H\u1ed7 Tr\u1ee3 UML Nh\u01b0 Th\u1ebf N\u00e0o<\/h2>\n<p data-nodeid=\"44743\">H\u00e3y h\u00ecnh dung UML nh\u01b0 &#8220;khung x\u01b0\u01a1ng&#8221; c\u1ee7a h\u1ec7 th\u1ed1ng b\u1ea1n (l\u1edbp, li\u00ean k\u1ebft, tr\u1ea1ng th\u00e1i) v\u00e0 OCL nh\u01b0 &#8220;h\u1ec7 th\u1ea7n kinh&#8221; (c\u00e1c quy t\u1eafc, \u0111i\u1ec1u ki\u1ec7n v\u00e0 logic \u0111i\u1ec1u khi\u1ec3n c\u00e1ch khung x\u01b0\u01a1ng v\u1eadn h\u00e0nh).<\/p>\n<h3 data-nodeid=\"44744\">Bi\u1ec3u Di\u1ec5n Tr\u1ef1c Quan trong UML<\/h3>\n<p data-nodeid=\"44745\">Trong UML ti\u00eau chu\u1ea9n, c\u00e1c r\u00e0ng bu\u1ed9c OCL th\u01b0\u1eddng \u0111\u01b0\u1ee3c bi\u1ec3u di\u1ec5n b\u1eb1ng\u00a0<strong data-nodeid=\"44841\">Ghi ch\u00fa<\/strong>\u00a0\u0111\u00ednh k\u00e8m v\u00e0o c\u00e1c ph\u1ea7n t\u1eed m\u00f4 h\u00ecnh li\u00ean quan (l\u1edbp, thao t\u00e1c ho\u1eb7c tr\u1ea1ng th\u00e1i).<\/p>\n<ul data-nodeid=\"44746\">\n<li data-nodeid=\"44747\">\n<p data-nodeid=\"44748\"><strong data-nodeid=\"44848\">Stereotype:<\/strong>\u00a0Th\u01b0\u1eddng th\u00ec c\u00e1c ghi ch\u00fa ch\u1ee9a OCL \u0111\u01b0\u1ee3c g\u00e1n cho\u00a0<code data-backticks=\"1\" data-nodeid=\"44846\">{r\u00e0ng bu\u1ed9c}<\/code>\u00a0stereotype.<\/p>\n<\/li>\n<li data-nodeid=\"44749\">\n<p data-nodeid=\"44750\"><strong data-nodeid=\"44855\">B\u1ed1i c\u1ea3nh:<\/strong>\u00a0M\u1ed7i bi\u1ec3u th\u1ee9c OCL \u0111\u1ec1u b\u1eaft \u0111\u1ea7u b\u1eb1ng m\u1ed9t\u00a0<code data-backticks=\"1\" data-nodeid=\"44853\">context<\/code>\u00a0t\u1eeb kh\u00f3a, khai b\u00e1o \u0111\u1ed1i t\u01b0\u1ee3ng UML m\u00e0 quy t\u1eafc \u00e1p d\u1ee5ng v\u00e0o.<\/p>\n<\/li>\n<\/ul>\n<hr data-nodeid=\"44751\"\/>\n<h2 data-nodeid=\"44752\">2. C\u00e1c kh\u00e1i ni\u1ec7m ch\u00ednh c\u1ee7a OCL trong UML<\/h2>\n<h3 data-nodeid=\"44753\">A. C\u00e1c b\u1ea5t bi\u1ebfn l\u1edbp (<code data-backticks=\"1\" data-nodeid=\"44858\">inv<\/code>)<\/h3>\n<p data-nodeid=\"44754\">C\u00e1c b\u1ea5t bi\u1ebfn l\u00e0 c\u00e1c \u0111i\u1ec1u ki\u1ec7n m\u00e0 ph\u1ea3i\u00a0<strong data-nodeid=\"44865\">lu\u00f4n lu\u00f4n \u0111\u00fang<\/strong>\u00a0v\u1edbi m\u1ecdi th\u1ec3 hi\u1ec7n c\u1ee7a m\u1ed9t l\u1edbp, b\u1ea5t k\u1ec3 thao t\u00e1c n\u00e0o \u0111\u01b0\u1ee3c g\u1ecdi.<\/p>\n<p data-nodeid=\"44755\"><strong data-nodeid=\"44870\">Kh\u00e1i ni\u1ec7m ch\u00ednh:<\/strong>\u00a0N\u1ebfu m\u1ed9t b\u1ea5t bi\u1ebfn b\u1ecb vi ph\u1ea1m, h\u1ec7 th\u1ed1ng s\u1ebd \u1edf tr\u1ea1ng th\u00e1i kh\u00f4ng h\u1ee3p l\u1ec7.<\/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>Ch\u1ec9nh s\u1eeda Plantuml trong 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:PPB1Qjj048Rl0ht33xqq3Wu-D8SQ6XARE0H22_4Jh5PhQV5gLrsDd9BIXyWvzE2M74elEHGA4gK7bRp7labNKbnS-xIxy_ypyysmfmKnIsMcmg1OIfqpop9mnOhYZCZAg2HnoOsUork1qRP76n8JnfU9DQMEfqOPYnUpsUprz5KOX45N0XEcbsUSUmVXOnW0Gx3--RRC8c77cFicEkcbY2cckHZZMZ3LXsJnRYLiRDc2pZMBb8Z7c1YZ1DEjuH0tab8ltxnaMLkspptejLZaff2qAtrg-LfyM9ca1BFOvcnJ1uDfi-Q8NFL0YAIhVcieLz_duy6WrVr2I7oWtRGEUOYvg-yGFprYcJO_TEB7CaYagp_ZpztJewk_SZHVCf1rzNVlaU2fGPusttBOfYAyBvirKbUjkn6bNcqMSrqglvms21H2BOwUupXvWn5IuwgVl1VsrxR5T-5PxcNVORVZXlaVwQexdot7ez46oMpgNybCqdzK-ysX4rS_eFcrXptiIWeTT_yf34xzrN_6lm00\" \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  **C\u00e1c b\u1ea5t bi\u1ebfn l\u1edbp:**\r\n  context BankAccount\r\n  \r\n  -- S\u1ed1 d\u01b0 kh\u00f4ng bao gi\u1edd \u0111\u01b0\u1ee3c \u00e2m tr\u1eeb khi cho ph\u00e9p r\u00fat qu\u00e1 h\u1ea1n\r\n  inv balanceRule: \r\n    self.balance &gt;= 0 ho\u1eb7c self.isOverdraftEnabled\r\n  \r\n  -- Gi\u1edbi h\u1ea1n r\u00fat qu\u00e1 h\u1ea1n kh\u00f4ng \u0111\u01b0\u1ee3c v\u01b0\u1ee3t qu\u00e1 500\r\n  inv overdraftLimit: \r\n    self.isOverdraftEnabled ng\u1ee5 \u00fd 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:PPB1Qjj048Rl0ht33xqq3Wu-D8SQ6XARE0H22_4Jh5PhQV5gLrsDd9BIXyWvzE2M74elEHGA4gK7bRp7labNKbnS-xIxy_ypyysmfmKnIsMcmg1OIfqpop9mnOhYZCZAg2HnoOsUork1qRP76n8JnfU9DQMEfqOPYnUpsUprz5KOX45N0XEcbsUSUmVXOnW0Gx3--RRC8c77cFicEkcbY2cckHZZMZ3LXsJnRYLiRDc2pZMBb8Z7c1YZ1DEjuH0tab8ltxnaMLkspptejLZaff2qAtrg-LfyM9ca1BFOvcnJ1uDfi-Q8NFL0YAIhVcieLz_duy6WrVr2I7oWtRGEUOYvg-yGFprYcJO_TEB7CaYagp_ZpztJewk_SZHVCf1rzNVlaU2fGPusttBOfYAyBvirKbUjkn6bNcqMSrqglvms21H2BOwUupXvWn5IuwgVl1VsrxR5T-5PxcNVORVZXlaVwQexdot7ez46oMpgNybCqdzK-ysX4rS_eFcrXptiIWeTT_yf34xzrN_6lm00\" \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>Ch\u1ec9nh s\u1eeda Plantuml trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"44757\">B. H\u1ee3p \u0111\u1ed3ng thao t\u00e1c (<code data-backticks=\"1\" data-nodeid=\"44872\">pre<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44874\">post<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44876\">body<\/code>)<\/h3>\n<p data-nodeid=\"44758\">C\u00e1c thao t\u00e1c (ph\u01b0\u01a1ng th\u1ee9c) c\u00f3 th\u1ec3 c\u00f3 c\u00e1c r\u00e0ng bu\u1ed9c \u0111\u1ecbnh ngh\u0129a h\u00e0nh vi c\u1ee7a ch\u00fang tr\u01b0\u1edbc v\u00e0 sau khi th\u1ef1c thi.<\/p>\n<ul data-nodeid=\"44759\">\n<li data-nodeid=\"44760\">\n<p data-nodeid=\"44761\"><strong data-nodeid=\"44891\">\u0110i\u1ec1u ki\u1ec7n ti\u1ec1n \u0111\u1ec1 (<code data-backticks=\"1\" data-nodeid=\"44881\">pre<\/code>):<\/strong>\u00a0\u0110i\u1ec1u g\u00ec ph\u1ea3i \u0111\u00fang\u00a0<em data-nodeid=\"44892\">tr\u01b0\u1edbc<\/em>\u00a0thao t\u00e1c b\u1eaft \u0111\u1ea7u. (Tr\u00e1ch nhi\u1ec7m c\u1ee7a ng\u01b0\u1eddi g\u1ecdi).<\/p>\n<\/li>\n<li data-nodeid=\"44762\">\n<p data-nodeid=\"44763\"><strong data-nodeid=\"44905\">\u0110i\u1ec1u ki\u1ec7n sau (<code data-backticks=\"1\" data-nodeid=\"44895\">sau<\/code>):<\/strong>\u00a0\u0110i\u1ec1u g\u00ec s\u1ebd \u0111\u00fang\u00a0<em data-nodeid=\"44906\">sau<\/em>\u00a0thao t\u00e1c k\u1ebft th\u00fac. (Cam k\u1ebft c\u1ee7a thao t\u00e1c).<\/p>\n<\/li>\n<li data-nodeid=\"44764\">\n<p data-nodeid=\"44765\"><strong data-nodeid=\"44913\">Th\u00e2n (<code data-backticks=\"1\" data-nodeid=\"44909\">th\u00e2n<\/code>):<\/strong> X\u00e1c \u0111\u1ecbnh gi\u00e1 tr\u1ecb tr\u1ea3 v\u1ec1 ch\u00ednh x\u00e1c cho c\u00e1c thao t\u00e1c truy v\u1ea5n.<\/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>Ch\u1ec9nh s\u1eeda Plantuml trong 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:TPA_RXGn4CRxbVOTHafpT-GY6gImYaxvemkaGqbUmF4wjhLUUsMF4KT4GKM149nIKD1mH1HqI51boplbFVmciU-YS2jqbLVppSpty-VTTqWi-bhbcQkaReWbDL15d3j0jFB28pkXHf_9jmoUhlTeW-oGq8fRutLvP9Ini3NUFNusVfvdURPS0MV2D8tK_2Xwm5MU0Gn18gjT0OU4xxsoflGKHoi13H9rKCTrMC0f8ogLdm0LZ5R6Ow-VgfJ91bS2PtYUHbP2Qd-Nd1COMCa5Whdi4AInmU1bQ6yQM4n3Uwqve206S3wZnM2Gz2NA41PVP6ZVUwZYyK43shlVeVr62tWH2vz1pB_7sKhC_yPZCKtY3OrTePrgdbR4o92zmOvzKMouIcDP0OwfovrbDiDHlCAuRd3Iwsz6SiHtQHunoj1-qX1Plcg-7SK_96aplGOQRcS6B5cQ6uTTT-aUp87e4YnpNY7iZK1xfTPupiNyXouYLcW_QW6QYyKlyY_Fc8QVmEjm-rDl3kJ_9mIuCEMa2qIDKenYhx6Iilvmv7oTac6HBZrsdkt7p_WBtmC0\" \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 ShoppingCart {\r\n  - items: Bag&lt;Product&gt;\r\n  - totalAmount: Real\r\n  + checkout(): Receipt\r\n  + getTotal(): Real\r\n}\r\n\r\nnote right of ShoppingCart\r\n  **H\u1ee3p \u0111\u1ed3ng thao t\u00e1c:**\r\n  \r\n  -- \u0110i\u1ec1u ki\u1ec7n tr\u01b0\u1edbc: Gi\u1ecf h\u00e0ng kh\u00f4ng \u0111\u01b0\u1ee3c tr\u1ed1ng\r\n  context ShoppingCart::checkout(): Receipt\r\n  pre: self.items-&gt;notEmpty()\r\n  \r\n  -- \u0110i\u1ec1u ki\u1ec7n sau: Gi\u1ecf h\u00e0ng \u0111\u01b0\u1ee3c d\u1ecdn r\u1ed7ng, h\u00f3a \u0111\u01a1n \u0111\u01b0\u1ee3c t\u1ea1o ra\r\n  post: self.items-&gt;isEmpty() and result &lt;&gt; null\r\n  \r\n  -- Th\u00e2n: \u0110\u1ecbnh ngh\u0129a thao t\u00e1c truy v\u1ea5n\r\n  context ShoppingCart::getTotal(): Real\r\n  body: self.items-&gt;collect(price)-&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:TPA_RXGn4CRxbVOTHafpT-GY6gImYaxvemkaGqbUmF4wjhLUUsMF4KT4GKM149nIKD1mH1HqI51boplbFVmciU-YS2jqbLVppSpty-VTTqWi-bhbcQkaReWbDL15d3j0jFB28pkXHf_9jmoUhlTeW-oGq8fRutLvP9Ini3NUFNusVfvdURPS0MV2D8tK_2Xwm5MU0Gn18gjT0OU4xxsoflGKHoi13H9rKCTrMC0f8ogLdm0LZ5R6Ow-VgfJ91bS2PtYUHbP2Qd-Nd1COMCa5Whdi4AInmU1bQ6yQM4n3Uwqve206S3wZnM2Gz2NA41PVP6ZVUwZYyK43shlVeVr62tWH2vz1pB_7sKhC_yPZCKtY3OrTePrgdbR4o92zmOvzKMouIcDP0OwfovrbDiDHlCAuRd3Iwsz6SiHtQHunoj1-qX1Plcg-7SK_96aplGOQRcS6B5cQ6uTTT-aUp87e4YnpNY7iZK1xfTPupiNyXouYLcW_QW6QYyKlyY_Fc8QVmEjm-rDl3kJ_9mIuCEMa2qIDKenYhx6Iilvmv7oTac6HBZrsdkt7p_WBtmC0\" \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>Ch\u1ec9nh s\u1eeda Plantuml trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"44767\">C. Gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c suy ra v\u00e0 gi\u00e1 tr\u1ecb ban \u0111\u1ea7u (<code data-backticks=\"1\" data-nodeid=\"44915\">suy ra<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44917\">ban \u0111\u1ea7u<\/code>)<\/h3>\n<p data-nodeid=\"44768\">Thay v\u00ec l\u01b0u tr\u1eef d\u1eef li\u1ec7u tr\u00f9ng l\u1eb7p, UML cho ph\u00e9p c\u00e1c thu\u1ed9c t\u00ednh \u0111\u01b0\u1ee3c \u0111\u00e1nh d\u1ea5u l\u00e0\u00a0<code data-backticks=\"1\" data-nodeid=\"44920\">{suy ra}<\/code>\u00a0ho\u1eb7c\u00a0<code data-backticks=\"1\" data-nodeid=\"44922\">{ban \u0111\u1ea7u}<\/code>, v\u1edbi OCL x\u00e1c \u0111\u1ecbnh gi\u00e1 tr\u1ecb ch\u00ednh x\u00e1c c\u1ee7a ch\u00fang.<\/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>Ch\u1ec9nh s\u1eeda Plantuml trong 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:RL71IiD04Bq7yWy3NZJG8deB26rjAxruQNzWcqoJeSbksPqKO-aNUEh1WpUB1q-2PtDCyJ_o9swQKefwMOQPj--zUTCnB3HdQU8wPavo8RH88KY4CLrcJTECSHGeEQP7XCjJZ5ICFH7C8wqo6TwgH6au6rmFhuPzrt6TFGKCqaMYSaHOkGv02sQa3T-B57qOMtOPDUqfQOxxWcsxVflcAaHDImpN828x64d62FLXHfAOHB86Cjs0BSo7db892Watm3gp7ElQHkqID4KnWveTxTGaddT7vTPYg-89Tfllpwfu2y1aEMW1o_8LffPhjwc-tZFVy-eVU-aMJCeF6GDdLV5CDQ1uQTQmAJ4-y574zt_xRXRomM0oQnztRkSej1cJ372YGf6VNvoAwUfhAoFWkDpIYIMOnmHiP-f_wJ-nrB0wDF-G3ifmVqBNwTZItly7\" \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  **Gi\u00e1 tr\u1ecb \u0111\u01b0\u1ee3c suy ra v\u00e0 ban \u0111\u1ea7u:**\r\n  \r\n  -- T\u00ednh tu\u1ed5i \u0111\u1ed9ng\r\n  context Employee::age: Integer\r\n  derive: self.birthDate.yearsSinceToday()\r\n  \r\n  -- Tr\u1ea1ng th\u00e1i ban \u0111\u1ea7u khi t\u1ea1o\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:RL71IiD04Bq7yWy3NZJG8deB26rjAxruQNzWcqoJeSbksPqKO-aNUEh1WpUB1q-2PtDCyJ_o9swQKefwMOQPj--zUTCnB3HdQU8wPavo8RH88KY4CLrcJTECSHGeEQP7XCjJZ5ICFH7C8wqo6TwgH6au6rmFhuPzrt6TFGKCqaMYSaHOkGv02sQa3T-B57qOMtOPDUqfQOxxWcsxVflcAaHDImpN828x64d62FLXHfAOHB86Cjs0BSo7db892Watm3gp7ElQHkqID4KnWveTxTGaddT7vTPYg-89Tfllpwfu2y1aEMW1o_8LffPhjwc-tZFVy-eVU-aMJCeF6GDdLV5CDQ1uQTQmAJ4-y574zt_xRXRomM0oQnztRkSej1cJ372YGf6VNvoAwUfhAoFWkDpIYIMOnmHiP-f_wJ-nrB0wDF-G3ifmVqBNwTZItly7\" \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>Ch\u1ec9nh s\u1eeda Plantuml trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"44770\">D. B\u1ea3o v\u1ec7 M\u00e1y tr\u1ea1ng th\u00e1i<\/h3>\n<p data-nodeid=\"44771\">Trong s\u01a1 \u0111\u1ed3 M\u00e1y tr\u1ea1ng th\u00e1i, c\u00e1c chuy\u1ec3n ti\u1ebfp c\u00f3 th\u1ec3 c\u00f3\u00a0<strong data-nodeid=\"44930\">b\u1ea3o v\u1ec7<\/strong>\u2014bi\u1ec3u th\u1ee9c logic ph\u1ea3i \u0111\u00e1nh gi\u00e1 th\u00e0nh \u0111\u00fang \u0111\u1ec3 chuy\u1ec3n ti\u1ebfp x\u1ea3y ra. OCL l\u00e0 ng\u00f4n ng\u1eef chu\u1ea9n \u0111\u1ec3 vi\u1ebft c\u00e1c b\u1ea3o v\u1ec7 n\u00e0y.<\/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>Ch\u1ec9nh s\u1eeda Plantuml trong 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:RPAnRi8m48RtI7c7ape0aQXQLImHH1GAQwjsH0mcCObBObkEWugg3fswzXKOgavzWJ0mj2-ID-avWGW1NdBvxx_pTxRxgIPAPqbiM-c2SKaKIG0rJGV4NuHAP3mOYbWek1ZVZ3hZZctPriIPGhljmL1HD0QsjGjAyO7oWF7mLaebbYG65z9ibZ3TR9dIilM9vzMstapsM3VzgXzixi942urg5wwlS4tF-n_fC_NreT_hrGMsLRSptgU8ILbQKumCuLunMHpJL721n8g5aGOnFqQtBG376HJvbuOPA_8j1wsAVCr3qD7lchcEOoo-u9g-QBXN0LL6O7o9cz9uVcbE94kX1urTwmQmHCQCfc2CvQgCvJ7YP8DLsqEeKIBroZ1Z6HZ8KzZzi1NbtoShDkyPBF3pmI4gyfyC_6BpJO1KncRh7A_hrccJaoBL9-pxdHf0aAO6hsoxyk3Et7tN0vx5yI5s7qDyWly0\" \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  **B\u1ea5t bi\u1ebfn tr\u1ea1ng th\u00e1i:**\r\n  context Order\r\n  inv: self.status = 'Pending' implies \r\n       self.submittedBy-&gt;notEmpty()\r\nend note\r\n\r\nnote right of Approved\r\n  **\u0110i\u1ec1u ki\u1ec7n h\u1eadu c\u1ee7a approve():**\r\n  context Order::approve()\r\n  post: self.status = 'Approved' and \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:RPAnRi8m48RtI7c7ape0aQXQLImHH1GAQwjsH0mcCObBObkEWugg3fswzXKOgavzWJ0mj2-ID-avWGW1NdBvxx_pTxRxgIPAPqbiM-c2SKaKIG0rJGV4NuHAP3mOYbWek1ZVZ3hZZctPriIPGhljmL1HD0QsjGjAyO7oWF7mLaebbYG65z9ibZ3TR9dIilM9vzMstapsM3VzgXzixi942urg5wwlS4tF-n_fC_NreT_hrGMsLRSptgU8ILbQKumCuLunMHpJL721n8g5aGOnFqQtBG376HJvbuOPA_8j1wsAVCr3qD7lchcEOoo-u9g-QBXN0LL6O7o9cz9uVcbE94kX1urTwmQmHCQCfc2CvQgCvJ7YP8DLsqEeKIBroZ1Z6HZ8KzZzi1NbtoShDkyPBF3pmI4gyfyC_6BpJO1KncRh7A_hrccJaoBL9-pxdHf0aAO6hsoxyk3Et7tN0vx5yI5s7qDyWly0\" \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>Ch\u1ec9nh s\u1eeda Plantuml trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<hr data-nodeid=\"44773\"\/>\n<h2 data-nodeid=\"44774\">3. Nghi\u00ean c\u1ee9u tr\u01b0\u1eddng h\u1ee3p to\u00e0n di\u1ec7n: M\u00f4 h\u00ecnh C\u00f4ng ty<\/h2>\n<p data-nodeid=\"44775\">H\u00e3y \u00e1p d\u1ee5ng OCL v\u00e0o m\u1ed9t s\u01a1 \u0111\u1ed3 L\u1edbp UML ph\u1ee9c t\u1ea1p bao g\u1ed3m\u00a0<code data-backticks=\"1\" data-nodeid=\"44935\">Nh\u00e2n vi\u00ean<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44937\">Ph\u00f2ng ban<\/code>, v\u00e0\u00a0<code data-backticks=\"1\" data-nodeid=\"44939\">D\u1ef1 \u00e1n<\/code>. \u0110i\u1ec1u n\u00e0y minh h\u1ecda c\u00e1ch OCL \u0111i qua c\u00e1c m\u1ed1i quan h\u1ec7 v\u00e0 s\u1eed d\u1ee5ng b\u1ed9 l\u1eb7p t\u1eadp h\u1ee3p (<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>Ch\u1ec9nh s\u1eeda Plantuml trong 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:dLPFZzD65Bz7odTuMYv9IgpDbgh8MYBO3P5MBGjLKEzZUpQUnfu9C-F05ZXKFLHLLGcEY0DiLmY1jAAKGwNuq8DNV0z_axwnFOwJtLvwSUmtxy_llVTxRt9JQI9r4aVjbfenFYUInE17HAbRMalc9PeU-89Fs8yKjfiwN6YwH_pPL8g41_iY4XAkZCVZqUslBwW96L1fLVRsjtT6xLQxLKI1s_4y4iUKmkDs2w0FaycX2nCCpQUbu8X9fGz9JDV57fCw716DOlCiXI6JT5EcI4JaiGlZI11jH5y0cT9EruK3hkcKodRhwGhEY29k7LEkBI2Un1wL3Ur2U05F97oYcU0AnLJlbaV3ykmnfiyMD7WAt9CsONKvW7jI_43z_njz9IrSriNTsdQStXRq-x0rs6ecwS938MTgZAqPGb3BBpSjtop2olGkHyjvAMkQ3MgRpOWnuTW1XMRbMu2dQDhGQHYl1KGcQYaYjOgeBW-9LhNO1PNCgLmmLIIf4W_vo3WIH9aQ6OQ2PDDGWpYghKnPUxszVFb68zNovJySvc6UllD1vykJEIoort3-ZENfJmc4d__CqvTywlPwnio0f8_qcgkYItqOEF1TScnSV417OPAdB_0tE-CX-9zFmCkNfzoeChum9DqFgJz3-3GwSWhEml063Aut7Euu5r10dAVF6Jn820T4_0jqpfzX73X_JY10x7pQjI5YygYghQgYL1tj3nKEFCRRlG7N6k6-T62IfsVe9ts3aJpZDygNVy-XSoJahIZgLehtfK7p2dNcOVPNyOEvCGHXvAUOT7ASfpzpwqaN-Yzzu67s1uS5ozvp5ERfnxfE5hIPyRjceLIGc_ti3qiO7QCCfjNmn3mTknXC_usH_JPwtKQ2rveDyiFidTWiPwLusC3fe_pNLMfHzZh64zH5xB9Go4vya-b7o4umPM6Bug5FFq_V4kFvT_HGTd8MCbCRct35zFsI-ovKkTNjmjbrx63qXupxKH9GPQhGR6ctDAlWV-N0dUmK8-RfRqY-W9W79ix3Wl6TRyBi4wbvad3s8A75PhQaTaWK7N2yFBXFLQTR5vuEhWBTmQgNuUW0TeT6mD2EuSpJWOD-Ig5vgnf0UL1S5VL0Ua9h4Pk973MMafd9-sjZKrTT8Nf9DaPmPUkw_x5w0ShbxAvNr4x09T3gNN7FBhqBgs9KzNe3JiEWwiFtM7z3ahCLFQf9GHOPwhtGU2oGAmM75hLwIPiLZsoh5YHYmRVrRT3WYgM8KzzKAxAKJB476qdVn0_yW_0l\" \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  **B\u1ea5t bi\u1ebfn ph\u1ee9c t\u1ea1p v\u00e0 \u0110i\u1ec1u h\u01b0\u1edbng:**\r\n  context Employee\r\n  \r\n  -- 1. Quy t\u1eafc thu\u1ed9c t\u00ednh c\u01a1 b\u1ea3n\r\n  inv ageCheck: self.age() &gt;= 18\r\n  \r\n  -- 2. \u0110i\u1ec1u h\u01b0\u1edbng m\u1ed1i quan h\u1ec7 (\u0110\u1ed9 \u0111a d\u1ea1ng)\r\n  inv maxProjects: self.worksOn-&gt;size() &lt;= 4\r\n  \r\n  -- 3. S\u1eed d\u1ee5ng b\u1ed9 l\u1eb7p (forAll)\r\n  -- Tr\u01b0\u1edfng ph\u00f2ng ph\u1ea3i \u0111\u01b0\u1ee3c tuy\u1ec3n d\u1ee5ng tr\u01b0\u1edbc nh\u00e2n vi\u00ean tr\u1ef1c thu\u1ed9c\r\n  inv hireOrder: self.subordinates-&gt;forAll(\r\n    sub | sub.hireDate &gt; self.hireDate\r\n  )\r\n  \r\n  -- 4. Quy t\u1eafc ch\u00e9o m\u1ed1i quan h\u1ec7\r\n  -- Nh\u00e2n vi\u00ean ch\u1ec9 \u0111\u01b0\u1ee3c l\u00e0m vi\u1ec7c tr\u00ean c\u00e1c d\u1ef1 \u00e1n do ph\u00f2ng ban c\u1ee7a h\u1ecd \u0111i\u1ec1u khi\u1ec3n\r\n  inv projectControl: \r\n    self.worksFor.controls-&gt;includesAll(self.worksOn)\r\n    \r\n  -- 5. M\u00e3 \u0111\u1ecbnh danh duy nh\u1ea5t (Kh\u00f3a)\r\n  inv uniqueSSN: Employee.allInstances()-&gt;forAll(e1, e2 | \r\n    e1 &lt;&gt; e2 implies e1.SSN &lt;&gt; e2.SSN\r\n  )\r\nend note\r\n\r\nnote bottom of Department\r\n  **Thu\u1ed9c t\u00ednh \u0111\u01b0\u1ee3c suy ra:**\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  **B\u1ea5t bi\u1ebfn D\u1ef1 \u00e1n:**\r\n  context Project\r\n  \r\n  -- V\u1ecb tr\u00ed d\u1ef1 \u00e1n ph\u1ea3i l\u00e0 m\u1ed9t trong c\u00e1c v\u1ecb tr\u00ed c\u1ee7a ph\u00f2ng ban\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:dLPFZzD65Bz7odTuMYv9IgpDbgh8MYBO3P5MBGjLKEzZUpQUnfu9C-F05ZXKFLHLLGcEY0DiLmY1jAAKGwNuq8DNV0z_axwnFOwJtLvwSUmtxy_llVTxRt9JQI9r4aVjbfenFYUInE17HAbRMalc9PeU-89Fs8yKjfiwN6YwH_pPL8g41_iY4XAkZCVZqUslBwW96L1fLVRsjtT6xLQxLKI1s_4y4iUKmkDs2w0FaycX2nCCpQUbu8X9fGz9JDV57fCw716DOlCiXI6JT5EcI4JaiGlZI11jH5y0cT9EruK3hkcKodRhwGhEY29k7LEkBI2Un1wL3Ur2U05F97oYcU0AnLJlbaV3ykmnfiyMD7WAt9CsONKvW7jI_43z_njz9IrSriNTsdQStXRq-x0rs6ecwS938MTgZAqPGb3BBpSjtop2olGkHyjvAMkQ3MgRpOWnuTW1XMRbMu2dQDhGQHYl1KGcQYaYjOgeBW-9LhNO1PNCgLmmLIIf4W_vo3WIH9aQ6OQ2PDDGWpYghKnPUxszVFb68zNovJySvc6UllD1vykJEIoort3-ZENfJmc4d__CqvTywlPwnio0f8_qcgkYItqOEF1TScnSV417OPAdB_0tE-CX-9zFmCkNfzoeChum9DqFgJz3-3GwSWhEml063Aut7Euu5r10dAVF6Jn820T4_0jqpfzX73X_JY10x7pQjI5YygYghQgYL1tj3nKEFCRRlG7N6k6-T62IfsVe9ts3aJpZDygNVy-XSoJahIZgLehtfK7p2dNcOVPNyOEvCGHXvAUOT7ASfpzpwqaN-Yzzu67s1uS5ozvp5ERfnxfE5hIPyRjceLIGc_ti3qiO7QCCfjNmn3mTknXC_usH_JPwtKQ2rveDyiFidTWiPwLusC3fe_pNLMfHzZh64zH5xB9Go4vya-b7o4umPM6Bug5FFq_V4kFvT_HGTd8MCbCRct35zFsI-ovKkTNjmjbrx63qXupxKH9GPQhGR6ctDAlWV-N0dUmK8-RfRqY-W9W79ix3Wl6TRyBi4wbvad3s8A75PhQaTaWK7N2yFBXFLQTR5vuEhWBTmQgNuUW0TeT6mD2EuSpJWOD-Ig5vgnf0UL1S5VL0Ua9h4Pk973MMafd9-sjZKrTT8Nf9DaPmPUkw_x5w0ShbxAvNr4x09T3gNN7FBhqBgs9KzNe3JiEWwiFtM7z3ahCLFQf9GHOPwhtGU2oGAmM75hLwIPiLZsoh5YHYmRVrRT3WYgM8KzzKAxAKJB476qdVn0_yW_0l\" \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>Ch\u1ec9nh s\u1eeda Plantuml trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<hr data-nodeid=\"44777\"\/>\n<h2 data-nodeid=\"44778\">4. K\u1ef9 thu\u1eadt OCL n\u00e2ng cao trong UML<\/h2>\n<h3 data-nodeid=\"44779\">A. S\u1eed d\u1ee5ng\u00a0<code data-backticks=\"1\" data-nodeid=\"44949\">let<\/code>\u00a0v\u00ec t\u00ednh d\u1ec5 \u0111\u1ecdc<\/h3>\n<p data-nodeid=\"44780\">Khi m\u1ed9t bi\u1ec3u th\u1ee9c OCL tr\u1edf n\u00ean qu\u00e1 ph\u1ee9c t\u1ea1p, h\u00e3y s\u1eed d\u1ee5ng\u00a0<code data-backticks=\"1\" data-nodeid=\"44952\">let<\/code>t\u1eeb kh\u00f3a \u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a c\u00e1c bi\u1ebfn c\u1ee5c b\u1ed9 b\u00ean trong r\u00e0ng bu\u1ed9c. \u0110i\u1ec1u n\u00e0y gi\u00fap ghi ch\u00fa UML tr\u1edf n\u00ean d\u1ec5 \u0111\u1ecdc h\u01a1n nhi\u1ec1u.<\/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>Ch\u1ec9nh s\u1eeda Plantuml trong 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:LL6xJiD04Emj-H-cIsB9A1AYiM8h54Ya0idyWBbSxCFdE-jk7LwYuXke418K51Jv0LpcI_mdELiM2jrgTcPsTdTfAJFKLDBtR2bKdPci0fEPjUT4Hjmsn5TCgrGySSnzp_U67YwgMkf7pl7iUq28UsrAUwKYf9mMrqRVSKQ9xxtq2gM9muYy8EZDdxBN1K7QjJkik_PRvPX8JXEmGaFgN33KHTV-C53t-rL7GT0BN1BY3_JFP0WGucQ_KuKZjs_EAXTT-u7j_XEbgruhaCa6y5sWS7wg5mcr7N8BbL_gnjXei09S392cJ8xeoitCkK4yzW7BvUPaN3bCc9RIhJijUleiJ6nJJMSZLwWZAoGnJkT3h2Dm4UFCNPQhDVfB-TxIbUuX1m00\" \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  **S\u1eed d\u1ee5ng 'let' cho logic ph\u1ee9c t\u1ea1p:**\r\n  context Employee\r\n  \r\n  -- T\u00ednh t\u1ed5ng gi\u1edd v\u00e0 ki\u1ec3m tra gi\u1edbi h\u1ea1n\r\n  inv workingHours: \r\n    let totalHours: Integer = \r\n      self.worksOn-&gt;collect(hours)-&gt;sum() \r\n    in totalHours &gt;= 30 v\u00e0 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:LL6xJiD04Emj-H-cIsB9A1AYiM8h54Ya0idyWBbSxCFdE-jk7LwYuXke418K51Jv0LpcI_mdELiM2jrgTcPsTdTfAJFKLDBtR2bKdPci0fEPjUT4Hjmsn5TCgrGySSnzp_U67YwgMkf7pl7iUq28UsrAUwKYf9mMrqRVSKQ9xxtq2gM9muYy8EZDdxBN1K7QjJkik_PRvPX8JXEmGaFgN33KHTV-C53t-rL7GT0BN1BY3_JFP0WGucQ_KuKZjs_EAXTT-u7j_XEbgruhaCa6y5sWS7wg5mcr7N8BbL_gnjXei09S392cJ8xeoitCkK4yzW7BvUPaN3bCc9RIhJijUleiJ6nJJMSZLwWZAoGnJkT3h2Dm4UFCNPQhDVfB-TxIbUuX1m00\" \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>Ch\u1ec9nh s\u1eeda Plantuml trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<h3 data-nodeid=\"44782\">B. X\u1eed l\u00fd c\u00e1c gi\u00e1 tr\u1ecb tr\u01b0\u1edbc trong \u0111i\u1ec1u ki\u1ec7n sau (<code data-backticks=\"1\" data-nodeid=\"44955\">@pre<\/code>)<\/h3>\n<p data-nodeid=\"44783\">Khi \u0111\u1ecbnh ngh\u0129a \u0111i\u1ec1u ki\u1ec7n sau, b\u1ea1n th\u01b0\u1eddng c\u1ea7n so s\u00e1nh tr\u1ea1ng th\u00e1i\u00a0<em data-nodeid=\"44968\">m\u1edbi<\/em>\u00a0tr\u1ea1ng th\u00e1i v\u1edbi\u00a0<em data-nodeid=\"44969\">c\u0169<\/em>\u00a0tr\u1ea1ng th\u00e1i. OCL s\u1eed d\u1ee5ng k\u00fd hi\u1ec7u\u00a0<code data-backticks=\"1\" data-nodeid=\"44966\">@pre<\/code>\u00a0sau \u0111\u1ec3 truy c\u1eadp gi\u00e1 tr\u1ecb c\u1ee7a m\u1ed9t thu\u1ed9c t\u00ednh ch\u00ednh x\u00e1c nh\u01b0 l\u00fac b\u1eaft \u0111\u1ea7u thao t\u00e1c.<\/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>Ch\u1ec9nh s\u1eeda Plantuml trong 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:VL4zIyH04Eq3-G-lF2CHww37YLXOdtyW9dl9SidiiZiHJx6mihOMGHGBXGDhKvxwF_QVk7iQ4GkhUVFrvitCn79kk6kREB9pIJetUOkYoQtTOpRok6DnM2YQoZE1xJYAetKE-whLEIrm7aT02j7gHYs4i1ccWdSEljrno6wYbaOCeP7ECE2DEBe8bAHOmCYgPgZPG1rQasJg-YLArpzIXOas0coKXs_NqlMN7URUN15itcL94ZgyL1QdF91asJ-pWRNu54VkTQbHk_v1W-hLFU54hfu9hUjl99hL7VXNHV7-v7UYwkF5zRVogoWGQMKvWnNDREld7DZz4mWxf6D9HTELaggHzZe4bGWdYAE9X_uLdm00\" \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  **S\u1eed d\u1ee5ng @pre trong \u0111i\u1ec1u ki\u1ec7n sau:**\r\n  context Company::hireEmployee(p: Employee)\r\n  \r\n  -- T\u1eadp h\u1ee3p nh\u00e2n vi\u00ean m\u1edbi l\u00e0 t\u1eadp h\u1ee3p c\u0169 + ng\u01b0\u1eddi m\u1edbi\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:VL4zIyH04Eq3-G-lF2CHww37YLXOdtyW9dl9SidiiZiHJx6mihOMGHGBXGDhKvxwF_QVk7iQ4GkhUVFrvitCn79kk6kREB9pIJetUOkYoQtTOpRok6DnM2YQoZE1xJYAetKE-whLEIrm7aT02j7gHYs4i1ccWdSEljrno6wYbaOCeP7ECE2DEBe8bAHOmCYgPgZPG1rQasJg-YLArpzIXOas0coKXs_NqlMN7URUN15itcL94ZgyL1QdF91asJ-pWRNu54VkTQbHk_v1W-hLFU54hfu9hUjl99hL7VXNHV7-v7UYwkF5zRVogoWGQMKvWnNDREld7DZz4mWxf6D9HTELaggHzZe4bGWdYAE9X_uLdm00\" \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>Ch\u1ec9nh s\u1eeda Plantuml trong VPasCode<\/span><br \/>\n<\/a>\n<\/div>\n<\/div>\n<hr data-nodeid=\"44785\"\/>\n<h2 data-nodeid=\"44786\">5. C\u00e1c th\u1ef1c h\u00e0nh t\u1ed1t nh\u1ea5t cho OCL trong UML<\/h2>\n<ol data-nodeid=\"44787\">\n<li data-nodeid=\"44788\">\n<p data-nodeid=\"44789\"><strong data-nodeid=\"44977\">\u0110\u1eb7t t\u00ean cho c\u00e1c r\u00e0ng bu\u1ed9c:<\/strong>\u00a0Lu\u00f4n \u0111\u1eb7t t\u00ean cho c\u00e1c b\u1ea5t bi\u1ebfn v\u00e0 \u0111i\u1ec1u ki\u1ec7n c\u1ee7a b\u1ea1n (v\u00ed d\u1ee5:\u00a0<code data-backticks=\"1\" data-nodeid=\"44975\">inv maxProjects:<\/code>). \u0110i\u1ec1u n\u00e0y gi\u00fap d\u1ec5 tham chi\u1ebfu ch\u00fang trong t\u00e0i li\u1ec7u ho\u1eb7c ma tr\u1eadn theo d\u00f5i.<\/p>\n<\/li>\n<li data-nodeid=\"44790\">\n<p data-nodeid=\"44791\"><strong data-nodeid=\"44984\">S\u1eed d\u1ee5ng ghi ch\u00fa m\u1ed9t c\u00e1ch chi\u1ebfn l\u01b0\u1ee3c:<\/strong>\u00a0Trong PlantUML v\u00e0 c\u00e1c c\u00f4ng c\u1ee5 UML tr\u1ef1c quan, \u0111\u1eebng l\u00e0m r\u1ed1i h\u1ed9p l\u1edbp b\u1eb1ng OCL. \u0110\u1eb7t OCL v\u00e0o c\u00e1c ghi ch\u00fa li\u1ec1n k\u1ec1. \u0110i\u1ec1u n\u00e0y gi\u00fap s\u01a1 \u0111\u1ed3 s\u1ea1ch s\u1ebd v\u00e0 d\u1ec5 \u0111\u1ecdc.<\/p>\n<\/li>\n<li data-nodeid=\"44792\">\n<p data-nodeid=\"44793\"><strong data-nodeid=\"44995\">\u0110\u1eebng r\u00e0ng bu\u1ed9c qu\u00e1 m\u1ee9c:<\/strong>\u00a0Ch\u1ec9 vi\u1ebft OCL cho c\u00e1c quy t\u1eafc kh\u00f4ng th\u1ec3 di\u1ec5n \u0111\u1ea1t d\u1ec5 d\u00e0ng th\u00f4ng qua c\u00e1c b\u1ed9i s\u1ed1 UML (v\u00ed d\u1ee5 nh\u01b0\u00a0<code data-backticks=\"1\" data-nodeid=\"44991\">0..1<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44993\">1..*<\/code>) ho\u1eb7c ki\u1ec3u c\u01a1 b\u1ea3n. N\u1ebfu m\u1ed9t quy t\u1eafc c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c th\u1ec3 hi\u1ec7n tr\u1ef1c quan, h\u00e3y th\u1ec3 hi\u1ec7n n\u00f3 theo c\u00e1ch tr\u1ef1c quan.<\/p>\n<\/li>\n<li data-nodeid=\"44794\">\n<p data-nodeid=\"44795\"><strong data-nodeid=\"45008\">T\u1eadn d\u1ee5ng c\u00e1c b\u1ed9 l\u1eb7p t\u1eadp h\u1ee3p:<\/strong>\u00a0N\u1eafm v\u1eefng\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>, v\u00e0\u00a0<code data-backticks=\"1\" data-nodeid=\"45006\">-&gt;collect()<\/code>. Ch\u00fang l\u00e0 c\u00f4ng c\u1ee5 m\u1ea1nh m\u1ebd nh\u1ea5t \u0111\u1ec3 \u0111i\u1ec1u h\u01b0\u1edbng c\u00e1c li\u00ean k\u1ebft UML trong OCL.<\/p>\n<\/li>\n<li data-nodeid=\"44796\">\n<p class=\"\" data-nodeid=\"44797\"><strong data-nodeid=\"45021\">Ki\u1ec3m tra c\u00e1c gi\u00e1 tr\u1ecb null\/t\u1eadp r\u1ed7ng:<\/strong>\u00a0Khi \u0111i\u1ec1u h\u01b0\u1edbng c\u00e1c li\u00ean k\u1ebft t\u00f9y ch\u1ecdn (b\u1ed9i s\u1ed1\u00a0<code data-backticks=\"1\" data-nodeid=\"45013\">0..1<\/code>\u00a0ho\u1eb7c\u00a0<code data-backticks=\"1\" data-nodeid=\"45015\">0..*<\/code>), lu\u00f4n s\u1eed d\u1ee5ng\u00a0<code data-backticks=\"1\" data-nodeid=\"45017\">-&gt;notEmpty()<\/code>\u00a0ho\u1eb7c\u00a0<code data-backticks=\"1\" data-nodeid=\"45019\">-&gt;isEmpty()<\/code>\u00a0tr\u01b0\u1edbc khi truy c\u1eadp thu\u1ed9c t\u00ednh \u0111\u1ec3 tr\u00e1nh l\u1ed7i \u0111\u00e1nh gi\u00e1 kh\u00f4ng x\u00e1c \u0111\u1ecbnh.<\/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\">K\u1ebft lu\u1eadn<\/span><\/h1>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Trong l\u0129nh v\u1ef1c k\u1ef9 thu\u1eadt ph\u1ea7n m\u1ec1m, s\u1ef1 m\u01a1 h\u1ed3 l\u00e0 k\u1ebb th\u00f9 c\u1ee7a ch\u1ea5t l\u01b0\u1ee3ng. Trong khi UML cung c\u1ea5p m\u1ed9t b\u1ed9 t\u1eeb v\u1ef1ng tr\u1ef1c quan qu\u00fd gi\u00e1 \u0111\u1ec3 th\u1ea3o lu\u1eadn v\u1ec1 ki\u1ebfn tr\u00fac h\u1ec7 th\u1ed1ng, th\u00ec ch\u00ednh vi\u1ec7c t\u00edch h\u1ee3p Ng\u00f4n ng\u1eef r\u00e0ng bu\u1ed9c \u0111\u1ed1i t\u01b0\u1ee3ng (OCL) \u0111\u00e3 bi\u1ebfn nh\u1eefng s\u01a1 \u0111\u1ed3 tr\u1ef1c quan n\u00e0y th\u00e0nh c\u00e1c \u0111\u1eb7c t\u1ea3 nghi\u00eam ng\u1eb7t, kh\u00f4ng m\u01a1 h\u1ed3.<\/span><\/div>\n<div class=\"qwen-markdown-space\"><\/div>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Nh\u01b0 ch\u00fang ta \u0111\u00e3 kh\u00e1m ph\u00e1 trong to\u00e0n b\u1ed9 h\u01b0\u1edbng d\u1eabn n\u00e0y, OCL \u0111\u00f3ng vai tr\u00f2 l\u00e0 c\u00e2y c\u1ea7u then ch\u1ed1t gi\u1eefa thi\u1ebft k\u1ebf c\u1ea5p cao v\u00e0 tri\u1ec3n khai. B\u1eb1ng c\u00e1ch n\u1eafm v\u1eefng c\u00e1c b\u1ea5t bi\u1ebfn l\u1edbp, h\u1ee3p \u0111\u1ed3ng thao t\u00e1c v\u00e0 c\u00e1c b\u1ed9 l\u1eb7p t\u1eadp h\u1ee3p, b\u1ea1n \u0111\u1ea3m b\u1ea3o r\u1eb1ng c\u00e1c quy t\u1eafc kinh doanh c\u1ee7a m\u00ecnh kh\u00f4ng b\u1ecb m\u1ea5t \u0111i trong qu\u00e1 tr\u00ecnh chuy\u1ec3n \u0111\u1ed5i gi\u1eefa \u0111\u1ed9i thi\u1ebft k\u1ebf v\u00e0 c\u00e1c nh\u00e0 ph\u00e1t tri\u1ec3n. H\u01a1n n\u1eefa, vi\u1ec7c s\u1eed d\u1ee5ng c\u00e1c c\u00f4ng c\u1ee5 nh\u01b0 PlantUML cho ph\u00e9p b\u1ea1n duy tr\u00ec c\u00e1c r\u00e0ng bu\u1ed9c OCL \u0111\u01b0\u1ee3c ki\u1ec3m so\u00e1t phi\u00ean b\u1ea3n, d\u1ec5 \u0111\u1ecdc v\u00e0 t\u00edch h\u1ee3p li\u1ec1n m\u1ea1ch c\u00f9ng v\u1edbi c\u00e1c s\u01a1 \u0111\u1ed3 tr\u1ef1c quan c\u1ee7a b\u1ea1n.<\/span><\/div>\n<div class=\"qwen-markdown-space\"><\/div>\n<div class=\"qwen-markdown-paragraph\" dir=\"ltr\"><span class=\"qwen-markdown-text\">Cu\u1ed1i c\u00f9ng, vi\u1ec7c \u00e1p d\u1ee5ng OCL n\u00e2ng t\u1ea7m th\u1ef1c h\u00e0nh m\u00f4 h\u00ecnh h\u00f3a c\u1ee7a b\u1ea1n. N\u00f3 thay \u0111\u1ed5i vai tr\u00f2 c\u1ee7a b\u1ea1n t\u1eeb vi\u1ec7c \u0111\u01a1n thu\u1ea7n \u201cv\u1ebd c\u00e1c h\u00ecnh h\u1ed9p v\u00e0 \u0111\u01b0\u1eddng k\u1ebb\u201d sang vi\u1ec7c \u0111\u1ecbnh ngh\u0129a ng\u1eef ngh\u0129a ch\u00ednh x\u00e1c, mang t\u00ednh to\u00e1n h\u1ecdc c\u1ee7a h\u1ec7 th\u1ed1ng. B\u1eb1ng c\u00e1ch n\u1eafm b\u1eaft s\u1ef1 k\u1ebft h\u1ee3p h\u00e0i h\u00f2a gi\u1eefa s\u1ef1 r\u00f5 r\u00e0ng tr\u1ef1c quan c\u1ee7a UML v\u00e0 \u0111\u1ed9 ch\u00ednh x\u00e1c h\u00ecnh th\u1ee9c c\u1ee7a OCL, b\u1ea1n t\u1ea1o n\u00ean m\u1ed9t n\u1ec1n t\u1ea3ng v\u1eefng ch\u1eafc \u0111\u1ec3 x\u00e2y d\u1ef1ng ph\u1ea7n m\u1ec1m kh\u00f4ng ch\u1ec9 \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf t\u1ed1t m\u00e0 c\u00f2n tu\u00e2n th\u1ee7 nghi\u00eam ng\u1eb7t c\u00e1c y\u00eau c\u1ea7u th\u1ef1c t\u1ebf c\u1ee7a doanh nghi\u1ec7p.<\/span><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gi\u1edbi Thi\u1ec7u M\u1eb7c d\u00f9 Ng\u00f4n ng\u1eef M\u00f4 H\u00ecnh H\u00f3a \u0110\u01a1n Nh\u1ea5t (UML) l\u00e0 ti\u00eau chu\u1ea9n ng\u00e0nh kh\u00f4ng th\u1ec3 tranh c\u00e3i \u0111\u1ec3 tr\u1ef1c quan h\u00f3a ki\u1ebfn tr\u00fac ph\u1ea7n m\u1ec1m, n\u00f3 c\u00f3 m\u1ed9t h\u1ea1n ch\u1ebf b\u1ea9m sinh: c\u00e1c s\u01a1 \u0111\u1ed3 r\u1ea5t tuy\u1ec7t v\u1eddi trong vi\u1ec7c th\u1ec3 hi\u1ec7nc\u00e1i g\u00ecm\u1ed9t h\u1ec7 th\u1ed1ng \u0111\u01b0\u1ee3c t\u1ea1o th\u00e0nh t\u1eeb nh\u1eefng g\u00ec, nh\u01b0ng [&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-11701","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>M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 PlantUML - Visual Paradigm Blog<\/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\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 PlantUML - Visual Paradigm Blog\" \/>\n<meta property=\"og:description\" content=\"Gi\u1edbi Thi\u1ec7u M\u1eb7c d\u00f9 Ng\u00f4n ng\u1eef M\u00f4 H\u00ecnh H\u00f3a \u0110\u01a1n Nh\u1ea5t (UML) l\u00e0 ti\u00eau chu\u1ea9n ng\u00e0nh kh\u00f4ng th\u1ec3 tranh c\u00e3i \u0111\u1ec3 tr\u1ef1c quan h\u00f3a ki\u1ebfn tr\u00fac ph\u1ea7n m\u1ec1m, n\u00f3 c\u00f3 m\u1ed9t h\u1ea1n ch\u1ebf b\u1ea9m sinh: c\u00e1c s\u01a1 \u0111\u1ed3 r\u1ea5t tuy\u1ec7t v\u1eddi trong vi\u1ec7c th\u1ec3 hi\u1ec7nc\u00e1i g\u00ecm\u1ed9t h\u1ec7 th\u1ed1ng \u0111\u01b0\u1ee3c t\u1ea1o th\u00e0nh t\u1eeb nh\u1eefng g\u00ec, nh\u01b0ng [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\" \/>\n<meta property=\"og:site_name\" content=\"Visual Paradigm Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-24T07:39:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-26T09:31:03+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=\"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi\" \/>\n\t<meta name=\"twitter:data1\" content=\"Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 ph\u00fat\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\",\"url\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\",\"name\":\"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 PlantUML - Visual Paradigm Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/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:31:03+00:00\",\"author\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#breadcrumb\"},\"inLanguage\":\"vi\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/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\/vn\/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\/vn\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 PlantUML\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#website\",\"url\":\"https:\/\/blog.visual-paradigm.com\/vn\/\",\"name\":\"Visual Paradigm Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.visual-paradigm.com\/vn\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"vi\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\",\"name\":\"Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#\/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\/vn\/author\/vpadminuser\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 PlantUML - Visual Paradigm Blog","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\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","og_locale":"vi_VN","og_type":"article","og_title":"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 PlantUML - Visual Paradigm Blog","og_description":"Gi\u1edbi Thi\u1ec7u M\u1eb7c d\u00f9 Ng\u00f4n ng\u1eef M\u00f4 H\u00ecnh H\u00f3a \u0110\u01a1n Nh\u1ea5t (UML) l\u00e0 ti\u00eau chu\u1ea9n ng\u00e0nh kh\u00f4ng th\u1ec3 tranh c\u00e3i \u0111\u1ec3 tr\u1ef1c quan h\u00f3a ki\u1ebfn tr\u00fac ph\u1ea7n m\u1ec1m, n\u00f3 c\u00f3 m\u1ed9t h\u1ea1n ch\u1ebf b\u1ea9m sinh: c\u00e1c s\u01a1 \u0111\u1ed3 r\u1ea5t tuy\u1ec7t v\u1eddi trong vi\u1ec7c th\u1ec3 hi\u1ec7nc\u00e1i g\u00ecm\u1ed9t h\u1ec7 th\u1ed1ng \u0111\u01b0\u1ee3c t\u1ea1o th\u00e0nh t\u1eeb nh\u1eefng g\u00ec, nh\u01b0ng [&hellip;]","og_url":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","og_site_name":"Visual Paradigm Blog","article_published_time":"2026-07-24T07:39:20+00:00","article_modified_time":"2026-07-26T09:31:03+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":{"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi":"Admin","\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"6 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","url":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/","name":"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 PlantUML - Visual Paradigm Blog","isPartOf":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#primaryimage"},"image":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/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:31:03+00:00","author":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6"},"breadcrumb":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-using-ocl-in-uml-with-plantuml-examples\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/blog.visual-paradigm.com\/vn\/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\/vn\/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\/vn\/"},{"@type":"ListItem","position":2,"name":"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Vi\u1ec7c S\u1eed D\u1ee5ng OCL trong UML V\u1edbi C\u00e1c V\u00ed D\u1ee5 PlantUML"}]},{"@type":"WebSite","@id":"https:\/\/blog.visual-paradigm.com\/vn\/#website","url":"https:\/\/blog.visual-paradigm.com\/vn\/","name":"Visual Paradigm Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.visual-paradigm.com\/vn\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"},{"@type":"Person","@id":"https:\/\/blog.visual-paradigm.com\/vn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6","name":"Admin","image":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/blog.visual-paradigm.com\/vn\/#\/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\/vn\/author\/vpadminuser\/"}]}},"modified_by":"Admin","_links":{"self":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/posts\/11701","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/comments?post=11701"}],"version-history":[{"count":0,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/posts\/11701\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/media?parent=11701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/categories?post=11701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/tags?post=11701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}