{"id":9985,"date":"2026-07-24T15:26:46","date_gmt":"2026-07-24T07:26:46","guid":{"rendered":"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/"},"modified":"2026-07-26T17:41:41","modified_gmt":"2026-07-26T09:41:41","slug":"a-comprehensive-guide-to-the-object-constraint-language-ocl","status":"publish","type":"post","link":"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","title":{"rendered":"\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357"},"content":{"rendered":"<p data-nodeid=\"44120\">\u57fa\u4e8e\u6240\u63d0\u4f9b\u7684\u8bb2\u4e49\u6750\u6599\uff0c\u672c\u6307\u5357\u6db5\u76d6\u4e86\u5728UML\u5efa\u6a21\u80cc\u666f\u4e0b\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u7684\u57fa\u672c\u6982\u5ff5\u3001\u8bed\u6cd5\u548c\u5b9e\u9645\u5e94\u7528\u3002<\/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. OCL\u7b80\u4ecb<\/h2>\n<h3 data-nodeid=\"44123\">\u6211\u4eec\u4e3a\u4ec0\u4e48\u9700\u8981OCL\uff1f<\/h3>\n<p data-nodeid=\"44124\">\u867d\u7136UML\u56fe\uff08\u5982\u7c7b\u56fe\uff09\u5728\u53ef\u89c6\u5316\u7ed3\u6784\u65b9\u9762\u975e\u5e38\u51fa\u8272\uff0c\u4f46\u5b83\u4eec\u65e0\u6cd5\u8868\u8fbe\u89c4\u8303\u7684\u6240\u6709\u76f8\u5173\u65b9\u9762\u3002<\/p>\n<ul data-nodeid=\"44125\">\n<li data-nodeid=\"44126\">\n<p data-nodeid=\"44127\"><strong data-nodeid=\"44305\">\u81ea\u7136\u8bed\u8a00<\/strong>\u5177\u6709\u6b67\u4e49\u6027\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44128\">\n<p data-nodeid=\"44129\"><strong data-nodeid=\"44310\">\u4f20\u7edf\u5f62\u5f0f\u8bed\u8a00<\/strong>\u867d\u7136\u65e0\u6b67\u4e49\uff0c\u4f46\u5bf9\u4e8e\u666e\u901a\u7cfb\u7edf\u5efa\u6a21\u8005\u6765\u8bf4\u592a\u96be\u9605\u8bfb\u548c\u7f16\u5199\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44130\">\n<p data-nodeid=\"44131\"><strong data-nodeid=\"44323\">OCL<\/strong>\u586b\u8865\u4e86\u8fd9\u4e00\u7a7a\u767d\uff1a\u5b83\u662f\u4e00\u79cd<strong data-nodeid=\"44324\">\u5f62\u5f0f\u8bed\u8a00<\/strong>\u7528\u4e8e\u8868\u8fbe\u7cbe\u786e\u7ea6\u675f\uff0c\u4f46\u4ecd\u7136<strong data-nodeid=\"44325\">\u6613\u4e8e\u9605\u8bfb\u548c\u7f16\u5199<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44132\">OCL\u7684\u6838\u5fc3\u7279\u6027<\/h3>\n<ol data-nodeid=\"44133\">\n<li data-nodeid=\"44134\">\n<p data-nodeid=\"44135\"><strong data-nodeid=\"44339\">\u7eaf\u8868\u8fbe\u5f0f\u8bed\u8a00\uff1a<\/strong>\u8868\u8fbe\u5f0f\u6ca1\u6709\u526f\u4f5c\u7528\u3002\u6c42\u503cOCL\u8868\u8fbe\u5f0f\u4f1a\u8fd4\u56de\u4e00\u4e2a\u503c\uff0c\u4f46<em data-nodeid=\"44340\">\u65e0\u6cd5<\/em>\u6539\u53d8\u7cfb\u7edf\u72b6\u6001\u3002\u7136\u800c\uff0c\u5b83\u53ef\u4ee5<em data-nodeid=\"44341\">\u63cf\u8ff0<\/em>\u72b6\u6001\u53d8\u5316\uff08\u4f8b\u5982\uff0c\u5728\u540e\u7f6e\u6761\u4ef6\u4e2d\uff09\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44136\">\n<p data-nodeid=\"44137\"><strong data-nodeid=\"44346\">\u4e0d\u662f\u7f16\u7a0b\u8bed\u8a00\uff1a<\/strong>\u4f60\u65e0\u6cd5\u7f16\u5199\u7a0b\u5e8f\u903b\u8f91\u3001\u63a7\u5236\u6d41\uff0c\u6216\u8c03\u7528\u4f1a\u6539\u53d8\u72b6\u6001\u7684\u8fc7\u7a0b\/\u64cd\u4f5c\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44138\">\n<p data-nodeid=\"44139\"><strong data-nodeid=\"44351\">\u7c7b\u578b\u5316\u8bed\u8a00\uff1a<\/strong>\u6bcf\u4e2a\u8868\u8fbe\u5f0f\u90fd\u6709\u7c7b\u578b\u3002\u5408\u6cd5\u7684\u8868\u8fbe\u5f0f\u5fc5\u987b\u9075\u5b88\u7c7b\u578b\u4e00\u81f4\u6027\u89c4\u5219\u3002\u6bcf\u4e2aUML\u5206\u7c7b\u5668\u90fd\u662fOCL\u7684\u4e00\u79cd\u7c7b\u578b\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44140\">\n<p data-nodeid=\"44141\"><strong data-nodeid=\"44360\">\u77ac\u65f6\u6c42\u503c\uff1a<\/strong>\u5bf9\u8c61\u7684\u72b6\u6001\u5728<em data-nodeid=\"44361\">\u6c42\u503cOCL\u8868\u8fbe\u5f0f\u671f\u95f4<\/em>\u4e0d\u80fd\u6539\u53d8\u3002<\/p>\n<\/li>\n<\/ol>\n<hr data-nodeid=\"44142\"\/>\n<h2 data-nodeid=\"44143\">2. \u57fa\u672c\u8bed\u6cd5\u548c\u8bed\u4e49<\/h2>\n<h3 data-nodeid=\"44144\">\u4e0a\u4e0b\u6587\u548cSelf<\/h3>\n<p data-nodeid=\"44145\">\u6bcf\u4e2aOCL\u8868\u8fbe\u5f0f\u90fd\u5728\u7279\u5b9aUML\u5206\u7c7b\u5668\uff08\u7c7b\u3001\u63a5\u53e3\u7b49\uff09\u7684\u4e0a\u4e0b\u6587\u4e2d\u8fdb\u884c\u6c42\u503c\u3002<\/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\">\u4e0a\u4e0b\u6587<\/code><\/strong>: \u5b9a\u4e49\u7ea6\u675f\u6240\u9002\u7528\u7684\u7c7b\u3002<\/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>: \u4e00\u4e2a\u4fdd\u7559\u5b57\uff0c\u6307\u4ee3\u6b63\u5728\u6c42\u503c\u7684\u4e0a\u4e0b\u6587\u7c7b\u7684\u7279\u5b9a\u5b9e\u4f8b\u3002<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44151\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Person\r\n-- 'self' \u6307\u4ee3 Person \u7684\u4e00\u4e2a\u7279\u5b9a\u5b9e\u4f8b\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44152\">\u6ce8\u91ca\u548c\u64cd\u4f5c\u7b26<\/h3>\n<ul data-nodeid=\"44153\">\n<li data-nodeid=\"44154\">\n<p data-nodeid=\"44155\"><strong data-nodeid=\"44384\">\u6ce8\u91ca\uff1a<\/strong>\u00a0\u7531\u00a0\u8868\u793a<code data-backticks=\"1\" data-nodeid=\"44380\">--<\/code>\u00a0\uff08\u4f8b\u5982\uff0c\u00a0<code data-backticks=\"1\" data-nodeid=\"44382\">-- \u8fd9\u662f\u4e00\u4e2a\u6ce8\u91ca<\/code>).<\/p>\n<\/li>\n<li data-nodeid=\"44156\">\n<p data-nodeid=\"44157\"><strong data-nodeid=\"44401\">\u4e2d\u7f00\u64cd\u4f5c\u7b26\uff1a<\/strong>\u00a0\u60a8\u53ef\u4ee5\u4f7f\u7528\u6807\u51c6\u7684\u6570\u5b66\/\u903b\u8f91\u64cd\u4f5c\u7b26\uff08<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>\uff09\u3002\u5728\u6982\u5ff5\u4e0a\uff0c\u00a0<code data-backticks=\"1\" data-nodeid=\"44397\">a + b<\/code>\u00a0\u4e0e\u00a0<code data-backticks=\"1\" data-nodeid=\"44399\">a.+(b)<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44158\">\u8bbf\u95ee\u5c5e\u6027<\/h3>\n<p data-nodeid=\"44159\">\u4f7f\u7528\u70b9\u53f7\u8868\u793a\u6cd5\u6765\u8bbf\u95ee\u5c5e\u6027\u6216\u64cd\u4f5c\u3002\u5373\u4f7f\u64cd\u4f5c\u6ca1\u6709\u53c2\u6570\uff0c\u4e5f\u5fc5\u987b\u4f7f\u7528\u62ec\u53f7\u3002<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44160\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Person\r\nself.age             -- \u8bbf\u95ee 'age' \u5c5e\u6027\r\nself.stockPrice()    -- \u8c03\u7528 'stockPrice' \u64cd\u4f5c\r\n<\/code><\/pre>\n<hr data-nodeid=\"44161\"\/>\n<h2 data-nodeid=\"44162\">3. \u7c7b\u578b\u548c\u96c6\u5408<\/h2>\n<h3 data-nodeid=\"44163\">\u57fa\u672c\u9884\u5b9a\u4e49\u7c7b\u578b<\/h3>\n<p data-nodeid=\"44164\">OCL \u5305\u542b\u5177\u6709\u7279\u5b9a\u64cd\u4f5c\u7684\u6807\u51c6\u7c7b\u578b\uff1a<\/p>\n<ul data-nodeid=\"44165\">\n<li data-nodeid=\"44166\">\n<p data-nodeid=\"44167\"><strong data-nodeid=\"44425\">\u5e03\u5c14\u503c\uff1a<\/strong>\u00a0<code data-backticks=\"1\" data-nodeid=\"44411\">true<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44413\">false<\/code>\uff08\u64cd\u4f5c\uff1a<code data-backticks=\"1\" data-nodeid=\"44415\">\u4e0e<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44417\">\u6216<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44419\">\u975e<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44421\">\u8574\u542b<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44423\">\u5f02\u6216<\/code>)<\/p>\n<\/li>\n<li data-nodeid=\"44168\">\n<p data-nodeid=\"44169\"><strong data-nodeid=\"44448\">\u6574\u6570 \/ \u5b9e\u6570\uff1a<\/strong>\u6570\u5b57\uff08\u64cd\u4f5c\uff1a<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\">\u7edd\u5bf9\u503c<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44440\">\u6700\u5927\u503c<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44442\">\u6700\u5c0f\u503c<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44444\">\u6574\u9664<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44446\">\u53d6\u6a21<\/code>)<\/p>\n<\/li>\n<li data-nodeid=\"44170\">\n<p data-nodeid=\"44171\"><strong data-nodeid=\"44461\">\u5b57\u7b26\u4e32\uff1a<\/strong>\u6587\u672c\uff08\u64cd\u4f5c\uff1a<code data-backticks=\"1\" data-nodeid=\"44453\">\u957f\u5ea6<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44455\">\u8fde\u63a5<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44457\">\u5b50\u5b57\u7b26\u4e32<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44459\">\u8f6c\u4e3a\u6574\u6570<\/code>)<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44172\">\u96c6\u5408<\/h3>\n<p data-nodeid=\"44173\">\u96c6\u5408\u662f\u7528\u4e8e\u5b58\u50a8\u591a\u4e2a\u5143\u7d20\u7684\u62bd\u8c61\u7c7b\u578b\u3002\u5b83\u4eec\u901a\u8fc7\u00a0<code data-backticks=\"1\" data-nodeid=\"44464\">-&gt;<\/code>\u00a0\u7b26\u53f7\u6765\u8bbf\u95ee\u3002<\/p>\n<ol data-nodeid=\"44174\">\n<li data-nodeid=\"44175\">\n<p data-nodeid=\"44176\"><strong data-nodeid=\"44471\">\u96c6\u5408\uff1a<\/strong>\u00a0\u6570\u5b66\u96c6\u5408\uff08\u65e0\u91cd\u590d\uff0c\u65e0\u5e8f\uff09\u3002\u00a0<code data-backticks=\"1\" data-nodeid=\"44470\">\u96c6\u5408 {1, 2, 5}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44177\">\n<p data-nodeid=\"44178\"><strong data-nodeid=\"44477\">\u6709\u5e8f\u96c6\u5408\uff1a<\/strong>\u00a0\u65e0\u91cd\u590d\uff0c\u4f46\u6309\u4f4d\u7f6e\u6392\u5e8f\u3002\u00a0<code data-backticks=\"1\" data-nodeid=\"44476\">\u6709\u5e8f\u96c6\u5408 {5, 4, 3}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44179\">\n<p data-nodeid=\"44180\"><strong data-nodeid=\"44483\">\u591a\u91cd\u96c6\u5408\uff1a<\/strong>\u00a0\u5141\u8bb8\u91cd\u590d\u5143\u7d20\uff0c\u65e0\u5e8f\u3002\u00a0<code data-backticks=\"1\" data-nodeid=\"44482\">\u591a\u91cd\u96c6\u5408 {1, 2, 2, 5}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44181\">\n<p data-nodeid=\"44182\"><strong data-nodeid=\"44489\">\u5e8f\u5217\uff1a<\/strong>\u00a0\u5141\u8bb8\u91cd\u590d\u5143\u7d20\uff0c\u6709\u5e8f\u3002\u00a0<code data-backticks=\"1\" data-nodeid=\"44488\">\u5e8f\u5217 {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\">\u6ce8\u610f\uff1a<\/em>\u00a0\u8be5\u00a0<code data-backticks=\"1\" data-nodeid=\"44494\">..<\/code>\u00a0\u8868\u793a\u6cd5\u521b\u5efa\u4e00\u4e2a\u8fde\u7eed\u6574\u6570\u7684\u5e8f\u5217\uff1a\u00a0<code data-backticks=\"1\" data-nodeid=\"44496\">\u5e8f\u5217 {1..5}<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3 data-nodeid=\"44186\">\u5173\u952e\u96c6\u5408\u64cd\u4f5c<\/h3>\n<ul data-nodeid=\"44187\">\n<li data-nodeid=\"44188\">\n<p data-nodeid=\"44189\"><strong data-nodeid=\"44518\">\u901a\u7528\uff1a<\/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\">\u8fed\u4ee3\u5668\uff08OCL\u4e2d\u81f3\u5173\u91cd\u8981\uff09\uff1a<\/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>: \u8fd4\u56de\u6ee1\u8db3\u6761\u4ef6\u7684\u5143\u7d20\uff0c\u5176\u4e2d<code data-backticks=\"1\" data-nodeid=\"44525\">expr<\/code>\u4e3a\u771f\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44195\">\n<p data-nodeid=\"44196\"><code data-backticks=\"1\" data-nodeid=\"44527\">reject(expr)<\/code>: \u8fd4\u56de\u6ee1\u8db3\u6761\u4ef6\u7684\u5143\u7d20\uff0c\u5176\u4e2d<code data-backticks=\"1\" data-nodeid=\"44529\">expr<\/code>\u4e3a\u5047\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44197\">\n<p data-nodeid=\"44198\"><code data-backticks=\"1\" data-nodeid=\"44531\">collect(expr)<\/code>: \u4ece\u6240\u6709\u5143\u7d20\u4e2d\u63d0\u53d6\u7279\u5b9a\u5c5e\u6027\uff0c\u5f62\u6210\u4e00\u4e2a\u65b0\u7684\u96c6\u5408\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44199\">\n<p data-nodeid=\"44200\"><code data-backticks=\"1\" data-nodeid=\"44533\">forAll(expr)<\/code>: \u8fd4\u56de<code data-backticks=\"1\" data-nodeid=\"44535\">true<\/code>\u5982\u679c<code data-backticks=\"1\" data-nodeid=\"44537\">expr<\/code>\u5bf9\u81f3\u5c11\u4e00\u4e2a\u5143\u7d20\u4e3a\u771f\u3002<em data-nodeid=\"44543\">\u6240\u6709<\/em>\u5143\u7d20\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44201\">\n<p data-nodeid=\"44202\"><code data-backticks=\"1\" data-nodeid=\"44544\">exists(expr)<\/code>: \u8fd4\u56de<code data-backticks=\"1\" data-nodeid=\"44546\">true<\/code>\u5982\u679c<code data-backticks=\"1\" data-nodeid=\"44548\">expr<\/code>\u5bf9\u81f3\u5c11\u4e00\u4e2a\u5143\u7d20\u4e3a\u771f\u3002<em data-nodeid=\"44554\">\u81f3\u5c11\u4e00\u4e2a<\/em>\u5143\u7d20\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44203\">\n<p data-nodeid=\"44204\"><code data-backticks=\"1\" data-nodeid=\"44555\">iterate(elem; acc = init | expr)<\/code>: \u6240\u6709\u8fed\u4ee3\u5668\u7684\u901a\u7528\u57fa\u7840\u3002<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p data-nodeid=\"44205\"><em data-nodeid=\"44560\">\u8fed\u4ee3\u5668\u8bed\u6cd5\u53d8\u4f53\uff1a<\/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. \u5bfc\u822aUML\u6a21\u578b<\/h2>\n<p data-nodeid=\"44209\">OCL\u88ab\u5e7f\u6cdb\u7528\u4f5c\u5bfc\u822a\u8bed\u8a00\uff0c\u7528\u4e8e\u904d\u5386\u5173\u8054\u3002<\/p>\n<h3 data-nodeid=\"44210\">\u6807\u51c6\u5bfc\u822a<\/h3>\n<p data-nodeid=\"44211\">\u4f7f\u7528\u76f8\u53cd\u7684\u89d2\u8272\u540d\u79f0\u8fdb\u884c\u5bfc\u822a\u3002\u8fd4\u56de\u7c7b\u578b\u53d6\u51b3\u4e8e\u591a\u91cd\u6027\uff1a<\/p>\n<ul data-nodeid=\"44212\">\n<li data-nodeid=\"44213\">\n<p data-nodeid=\"44214\"><strong data-nodeid=\"44573\">\u591a\u91cd\u6027\u00a0<code data-backticks=\"1\" data-nodeid=\"44567\">1<\/code>\u00a0\u6216\u00a0<code data-backticks=\"1\" data-nodeid=\"44569\">0..1<\/code>:<\/strong>\u00a0\u8fd4\u56de\u5355\u4e2a\u5bf9\u8c61\u3002<\/p>\n<\/li>\n<li data-nodeid=\"44215\">\n<p data-nodeid=\"44216\"><strong data-nodeid=\"44586\">\u591a\u91cd\u6027\u00a0<code data-backticks=\"1\" data-nodeid=\"44576\">*<\/code>:<\/strong>\u00a0\u8fd4\u56de\u4e00\u4e2a\u00a0<code data-backticks=\"1\" data-nodeid=\"44580\">\u96c6\u5408<\/code>\u00a0\uff08\u6216\u00a0<code data-backticks=\"1\" data-nodeid=\"44582\">\u6709\u5e8f\u96c6\u5408<\/code>\u00a0\u5982\u679c\u6807\u8bb0\u4e3a\u00a0<code data-backticks=\"1\" data-nodeid=\"44584\">{ordered}<\/code>).<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44217\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Company\r\nself.manager.age &gt; 40               -- manager \u662f 0..1\uff0c\u8fd4\u56de\u4e00\u4e2a Person \u5bf9\u8c61\r\nself.employee-&gt;notEmpty()           -- employee \u662f 0..*\uff0c\u8fd4\u56de\u4e00\u4e2a\u96c6\u5408\r\n<\/code><\/pre>\n<p data-nodeid=\"44218\"><em data-nodeid=\"44592\">\u5982\u679c\u7f3a\u5c11\u89d2\u8272\u540d\u79f0\uff0c\u8bf7\u4f7f\u7528\u53e6\u4e00\u7aef\u7c7b\u7684\u540d\u79f0\u7684\u5c0f\u5199\u5f62\u5f0f\uff08\u4f8b\u5982\uff0c\u00a0<code data-backticks=\"1\" data-nodeid=\"44589\">self.bank<\/code>).<\/em><\/p>\n<h3 data-nodeid=\"44219\">\u5173\u8054\u7c7b<\/h3>\n<p data-nodeid=\"44220\">\u4f7f\u7528\u5173\u8054\u7c7b\u7684\u5c0f\u5199\u540d\u79f0\u5bfc\u822a\u5230\u5173\u8054\u7c7b\u3002<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44221\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Person\r\nself.job-&gt;size() &gt;= 1  -- 'job' \u662f Person \u548c Company \u4e4b\u95f4\u7684\u5173\u8054\u7c7b\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44222\">\u9012\u5f52\u5173\u8054<\/h3>\n<p data-nodeid=\"44223\">\u5f53\u4e00\u4e2a\u5173\u8054\u5faa\u73af\u56de\u5230\u540c\u4e00\u7c7b\u65f6\uff08\u4f8b\u5982\uff0c\u4e24\u4e2a\u4eba\u4e4b\u95f4\u7684\u5a5a\u59fb\uff09\uff0c\u5fc5\u987b\u4f7f\u7528\u65b9\u62ec\u53f7\u6307\u5b9a\u65b9\u5411\u00a0<code data-backticks=\"1\" data-nodeid=\"44597\">[roleName]<\/code>.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44224\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Person\r\nself.marriage[\u59bb\u5b50]-&gt;select(m | m.\u7ed3\u675f = false)-&gt;size() = 1\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44225\">\u9650\u5b9a\u5173\u8054<\/h3>\n<p data-nodeid=\"44226\">\u4f7f\u7528\u65b9\u62ec\u53f7\u4e2d\u7684\u9650\u5b9a\u7b26\u5c5e\u6027\u6765\u9009\u62e9\u7279\u5b9a\u5bf9\u8c61\u3002<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44227\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Bank\r\nself.customer[12345]  -- \u8fd4\u56de\u8d26\u6237\u53f7\u4e3a12345\u7684\u7279\u5b9a\u4eba\u5458\r\nself.customer         -- \u8fd4\u56de\u6240\u6709\u5ba2\u6237\u7684\u96c6\u5408\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44228\">\u91cd\u65b0\u7c7b\u578b\u5316\uff08\u5f3a\u5236\u8f6c\u6362\uff09<\/h3>\n<p data-nodeid=\"44229\">\u4f7f\u7528\u00a0<code data-backticks=\"1\" data-nodeid=\"44603\">oclAsType()<\/code>\u00a0\u6765\u8bbf\u95ee\u5b50\u7c7b\u578b\u6216\u9690\u85cf\u7684\u8d85\u7c7b\u5c5e\u6027\u3002<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44230\"><code data-language=\"ocl\">self.oclAsType(\u5b50).p       -- \u8bbf\u95ee\u5728\u5b50\u7c7b\u578b\u4e2d\u5b9a\u4e49\u7684\u5c5e\u6027 'p'\r\nself.oclAsType(\u8d85).p     -- \u8bbf\u95ee\u5728\u8d85\u7c7b\u4e2d\u5b9a\u4e49\u7684\u5c5e\u6027 'p'\r\n<\/code><\/pre>\n<hr data-nodeid=\"44231\"\/>\n<h2 data-nodeid=\"44232\">5. \u7f16\u5199\u7ea6\u675f<\/h2>\n<h3 data-nodeid=\"44233\">1. \u4e0d\u53d8\u5f0f\uff08<code data-backticks=\"1\" data-nodeid=\"44607\">inv<\/code>)<\/h3>\n<p data-nodeid=\"44234\">\u5fc5\u987b\u59cb\u7ec8\u4e3a\u771f\u7684\u6761\u4ef6<strong data-nodeid=\"44614\">\u59cb\u7ec8<\/strong>\u00a0\u5bf9\u4e8e\u7c7b\u7684\u6240\u6709\u5b9e\u4f8b\u90fd\u5fc5\u987b\u4e3a\u771f\u3002<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44235\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Company \r\ninv: self.\u5458\u5de5\u6570\u91cf &lt;= 50\r\ninv SME: self.\u80a1\u4ef7() &gt; 0  -- 'SME' \u662f\u7ea6\u675f\u7684\u53ef\u9009\u540d\u79f0\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44236\">2. \u524d\u7f6e\u548c\u540e\u7f6e\u6761\u4ef6\uff08<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\">\u4e0e\u64cd\u4f5c\u76f8\u5173\u7684\u7ea6\u675f\u3002<\/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>: \u5fc5\u987b\u4e3a\u771f\u00a0<em data-nodeid=\"44630\">\u6267\u884c\u524d<\/em>\u00a0\u6267\u884c\u3002<\/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>: \u5fc5\u987b\u4e3a\u771f\u00a0<em data-nodeid=\"44642\">\u6267\u884c\u540e<\/em>\u6267\u884c\u3002\u4f7f\u7528<code data-backticks=\"1\" data-nodeid=\"44639\">\u7ed3\u679c<\/code>\u4f5c\u4e3a\u8fd4\u56de\u503c\u3002<\/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>\uff1a\u5728\u540e\u7f6e\u6761\u4ef6\u4e2d\u7528\u4e8e\u5f15\u7528\u5c5e\u6027\u7684\u503c<em data-nodeid=\"44652\">\u64cd\u4f5c\u5f00\u59cb\u524d<\/em>\u64cd\u4f5c\u5f00\u59cb\u524d\u3002<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44245\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Person::income(): Integer\r\npre adult: self.age &gt;= 18\r\npost resultOK: result &lt; 5000\r\n\r\n\u4e0a\u4e0b\u6587 Company::hireEmployee(p: Person)\r\npost: employee = employee@pre-&gt;including(p)\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44246\">3. Body\u3001\u521d\u59cb\u548c\u6d3e\u751f\u8868\u8fbe\u5f0f<\/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>\uff1a\u5b9a\u4e49\u67e5\u8be2\u64cd\u4f5c\u7684\u7ed3\u679c\uff08\u53ef\u4ee5\u662f\u9012\u5f52\u7684\uff09\u3002<\/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>\uff1a\u5b9a\u4e49\u5c5e\u6027\u7684\u521d\u59cb\u503c\u3002<\/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>\uff1a\u5b9a\u4e49\u4e00\u4e2a\u6d3e\u751f\u5c5e\u6027\u3002<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44254\"><code data-language=\"ocl\">\u4e0a\u4e0b\u6587 Person::income(): Integer\r\nbody: self.job.salary-&gt;sum()\r\n\r\n\u4e0a\u4e0b\u6587 Person::isMarried: Boolean\r\ninit: false\r\n\r\n\u4e0a\u4e0b\u6587 Company::noEmployees: Integer\r\nderive: self.employee-&gt;size()\r\n<\/code><\/pre>\n<hr data-nodeid=\"44255\"\/>\n<h2 data-nodeid=\"44256\">6. \u9ad8\u7ea7OCL\u7279\u6027<\/h2>\n<h3 data-nodeid=\"44257\">Let\u548cDef\u8868\u8fbe\u5f0f<\/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>\uff1a\u5728\u5355\u4e2a\u8868\u8fbe\u5f0f\u4e2d\u5b9a\u4e49\u5c40\u90e8\u53d8\u91cf\u3002<\/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>\uff1a\u5b9a\u4e49\u4e0e\u5206\u7c7b\u5668\u5173\u8054\u7684\u53ef\u91cd\u7528\u53d8\u91cf\u6216\u64cd\u4f5c\u3002<\/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\">\u672a\u5b9a\u4e49\u503c\uff08\u4e09\u503c\u903b\u8f91\uff09<\/h3>\n<p data-nodeid=\"44266\">\u5982\u679c\u5b50\u8868\u8fbe\u5f0f\u672a\u5b9a\u4e49\uff08\u4f8b\u5982\uff0c\u5bfc\u822a\u7a7a\u5173\u8054\uff09\uff0c\u5219\u6574\u4e2a\u8868\u8fbe\u5f0f\u672a\u5b9a\u4e49\u3002\u7136\u800c\uff0c\u5e03\u5c14\u8fd0\u7b97\u7b26\u5177\u6709\u77ed\u8def\u4f8b\u5916\u60c5\u51b5\uff1a<\/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;\u672a\u5b9a\u4e49&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;\u672a\u5b9a\u4e49&gt;<\/code>\u00a0=\u00a0<strong data-nodeid=\"44694\">\u5047<\/strong><\/p>\n<\/li>\n<li data-nodeid=\"44272\">\n<p data-nodeid=\"44273\"><code data-backticks=\"1\" data-nodeid=\"44695\">\u5047\u610f\u5473\u7740&lt;\u672a\u5b9a\u4e49&gt;<\/code>\u00a0=\u00a0<strong data-nodeid=\"44700\">\u771f<\/strong><\/p>\n<\/li>\n<li data-nodeid=\"44274\">\n<p data-nodeid=\"44275\"><code data-backticks=\"1\" data-nodeid=\"44701\">&lt;\u672a\u5b9a\u4e49&gt;\u610f\u5473\u7740\u771f<\/code>\u00a0=\u00a0<strong data-nodeid=\"44706\">\u771f<\/strong><\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44276\">\u7c7b\u7279\u5f81\u4e0e\u9884\u5b9a\u4e49\u5bf9\u8c61\u5c5e\u6027<\/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>: \u8fd4\u56de\u8be5\u7c7b\u6240\u6709\u73b0\u6709\u5b9e\u4f8b\u7684\u96c6\u5408\u3002<\/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\">\u5bf9\u8c61\u5c5e\u6027\uff1a<\/strong>\u00a0<code data-backticks=\"1\" data-nodeid=\"44719\">oclIsTypeOf(\u7c7b\u578b)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44721\">oclIsKindOf(\u7c7b\u578b)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44723\">oclInState(\u72b6\u6001)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44725\">oclIsNew<\/code>\uff08\u7528\u4e8e\u540e\u7f6e\u6761\u4ef6\uff09\u3002<\/p>\n<\/li>\n<\/ul>\n<hr data-nodeid=\"44283\"\/>\n<h2 data-nodeid=\"44284\">7. \u7efc\u5408\u6848\u4f8b\u7814\u7a76\uff1a\u516c\u53f8\u6a21\u578b<\/h2>\n<p data-nodeid=\"44285\">\u4e3a\u4e86\u5de9\u56fa\u8fd9\u4e9b\u6982\u5ff5\uff0c\u4ee5\u4e0b\u662f\u4e00\u7ec4\u5e94\u7528\u4e8e\u516c\u53f8\u6570\u636e\u5e93\u6a21\u578b\uff08\u5458\u5de5\u3001\u90e8\u95e8\u3001\u9879\u76ee\u3001\u4f9d\u8d56\u4eba\uff09\u7684\u5b8c\u6574\u6027\u7ea6\u675f\u3002<\/p>\n<h3 data-nodeid=\"44286\">\u57fa\u672c\u5c5e\u6027\u7ea6\u675f<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44287\"><code data-language=\"ocl\">-- \u5e74\u9f84\u5fc5\u987b\u5927\u4e8e\u7b49\u4e8e18\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5 inv: self.age() &gt;= 18\r\n\r\n-- \u5165\u804c\u65e5\u671f\u5fc5\u987b\u5728\u51fa\u751f\u65e5\u671f\u4e4b\u540e\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5 inv: self.hireDate &gt; self.birthDate\r\n\r\n-- \u7ba1\u7406\u8005\u5f00\u59cb\u65e5\u671f\u5fc5\u987b\u5728\u5165\u804c\u65e5\u671f\u4e4b\u540e\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5 inv: self.manages-&gt;notEmpty() \u610f\u5473\u7740 self.manages.startDate &gt; self.hireDate\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44288\">\u5bfc\u822a\u4e0e\u5173\u7cfb\u7ea6\u675f<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44289\"><code data-language=\"ocl\">-- \u4e3b\u7ba1\u5fc5\u987b\u6bd4\u5458\u5de5\u5e74\u957f\u4e14\u85aa\u8d44\u66f4\u9ad8\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5\r\ninv: self.supervisor-&gt;notEmpty() \u610f\u5473\u7740 self.age() &gt; self.supervisor.age()\r\ninv: self.supervisor-&gt;notEmpty() \u610f\u5473\u7740 self.salary &lt; self.supervisor.salary\r\n\r\n-- \u4e3b\u7ba1\u5fc5\u987b\u5728\u4e0b\u5c5e\u4e4b\u524d\u88ab\u96c7\u4f63\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5\r\ninv: self.subordinates-&gt;notEmpty() \u610f\u5473\u7740 self.subordinates-&gt;forall(e | e.hireDate &gt; self.hireDate)\r\n\r\n-- \u90e8\u95e8\u7ecf\u7406\u5fc5\u987b\u662f\u8be5\u90e8\u95e8\u7684\u5458\u5de5\r\n\u4e0a\u4e0b\u6587 \u90e8\u95e8\r\ninv: self.worksFor-&gt;includes(self.manages.employee)\r\n\r\n-- \u9879\u76ee\u5730\u70b9\u5fc5\u987b\u662f\u90e8\u95e8\u7684\u5730\u70b9\u4e4b\u4e00\r\n\u4e0a\u4e0b\u6587 \u9879\u76ee\r\ninv: self.controls.locations-&gt;includes(self.location)\r\n\r\n-- \u5458\u5de5\u53ea\u80fd\u5728\u7531\u5176\u90e8\u95e8\u63a7\u5236\u7684\u9879\u76ee\u4e0a\u5de5\u4f5c\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5\r\ninv: self.worksFor.controls-&gt;includesAll(self.worksOn.project)\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44290\">\u96c6\u5408\u4e0e\u8fed\u4ee3\u7ea6\u675f<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44291\"><code data-language=\"ocl\">-- \u793e\u4f1a\u5b89\u5168\u53f7\u7801\u5fc5\u987b\u5728\u6240\u6709\u5458\u5de5\u4e2d\u552f\u4e00\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5\r\ninv: Employee.allInstances-&gt;forAll(e1, e2 | e1 &lt;&gt; e2 \u610f\u5473\u7740 e1.SSN &lt;&gt; e2.SSN)\r\n\r\n-- \u4f9d\u8d56\u4eba\u7684\u59d3\u540d\u548c\u5173\u7cfb\u5fc5\u987b\u5728\u6bcf\u4e2a\u5458\u5de5\u4e2d\u552f\u4e00\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5\r\ninv: self.dependents-&gt;forAll(e1, e2 |\r\n      e1 &lt;&gt; e2 \u610f\u5473\u7740 (e1.name &lt;&gt; e2.name \u6216 e1.relationship &lt;&gt; e2.relationship))\r\n\r\n-- \u6d3e\u751f\u5c5e\u6027\uff1a\u90e8\u95e8\u4e2d\u7684\u5458\u5de5\u4eba\u6570\r\n\u4e0a\u4e0b\u6587 \u90e8\u95e8\r\ninv: self.nbrEmployees = self.worksFor-&gt;size()\r\n\r\n-- \u5458\u5de5\u6700\u591a\u53ea\u80fd\u53c2\u4e0e4\u4e2a\u9879\u76ee\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5\r\ninv: self.worksOn-&gt;size() &lt;= 4\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44292\">\u4f7f\u7528\u590d\u6742\u903b\u8f91<code data-backticks=\"1\" data-nodeid=\"44734\">\u8ba9<\/code>\u548c<code data-backticks=\"1\" data-nodeid=\"44736\">\u9009\u62e9<\/code><\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44293\"><code data-language=\"ocl\">-- \u6bcf\u5468\u603b\u5de5\u4f5c\u65f6\u95f4\u5fc5\u987b\u572830\u81f350\u5c0f\u65f6\u4e4b\u95f4\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5 \r\n\u7ea6\u675f: \u8ba9 totHours: \u6574\u6570 = self.worksOn-&gt;\u6536\u96c6(\u5c0f\u65f6)-&gt;\u603b\u548c() \r\n     \u5728 totHours &gt;= 30 \u4e14 totHours &lt;= 50\r\n\r\n-- \u5728\u7279\u5b9a\u9879\u76ee\u4e0a\uff0c\u6700\u591a\u53ea\u80fd\u67092\u540d\u5458\u5de5\u5de5\u4f5c\u5c11\u4e8e10\u5c0f\u65f6\r\n\u4e0a\u4e0b\u6587 \u9879\u76ee \r\n\u7ea6\u675f: self.worksOn-&gt;\u9009\u62e9(\u5c0f\u65f6 &lt; 10)-&gt;\u5927\u5c0f() &lt;= 2\r\n\r\n-- \u53ea\u6709\u90e8\u95e8\u7ecf\u7406\u624d\u80fd\u5728\u9879\u76ee\u4e0a\u5de5\u4f5c\u5c11\u4e8e5\u5c0f\u65f6\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5 \r\n\u7ea6\u675f: self.worksOn-&gt;\u9009\u62e9(\u5c0f\u65f6 &lt; 5)-&gt;\u975e\u7a7a() \u610f\u5473\u7740 \r\n     self.worksFor.manages.employee = self\r\n\r\n-- \u6ca1\u6709\u4e0b\u5c5e\u7684\u5458\u5de5\u5fc5\u987b\u5728\u6240\u6709\u9879\u76ee\u4e0a\u5de5\u4f5c &gt;= 10 \u5c0f\u65f6\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5 \r\n\u7ea6\u675f: self.subordinates-&gt;\u4e3a\u7a7a() \u610f\u5473\u7740 self.worksOn-&gt;\u5bf9\u6240\u6709(\u5c0f\u65f6 &gt;= 10)\r\n\r\n-- \u90e8\u95e8\u7ecf\u7406\u5fc5\u987b\u5728\u90e8\u95e8\u6240\u63a7\u5236\u7684\u6240\u6709\u9879\u76ee\u4e0a\u5de5\u4f5c &gt;= 5 \u5c0f\u65f6\r\n\u4e0a\u4e0b\u6587 \u90e8\u95e8 \r\n\u7ea6\u675f: self.controls-&gt;\u5bf9\u6240\u6709(p: \u9879\u76ee | \r\n      self.manages.employee.worksOn-&gt;\u9009\u62e9(\u5c0f\u65f6 &gt;= 5)-&gt;\u5305\u542b(p))\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44294\">\u9632\u6b62\u5faa\u73af\uff08\u9012\u5f52\u903b\u8f91\uff09<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44295\"><code data-language=\"ocl\">-- \u5458\u5de5\u4e0d\u80fd\u76d1\u7763\u81ea\u5df1\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5 \u7ea6\u675f: self.subordinates-&gt;\u6392\u9664(self)\r\n\r\n-- \u76d1\u7763\u5c42\u7ea7\u4e0d\u80fd\u5b58\u5728\u5faa\u73af\r\n\u4e0a\u4e0b\u6587 \u5458\u5de5 \r\ndef: \u6240\u6709\u4e0b\u5c5e = self.subordinates-&gt;\u5e76\u96c6(\r\n          self.subordinates-&gt;\u6536\u96c6(e: \u5458\u5de5 | e.\u6240\u6709\u4e0b\u5c5e))\r\n\u7ea6\u675f: self.\u6240\u6709\u4e0b\u5c5e-&gt;\u6392\u9664(self)<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u57fa\u4e8e\u6240\u63d0\u4f9b\u7684\u8bb2\u4e49\u6750\u6599\uff0c\u672c\u6307\u5357\u6db5\u76d6\u4e86\u5728UML\u5efa\u6a21\u80cc\u666f\u4e0b\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u7684\u57fa\u672c\u6982\u5ff5\u3001\u8bed\u6cd5\u548c\u5b9e\u9645\u5e94\u7528\u3002 1.  [&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-9985","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>\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357 - Visual Paradigm \u535a\u5ba2<\/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\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357 - Visual Paradigm \u535a\u5ba2\" \/>\n<meta property=\"og:description\" content=\"\u57fa\u4e8e\u6240\u63d0\u4f9b\u7684\u8bb2\u4e49\u6750\u6599\uff0c\u672c\u6307\u5357\u6db5\u76d6\u4e86\u5728UML\u5efa\u6a21\u80cc\u666f\u4e0b\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u7684\u57fa\u672c\u6982\u5ff5\u3001\u8bed\u6cd5\u548c\u5b9e\u9645\u5e94\u7528\u3002 1. [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\" \/>\n<meta property=\"og:site_name\" content=\"Visual Paradigm \u535a\u5ba2\" \/>\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:41+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=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\",\"url\":\"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\",\"name\":\"\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357 - Visual Paradigm \u535a\u5ba2\",\"isPartOf\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/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:41+00:00\",\"author\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/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\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.visual-paradigm.com\/cn\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/#website\",\"url\":\"https:\/\/blog.visual-paradigm.com\/cn\/\",\"name\":\"Visual Paradigm \u535a\u5ba2\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.visual-paradigm.com\/cn\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\",\"name\":\"Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/cn\/#\/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\/cn\/author\/vpadminuser\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357 - Visual Paradigm \u535a\u5ba2","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\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357 - Visual Paradigm \u535a\u5ba2","og_description":"\u57fa\u4e8e\u6240\u63d0\u4f9b\u7684\u8bb2\u4e49\u6750\u6599\uff0c\u672c\u6307\u5357\u6db5\u76d6\u4e86\u5728UML\u5efa\u6a21\u80cc\u666f\u4e0b\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u7684\u57fa\u672c\u6982\u5ff5\u3001\u8bed\u6cd5\u548c\u5b9e\u9645\u5e94\u7528\u3002 1. [&hellip;]","og_url":"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","og_site_name":"Visual Paradigm \u535a\u5ba2","article_published_time":"2026-07-24T07:26:46+00:00","article_modified_time":"2026-07-26T09:41:41+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":{"\u4f5c\u8005":"Admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","url":"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","name":"\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357 - Visual Paradigm \u535a\u5ba2","isPartOf":{"@id":"https:\/\/blog.visual-paradigm.com\/cn\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage"},"image":{"@id":"https:\/\/blog.visual-paradigm.com\/cn\/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:41+00:00","author":{"@id":"https:\/\/blog.visual-paradigm.com\/cn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6"},"breadcrumb":{"@id":"https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.visual-paradigm.com\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/"]}]},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/blog.visual-paradigm.com\/cn\/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\/cn\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.visual-paradigm.com\/cn\/"},{"@type":"ListItem","position":2,"name":"\u5bf9\u8c61\u7ea6\u675f\u8bed\u8a00\uff08OCL\uff09\u5168\u9762\u6307\u5357"}]},{"@type":"WebSite","@id":"https:\/\/blog.visual-paradigm.com\/cn\/#website","url":"https:\/\/blog.visual-paradigm.com\/cn\/","name":"Visual Paradigm \u535a\u5ba2","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.visual-paradigm.com\/cn\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/blog.visual-paradigm.com\/cn\/#\/schema\/person\/a649c442f11a53040710ddec750926c6","name":"Admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/blog.visual-paradigm.com\/cn\/#\/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\/cn\/author\/vpadminuser\/"}]}},"modified_by":"Admin","_links":{"self":[{"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/posts\/9985","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/comments?post=9985"}],"version-history":[{"count":0,"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/posts\/9985\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/media?parent=9985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/categories?post=9985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/cn\/wp-json\/wp\/v2\/tags?post=9985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}