{"id":11702,"date":"2026-07-24T15:26:46","date_gmt":"2026-07-24T07:26:46","guid":{"rendered":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/"},"modified":"2026-07-26T17:41:39","modified_gmt":"2026-07-26T09:41:39","slug":"a-comprehensive-guide-to-the-object-constraint-language-ocl","status":"publish","type":"post","link":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","title":{"rendered":"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL)"},"content":{"rendered":"<p data-nodeid=\"44120\">D\u1ef1a tr\u00ean c\u00e1c t\u00e0i li\u1ec7u b\u00e0i gi\u1ea3ng \u0111\u01b0\u1ee3c cung c\u1ea5p, h\u01b0\u1edbng d\u1eabn n\u00e0y bao qu\u00e1t c\u00e1c kh\u00e1i ni\u1ec7m c\u01a1 b\u1ea3n, c\u00fa ph\u00e1p v\u00e0 c\u00e1c \u1ee9ng d\u1ee5ng th\u1ef1c ti\u1ec5n c\u1ee7a Ng\u00f4n ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) trong b\u1ed1i c\u1ea3nh m\u00f4 h\u00ecnh h\u00f3a UML.<\/p>\n<p id=\"ELHqSML\"><img alt=\"Objct Constraint Language (OCL)\n\" class=\"alignnone wp-image-25369 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_6a63134535ef7.png\" srcset=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.png 1664w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7-300x167.png 300w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7-1030x574.png 1030w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7-768x428.png 768w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7-1536x857.png 1536w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7-150x84.png 150w, https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7-400x223.png 400w\" width=\"1664\"\/><\/p>\n<hr data-nodeid=\"44121\"\/>\n<h2 data-nodeid=\"44122\">1. Gi\u1edbi thi\u1ec7u v\u1ec1 OCL<\/h2>\n<h3 data-nodeid=\"44123\">T\u1ea1i sao ch\u00fang ta c\u1ea7n OCL?<\/h3>\n<p data-nodeid=\"44124\">M\u1eb7c d\u00f9 c\u00e1c s\u01a1 \u0111\u1ed3 UML (nh\u01b0 s\u01a1 \u0111\u1ed3 l\u1edbp) r\u1ea5t t\u1ed1t trong vi\u1ec7c tr\u1ef1c quan h\u00f3a c\u1ea5u tr\u00fac, ch\u00fang kh\u00f4ng th\u1ec3 bi\u1ec3u di\u1ec5n t\u1ea5t c\u1ea3 c\u00e1c kh\u00eda c\u1ea1nh li\u00ean quan c\u1ee7a m\u1ed9t b\u1ea3n m\u00f4 t\u1ea3.<\/p>\n<ul data-nodeid=\"44125\">\n<li data-nodeid=\"44126\">\n<p data-nodeid=\"44127\"><strong data-nodeid=\"44305\">Ng\u00f4n ng\u1eef t\u1ef1 nhi\u00ean<\/strong>\u00a0l\u00e0 m\u01a1 h\u1ed3.<\/p>\n<\/li>\n<li data-nodeid=\"44128\">\n<p data-nodeid=\"44129\"><strong data-nodeid=\"44310\">C\u00e1c ng\u00f4n ng\u1eef h\u00ecnh th\u1ee9c truy\u1ec1n th\u1ed1ng<\/strong>\u00a0r\u00f5 r\u00e0ng nh\u01b0ng qu\u00e1 kh\u00f3 \u0111\u1ed1i v\u1edbi ng\u01b0\u1eddi m\u00f4 h\u00ecnh h\u00f3a h\u1ec7 th\u1ed1ng trung b\u00ecnh \u0111\u1ec3 \u0111\u1ecdc v\u00e0 vi\u1ebft.<\/p>\n<\/li>\n<li data-nodeid=\"44130\">\n<p data-nodeid=\"44131\"><strong data-nodeid=\"44323\">OCL<\/strong>\u00a0l\u1ea5p \u0111\u1ea7y kho\u1ea3ng tr\u1ed1ng n\u00e0y: n\u00f3 l\u00e0 m\u1ed9t\u00a0<strong data-nodeid=\"44324\">ng\u00f4n ng\u1eef h\u00ecnh th\u1ee9c<\/strong>\u00a0\u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 bi\u1ec3u di\u1ec5n c\u00e1c r\u00e0ng bu\u1ed9c ch\u00ednh x\u00e1c, nh\u01b0ng v\u1eabn gi\u1eef \u0111\u01b0\u1ee3c\u00a0<strong data-nodeid=\"44325\">d\u1ec5 \u0111\u1ecdc v\u00e0 d\u1ec5 vi\u1ebft<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44132\">Nh\u1eefng \u0110\u1eb7c Tr\u01b0ng Ch\u00ednh C\u1ee7a OCL<\/h3>\n<ol data-nodeid=\"44133\">\n<li data-nodeid=\"44134\">\n<p data-nodeid=\"44135\"><strong data-nodeid=\"44339\">Ng\u00f4n ng\u1eef Bi\u1ec3u Th\u1ee9c Thu\u1ea7n T\u00fay:<\/strong>\u00a0C\u00e1c bi\u1ec3u th\u1ee9c kh\u00f4ng c\u00f3 hi\u1ec7u \u1ee9ng ph\u1ee5. \u0110\u00e1nh gi\u00e1 m\u1ed9t bi\u1ec3u th\u1ee9c OCL tr\u1ea3 v\u1ec1 m\u1ed9t gi\u00e1 tr\u1ecb nh\u01b0ng\u00a0<em data-nodeid=\"44340\">kh\u00f4ng th\u1ec3<\/em>\u00a0thay \u0111\u1ed5i tr\u1ea1ng th\u00e1i c\u1ee7a h\u1ec7 th\u1ed1ng. Tuy nhi\u00ean, n\u00f3 c\u00f3 th\u1ec3\u00a0<em data-nodeid=\"44341\">m\u00f4 t\u1ea3<\/em>\u00a0m\u1ed9t thay \u0111\u1ed5i tr\u1ea1ng th\u00e1i (v\u00ed d\u1ee5, trong m\u1ed9t \u0111i\u1ec1u ki\u1ec7n h\u1eadu).<\/p>\n<\/li>\n<li data-nodeid=\"44136\">\n<p data-nodeid=\"44137\"><strong data-nodeid=\"44346\">Kh\u00f4ng ph\u1ea3i l\u00e0 Ng\u00f4n Ng\u1eef L\u1eadp Tr\u00ecnh:<\/strong>\u00a0B\u1ea1n kh\u00f4ng th\u1ec3 vi\u1ebft logic ch\u01b0\u01a1ng tr\u00ecnh, lu\u1ed3ng \u0111i\u1ec1u khi\u1ec3n, ho\u1eb7c g\u1ecdi c\u00e1c quy tr\u00ecnh\/thao t\u00e1c l\u00e0m thay \u0111\u1ed5i tr\u1ea1ng th\u00e1i.<\/p>\n<\/li>\n<li data-nodeid=\"44138\">\n<p data-nodeid=\"44139\"><strong data-nodeid=\"44351\">Ng\u00f4n ng\u1eef C\u00f3 Ki\u1ec3u:<\/strong>\u00a0M\u1ed7i bi\u1ec3u th\u1ee9c \u0111\u1ec1u c\u00f3 ki\u1ec3u. C\u00e1c bi\u1ec3u th\u1ee9c h\u1ee3p l\u1ec7 ph\u1ea3i tu\u00e2n theo c\u00e1c quy t\u1eafc ph\u00f9 h\u1ee3p ki\u1ec3u. M\u1ed7i b\u1ed9 ph\u00e2n lo\u1ea1i UML \u0111\u1ec1u l\u00e0 m\u1ed9t ki\u1ec3u OCL.<\/p>\n<\/li>\n<li data-nodeid=\"44140\">\n<p data-nodeid=\"44141\"><strong data-nodeid=\"44360\">\u0110\u00e1nh Gi\u00e1 T\u1ee9c Th\u1eddi:<\/strong>\u00a0Tr\u1ea1ng th\u00e1i c\u1ee7a c\u00e1c \u0111\u1ed1i t\u01b0\u1ee3ng kh\u00f4ng th\u1ec3 thay \u0111\u1ed5i\u00a0<em data-nodeid=\"44361\">trong qu\u00e1 tr\u00ecnh<\/em>\u00a0vi\u1ec7c \u0111\u00e1nh gi\u00e1 m\u1ed9t bi\u1ec3u th\u1ee9c OCL.<\/p>\n<\/li>\n<\/ol>\n<hr data-nodeid=\"44142\"\/>\n<h2 data-nodeid=\"44143\">2. Ng\u1eef ph\u00e1p v\u00e0 ng\u1eef ngh\u0129a c\u01a1 b\u1ea3n<\/h2>\n<h3 data-nodeid=\"44144\">B\u1ed1i c\u1ea3nh v\u00e0 Self<\/h3>\n<p data-nodeid=\"44145\">M\u1ed7i bi\u1ec3u th\u1ee9c OCL \u0111\u1ec1u \u0111\u01b0\u1ee3c \u0111\u00e1nh gi\u00e1 trong b\u1ed1i c\u1ea3nh c\u1ee7a m\u1ed9t b\u1ed9 ph\u00e2n lo\u1ea1i UML c\u1ee5 th\u1ec3 (l\u1edbp, giao di\u1ec7n, v.v.).<\/p>\n<ul data-nodeid=\"44146\">\n<li data-nodeid=\"44147\">\n<p data-nodeid=\"44148\"><strong data-nodeid=\"44369\"><code data-backticks=\"1\" data-nodeid=\"44366\">b\u1ed1i c\u1ea3nh<\/code><\/strong>: X\u00e1c \u0111\u1ecbnh l\u1edbp m\u00e0 r\u00e0ng bu\u1ed9c \u00e1p d\u1ee5ng.<\/p>\n<\/li>\n<li data-nodeid=\"44149\">\n<p data-nodeid=\"44150\"><strong data-nodeid=\"44374\"><code data-backticks=\"1\" data-nodeid=\"44371\">self<\/code><\/strong>: M\u1ed9t t\u1eeb kh\u00f3a \u0111\u01b0\u1ee3c b\u1ea3o l\u01b0u, tham chi\u1ebfu \u0111\u1ebfn m\u1ed9t th\u1ec3 hi\u1ec7n c\u1ee5 th\u1ec3 c\u1ee7a l\u1edbp b\u1ed1i c\u1ea3nh \u0111ang \u0111\u01b0\u1ee3c \u0111\u00e1nh gi\u00e1.<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44151\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh Person\r\n-- 'self' tham chi\u1ebfu \u0111\u1ebfn m\u1ed9t th\u1ec3 hi\u1ec7n c\u1ee5 th\u1ec3 c\u1ee7a Person\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44152\">Ghi ch\u00fa v\u00e0 to\u00e1n t\u1eed<\/h3>\n<ul data-nodeid=\"44153\">\n<li data-nodeid=\"44154\">\n<p data-nodeid=\"44155\"><strong data-nodeid=\"44384\">Ghi ch\u00fa:<\/strong>\u00a0\u0110\u01b0\u1ee3c \u0111\u00e1nh d\u1ea5u b\u1eb1ng\u00a0<code data-backticks=\"1\" data-nodeid=\"44380\">--<\/code>\u00a0(v\u00ed d\u1ee5,\u00a0<code data-backticks=\"1\" data-nodeid=\"44382\">-- \u0111\u00e2y l\u00e0 m\u1ed9t ghi ch\u00fa<\/code>).<\/p>\n<\/li>\n<li data-nodeid=\"44156\">\n<p data-nodeid=\"44157\"><strong data-nodeid=\"44401\">To\u00e1n t\u1eed trung t\u1ed1:<\/strong>\u00a0B\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng c\u00e1c to\u00e1n t\u1eed to\u00e1n h\u1ecdc\/logic chu\u1ea9n (<code data-backticks=\"1\" data-nodeid=\"44389\">+<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44391\">-<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44393\">=<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44395\">&lt;<\/code>). V\u1ec1 m\u1eb7t kh\u00e1i ni\u1ec7m,\u00a0<code data-backticks=\"1\" data-nodeid=\"44397\">a + b<\/code>\u00a0gi\u1ed1ng h\u1ec7t v\u1edbi\u00a0<code data-backticks=\"1\" data-nodeid=\"44399\">a.+(b)<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44158\">Truy c\u1eadp thu\u1ed9c t\u00ednh<\/h3>\n<p data-nodeid=\"44159\">S\u1eed d\u1ee5ng k\u00fd hi\u1ec7u ch\u1ea5m \u0111\u1ec3 truy c\u1eadp c\u00e1c thu\u1ed9c t\u00ednh ho\u1eb7c thao t\u00e1c. D\u1ea5u ngo\u1eb7c \u0111\u01a1n l\u00e0 b\u1eaft bu\u1ed9c cho c\u00e1c thao t\u00e1c, ngay c\u1ea3 khi ch\u00fang kh\u00f4ng c\u00f3 tham s\u1ed1.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44160\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh Person\r\nself.age             -- Truy c\u1eadp thu\u1ed9c t\u00ednh 'age'\r\nself.stockPrice()    -- G\u1ecdi thao t\u00e1c 'stockPrice'\r\n<\/code><\/pre>\n<hr data-nodeid=\"44161\"\/>\n<h2 data-nodeid=\"44162\">3. Ki\u1ec3u v\u00e0 B\u1ed9 s\u01b0u t\u1eadp<\/h2>\n<h3 data-nodeid=\"44163\">C\u00e1c ki\u1ec3u \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a s\u1eb5n c\u01a1 b\u1ea3n<\/h3>\n<p data-nodeid=\"44164\">OCL bao g\u1ed3m c\u00e1c ki\u1ec3u chu\u1ea9n v\u1edbi c\u00e1c thao t\u00e1c c\u1ee5 th\u1ec3:<\/p>\n<ul data-nodeid=\"44165\">\n<li data-nodeid=\"44166\">\n<p data-nodeid=\"44167\"><strong data-nodeid=\"44425\">Boolean:<\/strong>\u00a0<code data-backticks=\"1\" data-nodeid=\"44411\">\u0111\u00fang<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44413\">sai<\/code>\u00a0(Thao t\u00e1c:\u00a0<code data-backticks=\"1\" data-nodeid=\"44415\">v\u00e0<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44417\">ho\u1eb7c<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44419\">kh\u00f4ng<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44421\">ng\u1ee5 \u00fd<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44423\">xo\u1eb7c<\/code>)<\/p>\n<\/li>\n<li data-nodeid=\"44168\">\n<p data-nodeid=\"44169\"><strong data-nodeid=\"44448\">Nguy\u00ean \/ Th\u1ef1c:<\/strong>\u00a0S\u1ed1 (Thao t\u00e1c:\u00a0<code data-backticks=\"1\" data-nodeid=\"44430\">+<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44432\">-<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44434\">*<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44436\">\/<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44438\">abs<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44440\">max<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44442\">min<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44444\">div<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44446\">mod<\/code>)<\/p>\n<\/li>\n<li data-nodeid=\"44170\">\n<p data-nodeid=\"44171\"><strong data-nodeid=\"44461\">Chu\u1ed7i:<\/strong>\u00a0V\u0103n b\u1ea3n (Thao t\u00e1c:\u00a0<code data-backticks=\"1\" data-nodeid=\"44453\">k\u00edch th\u01b0\u1edbc<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44455\">n\u1ed1i<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44457\">con chu\u1ed7i<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44459\">th\u00e0nhS\u1ed1Nguy\u00ean<\/code>)<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44172\">B\u1ed9 s\u01b0u t\u1eadp<\/h3>\n<p data-nodeid=\"44173\">B\u1ed9 s\u01b0u t\u1eadp l\u00e0 c\u00e1c ki\u1ec3u tr\u1eebu t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c d\u00f9ng \u0111\u1ec3 l\u01b0u tr\u1eef nhi\u1ec1u ph\u1ea7n t\u1eed. Ch\u00fang \u0111\u01b0\u1ee3c truy c\u1eadp b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng k\u00fd hi\u1ec7u\u00a0<code data-backticks=\"1\" data-nodeid=\"44464\">-&gt;<\/code>\u00a0k\u00fd hi\u1ec7u.<\/p>\n<ol data-nodeid=\"44174\">\n<li data-nodeid=\"44175\">\n<p data-nodeid=\"44176\"><strong data-nodeid=\"44471\">T\u1eadp h\u1ee3p:<\/strong>\u00a0T\u1eadp h\u1ee3p to\u00e1n h\u1ecdc (kh\u00f4ng c\u00f3 ph\u1ea7n t\u1eed tr\u00f9ng l\u1eb7p, kh\u00f4ng th\u1ee9 t\u1ef1).\u00a0<code data-backticks=\"1\" data-nodeid=\"44470\">T\u1eadp h\u1ee3p {1, 2, 5}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44177\">\n<p data-nodeid=\"44178\"><strong data-nodeid=\"44477\">T\u1eadp h\u1ee3p c\u00f3 th\u1ee9 t\u1ef1:<\/strong>\u00a0Kh\u00f4ng c\u00f3 ph\u1ea7n t\u1eed tr\u00f9ng l\u1eb7p, nh\u01b0ng \u0111\u01b0\u1ee3c s\u1eafp x\u1ebfp theo v\u1ecb tr\u00ed.\u00a0<code data-backticks=\"1\" data-nodeid=\"44476\">T\u1eadp h\u1ee3p c\u00f3 th\u1ee9 t\u1ef1 {5, 4, 3}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44179\">\n<p data-nodeid=\"44180\"><strong data-nodeid=\"44483\">T\u00fai:<\/strong>\u00a0Cho ph\u00e9p tr\u00f9ng l\u1eb7p, kh\u00f4ng theo th\u1ee9 t\u1ef1.\u00a0<code data-backticks=\"1\" data-nodeid=\"44482\">T\u00fai {1, 2, 2, 5}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44181\">\n<p data-nodeid=\"44182\"><strong data-nodeid=\"44489\">D\u00e3y:<\/strong>\u00a0Cho ph\u00e9p tr\u00f9ng l\u1eb7p, theo th\u1ee9 t\u1ef1.\u00a0<code data-backticks=\"1\" data-nodeid=\"44488\">D\u00e3y {1, 2, 5, 10}<\/code><\/p>\n<ul data-nodeid=\"44183\">\n<li data-nodeid=\"44184\">\n<p data-nodeid=\"44185\"><em data-nodeid=\"44498\">Ghi ch\u00fa:<\/em>\u00a0K\u00fd hi\u1ec7u\u00a0<code data-backticks=\"1\" data-nodeid=\"44494\">..<\/code>\u00a0k\u00fd hi\u1ec7u t\u1ea1o ra m\u1ed9t d\u00e3y c\u00e1c s\u1ed1 nguy\u00ean li\u00ean ti\u1ebfp:\u00a0<code data-backticks=\"1\" data-nodeid=\"44496\">D\u00e3y {1..5}<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3 data-nodeid=\"44186\">C\u00e1c thao t\u00e1c t\u1eadp h\u1ee3p ch\u00ednh<\/h3>\n<ul data-nodeid=\"44187\">\n<li data-nodeid=\"44188\">\n<p data-nodeid=\"44189\"><strong data-nodeid=\"44518\">Chung:<\/strong>\u00a0<code data-backticks=\"1\" data-nodeid=\"44504\">size()<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44506\">isEmpty()<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44508\">notEmpty()<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44510\">includes(v)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44512\">excludes(v)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44514\">count(v)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44516\">sum()<\/code>.<\/p>\n<\/li>\n<li data-nodeid=\"44190\">\n<p data-nodeid=\"44191\"><strong data-nodeid=\"44522\">B\u1ed9 l\u1eb7p (C\u1ea7n thi\u1ebft cho OCL):<\/strong><\/p>\n<ul data-nodeid=\"44192\">\n<li data-nodeid=\"44193\">\n<p data-nodeid=\"44194\"><code data-backticks=\"1\" data-nodeid=\"44523\">select(expr)<\/code>: Tr\u1ea3 v\u1ec1 c\u00e1c ph\u1ea7n t\u1eed n\u01a1i m\u00e0\u00a0<code data-backticks=\"1\" data-nodeid=\"44525\">bi\u1ec3u_th\u1ee9c<\/code>\u00a0l\u00e0 \u0111\u00fang.<\/p>\n<\/li>\n<li data-nodeid=\"44195\">\n<p data-nodeid=\"44196\"><code data-backticks=\"1\" data-nodeid=\"44527\">reject(bi\u1ec3u_th\u1ee9c)<\/code>: Tr\u1ea3 v\u1ec1 c\u00e1c ph\u1ea7n t\u1eed n\u01a1i m\u00e0\u00a0<code data-backticks=\"1\" data-nodeid=\"44529\">bi\u1ec3u_th\u1ee9c<\/code>\u00a0l\u00e0 sai.<\/p>\n<\/li>\n<li data-nodeid=\"44197\">\n<p data-nodeid=\"44198\"><code data-backticks=\"1\" data-nodeid=\"44531\">collect(bi\u1ec3u_th\u1ee9c)<\/code>: Tr\u00edch xu\u1ea5t m\u1ed9t thu\u1ed9c t\u00ednh c\u1ee5 th\u1ec3 t\u1eeb t\u1ea5t c\u1ea3 c\u00e1c ph\u1ea7n t\u1eed v\u00e0o m\u1ed9t b\u1ed9 s\u01b0u t\u1eadp m\u1edbi.<\/p>\n<\/li>\n<li data-nodeid=\"44199\">\n<p data-nodeid=\"44200\"><code data-backticks=\"1\" data-nodeid=\"44533\">forAll(bi\u1ec3u_th\u1ee9c)<\/code>: Tr\u1ea3 v\u1ec1\u00a0<code data-backticks=\"1\" data-nodeid=\"44535\">\u0111\u00fang<\/code>\u00a0n\u1ebfu\u00a0<code data-backticks=\"1\" data-nodeid=\"44537\">bi\u1ec3u_th\u1ee9c<\/code>\u00a0l\u00e0 \u0111\u00fang cho\u00a0<em data-nodeid=\"44543\">t\u1ea5t c\u1ea3<\/em>\u00a0c\u00e1c ph\u1ea7n t\u1eed.<\/p>\n<\/li>\n<li data-nodeid=\"44201\">\n<p data-nodeid=\"44202\"><code data-backticks=\"1\" data-nodeid=\"44544\">exists(bi\u1ec3u_th\u1ee9c)<\/code>: Tr\u1ea3 v\u1ec1\u00a0<code data-backticks=\"1\" data-nodeid=\"44546\">\u0111\u00fang<\/code>\u00a0n\u1ebfu\u00a0<code data-backticks=\"1\" data-nodeid=\"44548\">bi\u1ec3u_th\u1ee9c<\/code>\u00a0l\u00e0 \u0111\u00fang cho\u00a0<em data-nodeid=\"44554\">\u00edt nh\u1ea5t m\u1ed9t<\/em>\u00a0ph\u1ea7n t\u1eed.<\/p>\n<\/li>\n<li data-nodeid=\"44203\">\n<p data-nodeid=\"44204\"><code data-backticks=\"1\" data-nodeid=\"44555\">iterate(elem; acc = init | bi\u1ec3u_th\u1ee9c)<\/code>: C\u01a1 s\u1edf chung cho t\u1ea5t c\u1ea3 c\u00e1c b\u1ed9 l\u1eb7p.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p data-nodeid=\"44205\"><em data-nodeid=\"44560\">C\u00e1c bi\u1ebfn th\u1ec3 c\u00fa ph\u00e1p b\u1ed9 l\u1eb7p:<\/em><\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44206\"><code data-language=\"ocl\">self.employee-&gt;select(age &gt; 50)\r\nself.employee-&gt;select(p | p.age &gt; 50)\r\nself.employee-&gt;select(p: Person | p.age &gt; 50)\r\n<\/code><\/pre>\n<hr data-nodeid=\"44207\"\/>\n<h2 data-nodeid=\"44208\">4. Duy\u1ec7t qua c\u00e1c M\u00f4 h\u00ecnh UML<\/h2>\n<p data-nodeid=\"44209\">OCL \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng r\u1ed9ng r\u00e3i nh\u01b0 m\u1ed9t ng\u00f4n ng\u1eef \u0111i\u1ec1u h\u01b0\u1edbng \u0111\u1ec3 \u0111i qua c\u00e1c m\u1ed1i quan h\u1ec7.<\/p>\n<h3 data-nodeid=\"44210\">\u0110i\u1ec1u h\u01b0\u1edbng ti\u00eau chu\u1ea9n<\/h3>\n<p data-nodeid=\"44211\">\u0110i\u1ec1u h\u01b0\u1edbng b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng t\u00ean vai tr\u00f2 \u0111\u1ed1i di\u1ec7n. Ki\u1ec3u tr\u1ea3 v\u1ec1 ph\u1ee5 thu\u1ed9c v\u00e0o b\u1ed9i s\u1ed1:<\/p>\n<ul data-nodeid=\"44212\">\n<li data-nodeid=\"44213\">\n<p data-nodeid=\"44214\"><strong data-nodeid=\"44573\">B\u1ed9i s\u1ed1\u00a0<code data-backticks=\"1\" data-nodeid=\"44567\">1<\/code>\u00a0ho\u1eb7c\u00a0<code data-backticks=\"1\" data-nodeid=\"44569\">0..1<\/code>:<\/strong>\u00a0Tr\u1ea3 v\u1ec1 m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng duy nh\u1ea5t.<\/p>\n<\/li>\n<li data-nodeid=\"44215\">\n<p data-nodeid=\"44216\"><strong data-nodeid=\"44586\">B\u1ed9i s\u1ed1\u00a0<code data-backticks=\"1\" data-nodeid=\"44576\">*<\/code>:<\/strong>\u00a0Tr\u1ea3 v\u1ec1 m\u1ed9t\u00a0<code data-backticks=\"1\" data-nodeid=\"44580\">T\u1eadp h\u1ee3p<\/code>\u00a0(ho\u1eb7c\u00a0<code data-backticks=\"1\" data-nodeid=\"44582\">T\u1eadp h\u1ee3p c\u00f3 th\u1ee9 t\u1ef1<\/code>\u00a0n\u1ebfu \u0111\u01b0\u1ee3c \u0111\u00e1nh d\u1ea5u\u00a0<code data-backticks=\"1\" data-nodeid=\"44584\">{c\u00f3 th\u1ee9 t\u1ef1}<\/code>).<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44217\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh C\u00f4ng ty\r\nself.manager.age &gt; 40               -- manager l\u00e0 0..1, tr\u1ea3 v\u1ec1 m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng Person\r\nself.employee-&gt;notEmpty()           -- employee l\u00e0 0..*, tr\u1ea3 v\u1ec1 m\u1ed9t T\u1eadp h\u1ee3p\r\n<\/code><\/pre>\n<p data-nodeid=\"44218\"><em data-nodeid=\"44592\">N\u1ebfu t\u00ean vai tr\u00f2 b\u1ecb thi\u1ebfu, h\u00e3y s\u1eed d\u1ee5ng t\u00ean vi\u1ebft th\u01b0\u1eddng c\u1ee7a l\u1edbp \u1edf \u0111\u1ea7u kia (v\u00ed d\u1ee5 nh\u01b0\u00a0<code data-backticks=\"1\" data-nodeid=\"44589\">self.bank<\/code>).<\/em><\/p>\n<h3 data-nodeid=\"44219\">L\u1edbp li\u00ean k\u1ebft<\/h3>\n<p data-nodeid=\"44220\">\u0110i\u1ec1u h\u01b0\u1edbng \u0111\u1ebfn m\u1ed9t l\u1edbp li\u00ean k\u1ebft b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng t\u00ean vi\u1ebft th\u01b0\u1eddng c\u1ee7a l\u1edbp li\u00ean k\u1ebft.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44221\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh Ng\u01b0\u1eddi\r\nself.job-&gt;size() &gt;= 1  -- 'job' l\u00e0 l\u1edbp li\u00ean k\u1ebft gi\u1eefa Ng\u01b0\u1eddi v\u00e0 C\u00f4ng ty\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44222\">C\u00e1c m\u1ed1i quan h\u1ec7 \u0111\u1ec7 quy<\/h3>\n<p data-nodeid=\"44223\">Khi m\u1ed9t m\u1ed1i quan h\u1ec7 quay tr\u1edf l\u1ea1i l\u1edbp gi\u1ed1ng nhau (v\u00ed d\u1ee5 nh\u01b0 Cu\u1ed9c h\u00f4n nh\u00e2n gi\u1eefa hai Ng\u01b0\u1eddi), b\u1ea1n ph\u1ea3i ch\u1ec9 \u0111\u1ecbnh h\u01b0\u1edbng b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng d\u1ea5u ngo\u1eb7c vu\u00f4ng\u00a0<code data-backticks=\"1\" data-nodeid=\"44597\">[t\u00eanVaiTr\u00f2]<\/code>.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44224\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh Ng\u01b0\u1eddi\r\nself.marriage[wife]-&gt;ch\u1ecdn(m | m.\u0111\u00e3_k\u1ebft_th\u00fac = false)-&gt;k\u00edch_th\u01b0\u1edbc() = 1\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44225\">C\u00e1c m\u1ed1i quan h\u1ec7 \u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh r\u00f5<\/h3>\n<p data-nodeid=\"44226\">S\u1eed d\u1ee5ng c\u00e1c thu\u1ed9c t\u00ednh \u0111\u1ecbnh danh trong d\u1ea5u ngo\u1eb7c vu\u00f4ng \u0111\u1ec3 ch\u1ecdn m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng c\u1ee5 th\u1ec3.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44227\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh Ng\u00e2n h\u00e0ng\r\nself.customer[12345]  -- Tr\u1ea3 v\u1ec1 \u0111\u1ed1i t\u01b0\u1ee3ng Ng\u01b0\u1eddi c\u1ee5 th\u1ec3 c\u00f3 accountNo 12345\r\nself.customer         -- Tr\u1ea3 v\u1ec1 m\u1ed9t T\u1eadp h\u1ee3p t\u1ea5t c\u1ea3 kh\u00e1ch h\u00e0ng\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44228\">Chuy\u1ec3n ki\u1ec3u l\u1ea1i (\u00e9p ki\u1ec3u)<\/h3>\n<p data-nodeid=\"44229\">S\u1eed d\u1ee5ng\u00a0<code data-backticks=\"1\" data-nodeid=\"44603\">oclAsType()<\/code>\u00a0\u0111\u1ec3 truy c\u1eadp c\u00e1c thu\u1ed9c t\u00ednh c\u1ee7a m\u1ed9t ki\u1ec3u con ho\u1eb7c m\u1ed9t thu\u1ed9c t\u00ednh l\u1edbp cha b\u1ecb \u1ea9n.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44230\"><code data-language=\"ocl\">self.oclAsType(Sub).p       -- Truy c\u1eadp thu\u1ed9c t\u00ednh 'p' \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a trong ki\u1ec3u con\r\nself.oclAsType(Super).p     -- Truy c\u1eadp thu\u1ed9c t\u00ednh 'p' \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a trong l\u1edbp cha\r\n<\/code><\/pre>\n<hr data-nodeid=\"44231\"\/>\n<h2 data-nodeid=\"44232\">5. Vi\u1ebft c\u00e1c r\u00e0ng bu\u1ed9c<\/h2>\n<h3 data-nodeid=\"44233\">1. C\u00e1c b\u1ea5t bi\u1ebfn (<code data-backticks=\"1\" data-nodeid=\"44607\">inv<\/code>)<\/h3>\n<p data-nodeid=\"44234\">C\u00e1c \u0111i\u1ec1u ki\u1ec7n ph\u1ea3i\u00a0<strong data-nodeid=\"44614\">lu\u00f4n lu\u00f4n<\/strong>\u00a0\u0111\u00fang v\u1edbi m\u1ecdi th\u1ec3 hi\u1ec7n c\u1ee7a m\u1ed9t l\u1edbp.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44235\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh C\u00f4ng ty \r\ninv: self.s\u1ed1_l\u01b0\u1ee3ng_nh\u00e2n_vi\u00ean &lt;= 50\r\ninv SME: self.gi\u00e1_c\u1ed5_phi\u1ebfu() &gt; 0  -- 'SME' l\u00e0 t\u00ean t\u00f9y ch\u1ecdn cho r\u00e0ng bu\u1ed9c\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44236\">2. \u0110i\u1ec1u ki\u1ec7n ti\u1ec1n v\u00e0 h\u1eadu (<code data-backticks=\"1\" data-nodeid=\"44616\">pre<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44618\">post<\/code>)<\/h3>\n<p data-nodeid=\"44237\">C\u00e1c r\u00e0ng bu\u1ed9c li\u00ean quan \u0111\u1ebfn c\u00e1c thao t\u00e1c.<\/p>\n<ul data-nodeid=\"44238\">\n<li data-nodeid=\"44239\">\n<p data-nodeid=\"44240\"><strong data-nodeid=\"44629\"><code data-backticks=\"1\" data-nodeid=\"44622\">pre<\/code><\/strong>: Ph\u1ea3i \u0111\u00fang\u00a0<em data-nodeid=\"44630\">tr\u01b0\u1edbc<\/em>\u00a0th\u1ef1c thi.<\/p>\n<\/li>\n<li data-nodeid=\"44241\">\n<p data-nodeid=\"44242\"><strong data-nodeid=\"44641\"><code data-backticks=\"1\" data-nodeid=\"44632\">post<\/code><\/strong>: Ph\u1ea3i \u0111\u00fang\u00a0<em data-nodeid=\"44642\">sau<\/em>\u00a0th\u1ef1c thi. S\u1eed d\u1ee5ng\u00a0<code data-backticks=\"1\" data-nodeid=\"44639\">k\u1ebft qu\u1ea3<\/code>\u00a0cho gi\u00e1 tr\u1ecb tr\u1ea3 v\u1ec1.<\/p>\n<\/li>\n<li data-nodeid=\"44243\">\n<p data-nodeid=\"44244\"><strong data-nodeid=\"44651\"><code data-backticks=\"1\" data-nodeid=\"44644\">@pre<\/code><\/strong>: \u0110\u01b0\u1ee3c s\u1eed d\u1ee5ng trong \u0111i\u1ec1u ki\u1ec7n h\u1eadu \u0111\u1ec3 tham chi\u1ebfu \u0111\u1ebfn gi\u00e1 tr\u1ecb c\u1ee7a m\u1ed9t thu\u1ed9c t\u00ednh\u00a0<em data-nodeid=\"44652\">tr\u01b0\u1edbc<\/em>\u00a0thao t\u00e1c b\u1eaft \u0111\u1ea7u.<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44245\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh Person::income(): Integer\r\npre adult: self.age &gt;= 18\r\npost resultOK: result &lt; 5000\r\n\r\nb\u1ed1i c\u1ea3nh Company::hireEmployee(p: Person)\r\npost: employee = employee@pre-&gt;including(p)\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44246\">3. Bi\u1ec3u th\u1ee9c Body, Kh\u1edfi t\u1ea1o v\u00e0 \u0110\u00e3 suy ra<\/h3>\n<ul data-nodeid=\"44247\">\n<li data-nodeid=\"44248\">\n<p data-nodeid=\"44249\"><strong data-nodeid=\"44658\"><code data-backticks=\"1\" data-nodeid=\"44655\">body<\/code><\/strong>: X\u00e1c \u0111\u1ecbnh k\u1ebft qu\u1ea3 c\u1ee7a m\u1ed9t thao t\u00e1c truy v\u1ea5n (c\u00f3 th\u1ec3 \u0111\u1ec7 quy).<\/p>\n<\/li>\n<li data-nodeid=\"44250\">\n<p data-nodeid=\"44251\"><strong data-nodeid=\"44663\"><code data-backticks=\"1\" data-nodeid=\"44660\">init<\/code><\/strong>: X\u00e1c \u0111\u1ecbnh gi\u00e1 tr\u1ecb kh\u1edfi \u0111\u1ea7u c\u1ee7a m\u1ed9t thu\u1ed9c t\u00ednh.<\/p>\n<\/li>\n<li data-nodeid=\"44252\">\n<p data-nodeid=\"44253\"><strong data-nodeid=\"44668\"><code data-backticks=\"1\" data-nodeid=\"44665\">derive<\/code><\/strong>: X\u00e1c \u0111\u1ecbnh m\u1ed9t thu\u1ed9c t\u00ednh \u0111\u00e3 suy ra.<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44254\"><code data-language=\"ocl\">b\u1ed1i c\u1ea3nh Person::income(): Integer\r\nbody: self.job.salary-&gt;sum()\r\n\r\nb\u1ed1i c\u1ea3nh Person::isMarried: Boolean\r\ninit: false\r\n\r\nb\u1ed1i c\u1ea3nh Company::noEmployees: Integer\r\nderive: self.employee-&gt;size()\r\n<\/code><\/pre>\n<hr data-nodeid=\"44255\"\/>\n<h2 data-nodeid=\"44256\">6. T\u00ednh n\u0103ng n\u00e2ng cao c\u1ee7a OCL<\/h2>\n<h3 data-nodeid=\"44257\">Bi\u1ec3u th\u1ee9c Let v\u00e0 Def<\/h3>\n<ul data-nodeid=\"44258\">\n<li data-nodeid=\"44259\">\n<p data-nodeid=\"44260\"><strong data-nodeid=\"44675\"><code data-backticks=\"1\" data-nodeid=\"44672\">let<\/code><\/strong>: X\u00e1c \u0111\u1ecbnh m\u1ed9t bi\u1ebfn c\u1ee5c b\u1ed9 trong m\u1ed9t bi\u1ec3u th\u1ee9c duy nh\u1ea5t.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44261\"><code data-language=\"ocl\">let totHours: Integer = self.worksOn-&gt;collect(hours)-&gt;sum() in totHours &gt;= 30\r\n<\/code><\/pre>\n<\/li>\n<li data-nodeid=\"44262\">\n<p data-nodeid=\"44263\"><strong data-nodeid=\"44680\"><code data-backticks=\"1\" data-nodeid=\"44677\">def<\/code><\/strong>: X\u00e1c \u0111\u1ecbnh c\u00e1c bi\u1ebfn ho\u1eb7c thao t\u00e1c c\u00f3 th\u1ec3 t\u00e1i s\u1eed d\u1ee5ng g\u1eafn v\u1edbi m\u1ed9t b\u1ed9 ph\u00e2n lo\u1ea1i.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44264\"><code data-language=\"ocl\">def: hasTitle(t: String): Boolean = self.job-&gt;exists(title = t)\r\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44265\">Gi\u00e1 tr\u1ecb kh\u00f4ng x\u00e1c \u0111\u1ecbnh (Logic 3 gi\u00e1 tr\u1ecb)<\/h3>\n<p data-nodeid=\"44266\">N\u1ebfu m\u1ed9t bi\u1ec3u th\u1ee9c con kh\u00f4ng x\u00e1c \u0111\u1ecbnh (v\u00ed d\u1ee5: \u0111i t\u1edbi m\u1ed9t li\u00ean k\u1ebft null), to\u00e0n b\u1ed9 bi\u1ec3u th\u1ee9c s\u1ebd kh\u00f4ng x\u00e1c \u0111\u1ecbnh. Tuy nhi\u00ean, c\u00e1c to\u00e1n t\u1eed Boolean c\u00f3 ngo\u1ea1i l\u1ec7 ng\u1eafn m\u1ea1ch:<\/p>\n<ul data-nodeid=\"44267\">\n<li data-nodeid=\"44268\">\n<p data-nodeid=\"44269\"><code data-backticks=\"1\" data-nodeid=\"44683\">true or &lt;kh\u00f4ng x\u00e1c \u0111\u1ecbnh&gt;<\/code>\u00a0=\u00a0<strong data-nodeid=\"44688\">true<\/strong><\/p>\n<\/li>\n<li data-nodeid=\"44270\">\n<p data-nodeid=\"44271\"><code data-backticks=\"1\" data-nodeid=\"44689\">false and &lt;kh\u00f4ng x\u00e1c \u0111\u1ecbnh&gt;<\/code>\u00a0=\u00a0<strong data-nodeid=\"44694\">sai<\/strong><\/p>\n<\/li>\n<li data-nodeid=\"44272\">\n<p data-nodeid=\"44273\"><code data-backticks=\"1\" data-nodeid=\"44695\">sai suy ra &lt;undefined&gt;<\/code>\u00a0=\u00a0<strong data-nodeid=\"44700\">\u0111\u00fang<\/strong><\/p>\n<\/li>\n<li data-nodeid=\"44274\">\n<p data-nodeid=\"44275\"><code data-backticks=\"1\" data-nodeid=\"44701\">&lt;undefined&gt; suy ra \u0111\u00fang<\/code>\u00a0=\u00a0<strong data-nodeid=\"44706\">\u0111\u00fang<\/strong><\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44276\">T\u00ednh n\u0103ng l\u1edbp v\u00e0 thu\u1ed9c t\u00ednh \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a s\u1eb5n<\/h3>\n<ul data-nodeid=\"44277\">\n<li data-nodeid=\"44278\">\n<p data-nodeid=\"44279\"><strong data-nodeid=\"44714\"><code data-backticks=\"1\" data-nodeid=\"44711\">allInstances()<\/code><\/strong>: Tr\u1ea3 v\u1ec1 m\u1ed9t t\u1eadp h\u1ee3p t\u1ea5t c\u1ea3 c\u00e1c th\u1ec3 hi\u1ec7n hi\u1ec7n c\u00f3 c\u1ee7a m\u1ed9t l\u1edbp.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44280\"><code data-language=\"ocl\">Person.allInstances()-&gt;size() &lt;= 100\r\n<\/code><\/pre>\n<\/li>\n<li data-nodeid=\"44281\">\n<p data-nodeid=\"44282\"><strong data-nodeid=\"44727\">Thu\u1ed9c t\u00ednh \u0111\u1ed1i t\u01b0\u1ee3ng:<\/strong>\u00a0<code data-backticks=\"1\" data-nodeid=\"44719\">oclIsTypeOf(Lo\u1ea1i)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44721\">oclIsKindOf(Lo\u1ea1i)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44723\">oclInState(Tr\u1ea1ng th\u00e1i)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44725\">oclIsNew<\/code>\u00a0(s\u1eed d\u1ee5ng trong \u0111i\u1ec1u ki\u1ec7n sau).<\/p>\n<\/li>\n<\/ul>\n<hr data-nodeid=\"44283\"\/>\n<h2 data-nodeid=\"44284\">7. 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=\"44285\">\u0110\u1ec3 c\u1ee7ng c\u1ed1 c\u00e1c kh\u00e1i ni\u1ec7m n\u00e0y, d\u01b0\u1edbi \u0111\u00e2y l\u00e0 m\u1ed9t b\u1ed9 c\u00e1c r\u00e0ng bu\u1ed9c to\u00e0n v\u1eb9n \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng cho m\u00f4 h\u00ecnh c\u01a1 s\u1edf d\u1eef li\u1ec7u C\u00f4ng ty (Nh\u00e2n vi\u00ean, Ph\u00f2ng ban, D\u1ef1 \u00e1n, Ng\u01b0\u1eddi ph\u1ee5 thu\u1ed9c).<\/p>\n<h3 data-nodeid=\"44286\">R\u00e0ng bu\u1ed9c thu\u1ed9c t\u00ednh c\u01a1 b\u1ea3n<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44287\"><code data-language=\"ocl\">-- Tu\u1ed5i ph\u1ea3i l\u1edbn h\u01a1n ho\u1eb7c b\u1eb1ng 18\r\nb\u1ed1i c\u1ea3nh Employee inv: self.age() &gt;= 18\r\n\r\n-- Ng\u00e0y tuy\u1ec3n d\u1ee5ng ph\u1ea3i sau ng\u00e0y sinh\r\nb\u1ed1i c\u1ea3nh Employee inv: self.hireDate &gt; self.birthDate\r\n\r\n-- Ng\u00e0y b\u1eaft \u0111\u1ea7u l\u00e0m qu\u1ea3n l\u00fd ph\u1ea3i sau ng\u00e0y tuy\u1ec3n d\u1ee5ng\r\nb\u1ed1i c\u1ea3nh Employee inv: self.manages-&gt;kh\u00f4ng r\u1ed7ng suy ra self.manages.startDate &gt; self.hireDate\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44288\">R\u00e0ng bu\u1ed9c \u0111i\u1ec1u h\u01b0\u1edbng v\u00e0 m\u1ed1i quan h\u1ec7<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44289\"><code data-language=\"ocl\">-- Ng\u01b0\u1eddi gi\u00e1m s\u00e1t ph\u1ea3i l\u1edbn tu\u1ed5i h\u01a1n v\u00e0 \u0111\u01b0\u1ee3c tr\u1ea3 l\u01b0\u01a1ng cao h\u01a1n nh\u00e2n vi\u00ean\r\nb\u1ed1i c\u1ea3nh Employee \r\ninv: self.supervisor-&gt;kh\u00f4ng r\u1ed7ng suy ra self.age() &gt; self.supervisor.age()\r\ninv: self.supervisor-&gt;kh\u00f4ng r\u1ed7ng suy ra self.salary &lt; self.supervisor.salary\r\n\r\n-- Ng\u01b0\u1eddi gi\u00e1m s\u00e1t ph\u1ea3i \u0111\u01b0\u1ee3c tuy\u1ec3n d\u1ee5ng tr\u01b0\u1edbc c\u00e1c nh\u00e2n vi\u00ean d\u01b0\u1edbi quy\u1ec1n\r\nb\u1ed1i c\u1ea3nh Employee \r\ninv: self.subordinates-&gt;kh\u00f4ng r\u1ed7ng suy ra self.subordinates-&gt;forall(e | e.hireDate &gt; self.hireDate)\r\n\r\n-- Tr\u01b0\u1edfng ph\u00f2ng ph\u1ea3i l\u00e0 nh\u00e2n vi\u00ean c\u1ee7a ph\u00f2ng \u0111\u00f3\r\nb\u1ed1i c\u1ea3nh Department \r\ninv: self.worksFor-&gt;bao g\u1ed3m(self.manages.employee)\r\n\r\n-- \u0110\u1ecba \u0111i\u1ec3m d\u1ef1 \u00e1n ph\u1ea3i l\u00e0 m\u1ed9t trong c\u00e1c \u0111\u1ecba \u0111i\u1ec3m c\u1ee7a ph\u00f2ng ban\r\nb\u1ed1i c\u1ea3nh Project \r\ninv: self.controls.locations-&gt;bao g\u1ed3m(self.location)\r\n\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\nb\u1ed1i c\u1ea3nh Employee \r\ninv: self.worksFor.controls-&gt;bao g\u1ed3mT\u1ea5t c\u1ea3(self.worksOn.project)\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44290\">R\u00e0ng bu\u1ed9c t\u1eadp h\u1ee3p v\u00e0 b\u1ed9 \u0111\u1ebfm<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44291\"><code data-language=\"ocl\">-- S\u1ed1 b\u1ea3o hi\u1ec3m x\u00e3 h\u1ed9i ph\u1ea3i l\u00e0 \u0111\u1ecbnh danh duy nh\u1ea5t tr\u00ean t\u1ea5t c\u1ea3 nh\u00e2n vi\u00ean\r\nb\u1ed1i c\u1ea3nh Employee \r\ninv: Employee.allInstances-&gt;forAll(e1, e2 | e1 &lt;&gt; e2 suy ra e1.SSN &lt;&gt; e2.SSN)\r\n\r\n-- T\u00ean ng\u01b0\u1eddi ph\u1ee5 thu\u1ed9c v\u00e0 m\u1ed1i quan h\u1ec7 ph\u1ea3i duy nh\u1ea5t cho m\u1ed7i nh\u00e2n vi\u00ean\r\nb\u1ed1i c\u1ea3nh Employee \r\ninv: self.dependents-&gt;forAll(e1, e2 | \r\n      e1 &lt;&gt; e2 suy ra (e1.name &lt;&gt; e2.name ho\u1eb7c e1.relationship &lt;&gt; e2.relationship))\r\n\r\n-- Thu\u1ed9c t\u00ednh \u0111\u01b0\u1ee3c suy ra: s\u1ed1 l\u01b0\u1ee3ng nh\u00e2n vi\u00ean trong m\u1ed9t ph\u00f2ng ban\r\nb\u1ed1i c\u1ea3nh Department \r\ninv: self.nbrEmployees = self.worksFor-&gt;size()\r\n\r\n-- Nh\u00e2n vi\u00ean ch\u1ec9 \u0111\u01b0\u1ee3c l\u00e0m vi\u1ec7c tr\u00ean t\u1ed1i \u0111a 4 d\u1ef1 \u00e1n\r\nb\u1ed1i c\u1ea3nh Employee \r\ninv: self.worksOn-&gt;size() &lt;= 4\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44292\">Logic ph\u1ee9c t\u1ea1p s\u1eed d\u1ee5ng\u00a0<code data-backticks=\"1\" data-nodeid=\"44734\">cho<\/code>\u00a0v\u00e0\u00a0<code data-backticks=\"1\" data-nodeid=\"44736\">ch\u1ecdn<\/code><\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44293\"><code data-language=\"ocl\">-- T\u1ed5ng s\u1ed1 gi\u1edd l\u00e0m vi\u1ec7c ph\u1ea3i n\u1eb1m trong kho\u1ea3ng t\u1eeb 30 \u0111\u1ebfn 50 m\u1ed7i tu\u1ea7n\r\nb\u1ed1i c\u1ea3nh Nh\u00e2n vi\u00ean\r\n\u0111i\u1ec1u ki\u1ec7n: cho totHours: Integer = self.worksOn-&gt;thu th\u1eadp(gi\u1edd)-&gt;t\u1ed5ng\r\n     trong totHours &gt;= 30 v\u00e0 totHours &lt;= 50\r\n\r\n-- Nhi\u1ec1u nh\u1ea5t 2 nh\u00e2n vi\u00ean c\u00f3 th\u1ec3 l\u00e0m vi\u1ec7c \u00edt h\u01a1n 10 gi\u1edd tr\u00ean m\u1ed9t d\u1ef1 \u00e1n c\u1ee5 th\u1ec3\r\nb\u1ed1i c\u1ea3nh D\u1ef1 \u00e1n\r\n\u0111i\u1ec1u ki\u1ec7n: self.worksOn-&gt;ch\u1ecdn(gi\u1edd &lt; 10)-&gt;k\u00edch th\u01b0\u1edbc() &lt;= 2\r\n\r\n-- Ch\u1ec9 nh\u1eefng qu\u1ea3n l\u00fd ph\u00f2ng ban m\u1edbi \u0111\u01b0\u1ee3c ph\u00e9p l\u00e0m vi\u1ec7c \u00edt h\u01a1n 5 gi\u1edd tr\u00ean m\u1ed9t d\u1ef1 \u00e1n\r\nb\u1ed1i c\u1ea3nh Nh\u00e2n vi\u00ean\r\n\u0111i\u1ec1u ki\u1ec7n: self.worksOn-&gt;ch\u1ecdn(gi\u1edd &lt; 5)-&gt;kh\u00f4ng r\u1ed7ng() ng\u1ee5 \u00fd\r\n     self.worksFor.manages.employee = self\r\n\r\n-- Nh\u00e2n vi\u00ean kh\u00f4ng c\u00f3 c\u1ea5p d\u01b0\u1edbi ph\u1ea3i l\u00e0m vi\u1ec7c t\u1eeb 10 gi\u1edd tr\u1edf l\u00ean tr\u00ean T\u1ea4T C\u1ea2 c\u00e1c d\u1ef1 \u00e1n c\u1ee7a h\u1ecd\r\nb\u1ed1i c\u1ea3nh Nh\u00e2n vi\u00ean\r\n\u0111i\u1ec1u ki\u1ec7n: self.subordinates-&gt;r\u1ed7ng() ng\u1ee5 \u00fd self.worksOn-&gt;m\u1ecdi(gi\u1edd &gt;= 10)\r\n\r\n-- Qu\u1ea3n l\u00fd ph\u00f2ng ban ph\u1ea3i l\u00e0m vi\u1ec7c t\u1eeb 5 gi\u1edd tr\u1edf l\u00ean tr\u00ean T\u1ea4T C\u1ea2 c\u00e1c d\u1ef1 \u00e1n do ph\u00f2ng ban ki\u1ec3m so\u00e1t\r\nb\u1ed1i c\u1ea3nh Ph\u00f2ng ban\r\n\u0111i\u1ec1u ki\u1ec7n: self.controls-&gt;m\u1ecdi(p: D\u1ef1 \u00e1n | \r\n      self.manages.employee.worksOn-&gt;ch\u1ecdn(gi\u1edd &gt;= 5)-&gt;ch\u1ee9a(p))\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44294\">Ng\u0103n ch\u1eb7n chu tr\u00ecnh (Logic \u0111\u1ec7 quy)<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44295\"><code data-language=\"ocl\">-- M\u1ed9t nh\u00e2n vi\u00ean kh\u00f4ng th\u1ec3 gi\u00e1m s\u00e1t ch\u00ednh m\u00ecnh\r\nb\u1ed1i c\u1ea3nh Nh\u00e2n vi\u00ean \u0111i\u1ec1u ki\u1ec7n: self.subordinates-&gt;lo\u1ea1i tr\u1eeb(self)\r\n\r\n-- C\u1ea5u tr\u00fac gi\u00e1m s\u00e1t kh\u00f4ng \u0111\u01b0\u1ee3c c\u00f3 chu tr\u00ecnh\r\nb\u1ed1i c\u1ea3nh Nh\u00e2n vi\u00ean\r\ndef: t\u1ea5t_c\u00e1c_c\u1ea5p_d\u01b0\u1edbi = self.subordinates-&gt;h\u1ee3p(\r\n          self.subordinates-&gt;thu th\u1eadp(e: Nh\u00e2n vi\u00ean | e.t\u1ea5t_c\u00e1c_c\u1ea5p_d\u01b0\u1edbi))\r\n\u0111i\u1ec1u ki\u1ec7n: self.t\u1ea5t_c\u00e1c_c\u1ea5p_d\u01b0\u1edbi-&gt;lo\u1ea1i tr\u1eeb(self)<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>D\u1ef1a tr\u00ean c\u00e1c t\u00e0i li\u1ec7u b\u00e0i gi\u1ea3ng \u0111\u01b0\u1ee3c cung c\u1ea5p, h\u01b0\u1edbng d\u1eabn n\u00e0y bao qu\u00e1t c\u00e1c kh\u00e1i ni\u1ec7m c\u01a1 b\u1ea3n, c\u00fa ph\u00e1p v\u00e0 c\u00e1c \u1ee9ng d\u1ee5ng th\u1ef1c ti\u1ec5n c\u1ee7a Ng\u00f4n ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) trong b\u1ed1i c\u1ea3nh m\u00f4 h\u00ecnh h\u00f3a UML. 1. Gi\u1edbi thi\u1ec7u v\u1ec1 OCL T\u1ea1i sao ch\u00fang ta c\u1ea7n OCL? M\u1eb7c [&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-11702","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 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) - 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-the-object-constraint-language-ocl\/\" \/>\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 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) - Visual Paradigm Blog\" \/>\n<meta property=\"og:description\" content=\"D\u1ef1a tr\u00ean c\u00e1c t\u00e0i li\u1ec7u b\u00e0i gi\u1ea3ng \u0111\u01b0\u1ee3c cung c\u1ea5p, h\u01b0\u1edbng d\u1eabn n\u00e0y bao qu\u00e1t c\u00e1c kh\u00e1i ni\u1ec7m c\u01a1 b\u1ea3n, c\u00fa ph\u00e1p v\u00e0 c\u00e1c \u1ee9ng d\u1ee5ng th\u1ef1c ti\u1ec5n c\u1ee7a Ng\u00f4n ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) trong b\u1ed1i c\u1ea3nh m\u00f4 h\u00ecnh h\u00f3a UML. 1. Gi\u1edbi thi\u1ec7u v\u1ec1 OCL T\u1ea1i sao ch\u00fang ta c\u1ea7n OCL? M\u1eb7c [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\" \/>\n<meta property=\"og:site_name\" content=\"Visual Paradigm Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-24T07:26:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-26T09:41:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.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=\"4 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-the-object-constraint-language-ocl\/\",\"url\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\",\"name\":\"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) - Visual Paradigm Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.png\",\"datePublished\":\"2026-07-24T07:26:46+00:00\",\"dateModified\":\"2026-07-26T09:41:39+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-the-object-constraint-language-ocl\/#breadcrumb\"},\"inLanguage\":\"vi\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage\",\"url\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.png\",\"contentUrl\":\"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#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 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL)\"}]},{\"@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 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) - 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-the-object-constraint-language-ocl\/","og_locale":"vi_VN","og_type":"article","og_title":"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) - Visual Paradigm Blog","og_description":"D\u1ef1a tr\u00ean c\u00e1c t\u00e0i li\u1ec7u b\u00e0i gi\u1ea3ng \u0111\u01b0\u1ee3c cung c\u1ea5p, h\u01b0\u1edbng d\u1eabn n\u00e0y bao qu\u00e1t c\u00e1c kh\u00e1i ni\u1ec7m c\u01a1 b\u1ea3n, c\u00fa ph\u00e1p v\u00e0 c\u00e1c \u1ee9ng d\u1ee5ng th\u1ef1c ti\u1ec5n c\u1ee7a Ng\u00f4n ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) trong b\u1ed1i c\u1ea3nh m\u00f4 h\u00ecnh h\u00f3a UML. 1. Gi\u1edbi thi\u1ec7u v\u1ec1 OCL T\u1ea1i sao ch\u00fang ta c\u1ea7n OCL? M\u1eb7c [&hellip;]","og_url":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","og_site_name":"Visual Paradigm Blog","article_published_time":"2026-07-24T07:26:46+00:00","article_modified_time":"2026-07-26T09:41:39+00:00","og_image":[{"url":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.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":"4 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","url":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","name":"M\u1ed9t H\u01b0\u1edbng D\u1eabn To\u00e0n Di\u1ec7n V\u1ec1 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL) - Visual Paradigm Blog","isPartOf":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage"},"image":{"@id":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.png","datePublished":"2026-07-24T07:26:46+00:00","dateModified":"2026-07-26T09:41:39+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-the-object-constraint-language-ocl\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage","url":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.png","contentUrl":"https:\/\/blog.visual-paradigm.com\/wp-content\/uploads\/2026\/07\/img_6a63134535ef7.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.visual-paradigm.com\/vn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#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 Ng\u00f4n Ng\u1eef R\u00e0ng Bu\u1ed9c \u0110\u1ed1i T\u01b0\u1ee3ng (OCL)"}]},{"@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\/11702","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=11702"}],"version-history":[{"count":0,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/posts\/11702\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/media?parent=11702"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/categories?post=11702"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/vn\/wp-json\/wp\/v2\/tags?post=11702"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}