{"id":11825,"date":"2026-07-24T15:26:46","date_gmt":"2026-07-24T07:26:46","guid":{"rendered":"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/"},"modified":"2026-07-26T17:39:26","modified_gmt":"2026-07-26T09:39:26","slug":"a-comprehensive-guide-to-the-object-constraint-language-ocl","status":"publish","type":"post","link":"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","title":{"rendered":"Panduan Lengkap tentang Bahasa Kendala Objek (OCL)"},"content":{"rendered":"<p data-nodeid=\"44120\">Berdasarkan bahan kuliah yang disediakan, panduan ini mencakup konsep dasar, sintaks, dan aplikasi praktis Bahasa Kendala Objek (OCL) dalam konteks pemodelan 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. Pengantar OCL<\/h2>\n<h3 data-nodeid=\"44123\">Mengapa kita membutuhkan OCL?<\/h3>\n<p data-nodeid=\"44124\">Meskipun diagram UML (seperti diagram kelas) sangat baik untuk memvisualisasikan struktur, mereka tidak dapat mengekspresikan semua aspek yang relevan dari suatu spesifikasi.<\/p>\n<ul data-nodeid=\"44125\">\n<li data-nodeid=\"44126\">\n<p data-nodeid=\"44127\"><strong data-nodeid=\"44305\">Bahasa alami<\/strong>\u00a0bersifat ambigu.<\/p>\n<\/li>\n<li data-nodeid=\"44128\">\n<p data-nodeid=\"44129\"><strong data-nodeid=\"44310\">Bahasa formal tradisional<\/strong>\u00a0tidak ambigu tetapi terlalu sulit bagi modeler sistem rata-rata untuk dibaca dan ditulis.<\/p>\n<\/li>\n<li data-nodeid=\"44130\">\n<p data-nodeid=\"44131\"><strong data-nodeid=\"44323\">OCL<\/strong>\u00a0menjembatani kesenjangan ini: ini adalah\u00a0<strong data-nodeid=\"44324\">bahasa formal<\/strong>\u00a0yang digunakan untuk mengekspresikan kendala yang tepat, namun tetap\u00a0<strong data-nodeid=\"44325\">mudah dibaca dan ditulis<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44132\">Karakteristik Utama OCL<\/h3>\n<ol data-nodeid=\"44133\">\n<li data-nodeid=\"44134\">\n<p data-nodeid=\"44135\"><strong data-nodeid=\"44339\">Bahasa Ekspresi Murni:<\/strong>\u00a0Ekspresi tidak memiliki efek samping. Menilai ekspresi OCL mengembalikan nilai tetapi\u00a0<em data-nodeid=\"44340\">tidak dapat<\/em>\u00a0mengubah keadaan sistem. Namun, dapat\u00a0<em data-nodeid=\"44341\">menggambarkan<\/em>\u00a0perubahan keadaan (misalnya, dalam kondisi post).<\/p>\n<\/li>\n<li data-nodeid=\"44136\">\n<p data-nodeid=\"44137\"><strong data-nodeid=\"44346\">Bukan Bahasa Pemrograman:<\/strong>\u00a0Anda tidak dapat menulis logika program, alur kontrol, atau memanggil proses\/operasi yang mengubah keadaan.<\/p>\n<\/li>\n<li data-nodeid=\"44138\">\n<p data-nodeid=\"44139\"><strong data-nodeid=\"44351\">Bahasa Bertipe:<\/strong>\u00a0Setiap ekspresi memiliki tipe. Ekspresi yang sah harus mematuhi aturan kesesuaian tipe. Setiap klasifikasi UML adalah tipe OCL.<\/p>\n<\/li>\n<li data-nodeid=\"44140\">\n<p data-nodeid=\"44141\"><strong data-nodeid=\"44360\">Penilaian Sesaat:<\/strong>\u00a0Keadaan objek tidak dapat berubah\u00a0<em data-nodeid=\"44361\">selama<\/em>\u00a0penilaian ekspresi OCL.<\/p>\n<\/li>\n<\/ol>\n<hr data-nodeid=\"44142\"\/>\n<h2 data-nodeid=\"44143\">2. Sintaksis dan Semantik Dasar<\/h2>\n<h3 data-nodeid=\"44144\">Konteks dan Self<\/h3>\n<p data-nodeid=\"44145\">Setiap ekspresi OCL dievaluasi dalam konteks klasifier UML tertentu (kelas, antarmuka, dll.).<\/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\">konteks<\/code><\/strong>: Menentukan kelas yang dikenakan batasan.<\/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>: Kata cadangan yang mengacu pada contoh khusus dari kelas konteks yang dievaluasi.<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44151\"><code data-language=\"ocl\">konteks Person\r\n-- 'self' mengacu pada contoh khusus dari Person\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44152\">Komentar dan Operator<\/h3>\n<ul data-nodeid=\"44153\">\n<li data-nodeid=\"44154\">\n<p data-nodeid=\"44155\"><strong data-nodeid=\"44384\">Komentar:<\/strong>\u00a0Ditandai dengan\u00a0<code data-backticks=\"1\" data-nodeid=\"44380\">--<\/code>\u00a0(contoh,\u00a0<code data-backticks=\"1\" data-nodeid=\"44382\">-- ini adalah komentar<\/code>).<\/p>\n<\/li>\n<li data-nodeid=\"44156\">\n<p data-nodeid=\"44157\"><strong data-nodeid=\"44401\">Operator Infix:<\/strong>\u00a0Anda dapat menggunakan operator matematika\/logika standar (<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>). Secara konseptual,\u00a0<code data-backticks=\"1\" data-nodeid=\"44397\">a + b<\/code>\u00a0identik dengan\u00a0<code data-backticks=\"1\" data-nodeid=\"44399\">a.+(b)<\/code>.<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44158\">Mengakses Properti<\/h3>\n<p data-nodeid=\"44159\">Gunakan notasi titik untuk mengakses atribut atau operasi. Tanda kurung wajib digunakan untuk operasi, bahkan jika tidak memiliki parameter.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44160\"><code data-language=\"ocl\">konteks Person\r\nself.age             -- Mengakses atribut 'age'\r\nself.stockPrice()    -- Memanggil operasi 'stockPrice'\r\n<\/code><\/pre>\n<hr data-nodeid=\"44161\"\/>\n<h2 data-nodeid=\"44162\">3. Tipe dan Koleksi<\/h2>\n<h3 data-nodeid=\"44163\">Tipe yang Didefinisikan Secara Prima<\/h3>\n<p data-nodeid=\"44164\">OCL mencakup tipe standar dengan operasi tertentu:<\/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\">benar<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44413\">salah<\/code>\u00a0(Operasi:\u00a0<code data-backticks=\"1\" data-nodeid=\"44415\">dan<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44417\">atau<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44419\">tidak<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44421\">mengimplikasikan<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44423\">xor<\/code>)<\/p>\n<\/li>\n<li data-nodeid=\"44168\">\n<p data-nodeid=\"44169\"><strong data-nodeid=\"44448\">Integer \/ Real:<\/strong>\u00a0Bilangan (Operasi:\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\">String:<\/strong>\u00a0Teks (Operasi:\u00a0<code data-backticks=\"1\" data-nodeid=\"44453\">ukuran<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44455\">concat<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44457\">substring<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44459\">keInteger<\/code>)<\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44172\">Koleksi<\/h3>\n<p data-nodeid=\"44173\">Koleksi adalah tipe abstrak yang digunakan untuk menyimpan beberapa elemen. Mereka diakses menggunakan\u00a0<code data-backticks=\"1\" data-nodeid=\"44464\">-&gt;<\/code>\u00a0notasi.<\/p>\n<ol data-nodeid=\"44174\">\n<li data-nodeid=\"44175\">\n<p data-nodeid=\"44176\"><strong data-nodeid=\"44471\">Set:<\/strong>\u00a0Himpunan matematika (tidak ada duplikat, tidak berurutan).\u00a0<code data-backticks=\"1\" data-nodeid=\"44470\">Set {1, 2, 5}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44177\">\n<p data-nodeid=\"44178\"><strong data-nodeid=\"44477\">OrderedSet:<\/strong>\u00a0Tidak ada duplikat, tetapi diurutkan berdasarkan posisi.\u00a0<code data-backticks=\"1\" data-nodeid=\"44476\">OrderedSet {5, 4, 3}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44179\">\n<p data-nodeid=\"44180\"><strong data-nodeid=\"44483\">Kantong:<\/strong>\u00a0Memungkinkan duplikat, tidak berurutan.\u00a0<code data-backticks=\"1\" data-nodeid=\"44482\">Kantong {1, 2, 2, 5}<\/code><\/p>\n<\/li>\n<li data-nodeid=\"44181\">\n<p data-nodeid=\"44182\"><strong data-nodeid=\"44489\">Urutan:<\/strong>\u00a0Memungkinkan duplikat, berurutan.\u00a0<code data-backticks=\"1\" data-nodeid=\"44488\">Urutan {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\">Catatan:<\/em>\u00a0The\u00a0<code data-backticks=\"1\" data-nodeid=\"44494\">..<\/code>\u00a0notasi membuat urutan bilangan bulat berurutan:\u00a0<code data-backticks=\"1\" data-nodeid=\"44496\">Urutan {1..5}<\/code>.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3 data-nodeid=\"44186\">Operasi Kumpulan Kunci<\/h3>\n<ul data-nodeid=\"44187\">\n<li data-nodeid=\"44188\">\n<p data-nodeid=\"44189\"><strong data-nodeid=\"44518\">Umum:<\/strong>\u00a0<code data-backticks=\"1\" data-nodeid=\"44504\">ukuran()<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44506\">kosong()<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44508\">tidakKosong()<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44510\">mencakup(v)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44512\">tidakMencakup(v)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44514\">hitung(v)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44516\">jumlah()<\/code>.<\/p>\n<\/li>\n<li data-nodeid=\"44190\">\n<p data-nodeid=\"44191\"><strong data-nodeid=\"44522\">Iterator (Penting untuk 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\">pilih(expr)<\/code>: Mengembalikan elemen-elemen di mana\u00a0<code data-backticks=\"1\" data-nodeid=\"44525\">expr<\/code>\u00a0adalah benar.<\/p>\n<\/li>\n<li data-nodeid=\"44195\">\n<p data-nodeid=\"44196\"><code data-backticks=\"1\" data-nodeid=\"44527\">reject(expr)<\/code>: Mengembalikan elemen-elemen di mana\u00a0<code data-backticks=\"1\" data-nodeid=\"44529\">expr<\/code>\u00a0adalah salah.<\/p>\n<\/li>\n<li data-nodeid=\"44197\">\n<p data-nodeid=\"44198\"><code data-backticks=\"1\" data-nodeid=\"44531\">collect(expr)<\/code>: Mengekstrak properti tertentu dari semua elemen ke dalam koleksi baru.<\/p>\n<\/li>\n<li data-nodeid=\"44199\">\n<p data-nodeid=\"44200\"><code data-backticks=\"1\" data-nodeid=\"44533\">forAll(expr)<\/code>: Mengembalikan\u00a0<code data-backticks=\"1\" data-nodeid=\"44535\">benar<\/code>\u00a0jika\u00a0<code data-backticks=\"1\" data-nodeid=\"44537\">expr<\/code>\u00a0adalah benar untuk\u00a0<em data-nodeid=\"44543\">semua<\/em>\u00a0elemen.<\/p>\n<\/li>\n<li data-nodeid=\"44201\">\n<p data-nodeid=\"44202\"><code data-backticks=\"1\" data-nodeid=\"44544\">exists(expr)<\/code>: Mengembalikan\u00a0<code data-backticks=\"1\" data-nodeid=\"44546\">benar<\/code>\u00a0jika\u00a0<code data-backticks=\"1\" data-nodeid=\"44548\">expr<\/code>\u00a0adalah benar untuk\u00a0<em data-nodeid=\"44554\">setidaknya satu<\/em>\u00a0elemen.<\/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>: Dasar umum untuk semua iterator.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p data-nodeid=\"44205\"><em data-nodeid=\"44560\">Variasi Sintaks Iterator:<\/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. Menjelajahi Model UML<\/h2>\n<p data-nodeid=\"44209\">OCL banyak digunakan sebagai bahasa navigasi untuk menelusuri asosiasi.<\/p>\n<h3 data-nodeid=\"44210\">Navigasi Standar<\/h3>\n<p data-nodeid=\"44211\">Navigasi menggunakan nama peran yang berlawanan. Tipe kembalian tergantung pada kelipatan:<\/p>\n<ul data-nodeid=\"44212\">\n<li data-nodeid=\"44213\">\n<p data-nodeid=\"44214\"><strong data-nodeid=\"44573\">Kelipatan\u00a0<code data-backticks=\"1\" data-nodeid=\"44567\">1<\/code>\u00a0atau\u00a0<code data-backticks=\"1\" data-nodeid=\"44569\">0..1<\/code>:<\/strong>\u00a0Mengembalikan satu objek.<\/p>\n<\/li>\n<li data-nodeid=\"44215\">\n<p data-nodeid=\"44216\"><strong data-nodeid=\"44586\">Kelipatan\u00a0<code data-backticks=\"1\" data-nodeid=\"44576\">*<\/code>:<\/strong>\u00a0Mengembalikan\u00a0<code data-backticks=\"1\" data-nodeid=\"44580\">Set<\/code>\u00a0(atau\u00a0<code data-backticks=\"1\" data-nodeid=\"44582\">OrderedSet<\/code>\u00a0jika ditandai\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\">konteks Company\r\nself.manager.age &gt; 40               -- manager adalah 0..1, mengembalikan objek Person\r\nself.employee-&gt;notEmpty()           -- employee adalah 0..*, mengembalikan Set\r\n<\/code><\/pre>\n<p data-nodeid=\"44218\"><em data-nodeid=\"44592\">Jika nama peran tidak tersedia, gunakan nama huruf kecil dari kelas di ujung lainnya (misalnya\u00a0<code data-backticks=\"1\" data-nodeid=\"44589\">self.bank<\/code>).<\/em><\/p>\n<h3 data-nodeid=\"44219\">Kelas Asosiasi<\/h3>\n<p data-nodeid=\"44220\">Navigasi ke kelas asosiasi menggunakan nama huruf kecil dari kelas asosiasi.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44221\"><code data-language=\"ocl\">konteks Person\r\nself.job-&gt;size() &gt;= 1  -- 'job' adalah kelas asosiasi antara Person dan Company\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44222\">Asosiasi Rekursif<\/h3>\n<p data-nodeid=\"44223\">Ketika suatu asosiasi kembali ke kelas yang sama (misalnya, pernikahan antara dua orang), Anda harus menentukan arah menggunakan tanda kurung siku\u00a0<code data-backticks=\"1\" data-nodeid=\"44597\">[namaPeran]<\/code>.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44224\"><code data-language=\"ocl\">konteks Person\r\nself.perkawinan[wife]-&gt;select(m | m.berakhir = false)-&gt;size() = 1\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44225\">Asosiasi yang Dikualifikasi<\/h3>\n<p data-nodeid=\"44226\">Gunakan atribut penentu dalam tanda kurung siku untuk memilih objek tertentu.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44227\"><code data-language=\"ocl\">konteks Bank\r\nself.customer[12345]  -- Mengembalikan orang tertentu dengan accountNo 12345\r\nself.customer         -- Mengembalikan Himpunan semua pelanggan\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44228\">Pengubahan Tipe (Pengubahan Tipe)<\/h3>\n<p data-nodeid=\"44229\">Gunakan\u00a0<code data-backticks=\"1\" data-nodeid=\"44603\">oclAsType()<\/code>\u00a0untuk mengakses properti dari subjenis atau properti kelas induk yang tersembunyi.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44230\"><code data-language=\"ocl\">self.oclAsType(Sub).p       -- Mengakses properti 'p' yang didefinisikan dalam Subjenis\r\nself.oclAsType(Super).p     -- Mengakses properti 'p' yang didefinisikan dalam Kelas Induk\r\n<\/code><\/pre>\n<hr data-nodeid=\"44231\"\/>\n<h2 data-nodeid=\"44232\">5. Menulis Kendala<\/h2>\n<h3 data-nodeid=\"44233\">1. Invarian (<code data-backticks=\"1\" data-nodeid=\"44607\">inv<\/code>)<\/h3>\n<p data-nodeid=\"44234\">Kondisi yang harus\u00a0<strong data-nodeid=\"44614\">selalu<\/strong>\u00a0benar untuk semua contoh kelas.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44235\"><code data-language=\"ocl\">konteks Perusahaan \r\ninv: self.jumlahKaryawan &lt;= 50\r\ninv SME: self.hargaSaham() &gt; 0  -- 'SME' adalah nama opsional untuk kendala<\/code><\/pre>\n<h3 data-nodeid=\"44236\">2. Kondisi Pra dan Pasca (<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\">Kendala yang terkait dengan operasi.<\/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>: Harus benar\u00a0<em data-nodeid=\"44630\">sebelum<\/em>\u00a0eksekusi.<\/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>: Harus benar\u00a0<em data-nodeid=\"44642\">setelah<\/em>\u00a0eksekusi. Gunakan\u00a0<code data-backticks=\"1\" data-nodeid=\"44639\">hasil<\/code>\u00a0untuk nilai kembalian.<\/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>: Digunakan dalam kondisi pasca untuk merujuk nilai suatu properti\u00a0<em data-nodeid=\"44652\">sebelum<\/em>\u00a0operasi dimulai.<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44245\"><code data-language=\"ocl\">konteks Person::income(): Integer\r\npre dewasa: self.usia &gt;= 18\r\npost hasilOK: hasil &lt; 5000\r\n\r\nkonteks Company::rekrutKaryawan(p: Person)\r\npost: karyawan = karyawan@pre-&gt;termasuk(p)\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44246\">3. Ekspresi Body, Awal, dan Turunan<\/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>: Menentukan hasil dari operasi kueri (dapat bersifat rekursif).<\/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>: Menentukan nilai awal dari suatu atribut.<\/p>\n<\/li>\n<li data-nodeid=\"44252\">\n<p data-nodeid=\"44253\"><strong data-nodeid=\"44668\"><code data-backticks=\"1\" data-nodeid=\"44665\">turunkan<\/code><\/strong>: Menentukan atribut turunan.<\/p>\n<\/li>\n<\/ul>\n<pre class=\"lang-ocl\" data-nodeid=\"44254\"><code data-language=\"ocl\">konteks Person::income(): Integer\r\nbody: self.pekerjaan.gaji-&gt;jumlah()\r\n\r\nkonteks Person::menikah: Boolean\r\ninit: salah\r\n\r\nkonteks Company::jumlahKaryawan: Integer\r\nturunkan: self.karyawan-&gt;ukuran()\r\n<\/code><\/pre>\n<hr data-nodeid=\"44255\"\/>\n<h2 data-nodeid=\"44256\">6. Fitur OCL Lanjutan<\/h2>\n<h3 data-nodeid=\"44257\">Ekspresi Let dan 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>: Menentukan variabel lokal dalam satu ekspresi tunggal.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44261\"><code data-language=\"ocl\">let totJam: Integer = self.bekerjaPada-&gt;kumpulkan(jam)-&gt;jumlah() dalam totJam &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>: Menentukan variabel atau operasi yang dapat digunakan kembali dan terkait dengan sebuah klasifikasi.<\/p>\n<pre class=\"lang-ocl\" data-nodeid=\"44264\"><code data-language=\"ocl\">def: memilikiJabatan(t: String): Boolean = self.pekerjaan-&gt;ada(jabatan = t)\r\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44265\">Nilai Tidak Terdefinisi (Logika 3 Nilai)<\/h3>\n<p data-nodeid=\"44266\">Jika suatu sub-ekspresi tidak terdefinisi (misalnya, menavigasi asosiasi null), maka seluruh ekspresi menjadi tidak terdefinisi. Namun, operator Boolean memiliki pengecualian short-circuit:<\/p>\n<ul data-nodeid=\"44267\">\n<li data-nodeid=\"44268\">\n<p data-nodeid=\"44269\"><code data-backticks=\"1\" data-nodeid=\"44683\">benar atau &lt;tidak terdefinisi&gt;<\/code>\u00a0=\u00a0<strong data-nodeid=\"44688\">benar<\/strong><\/p>\n<\/li>\n<li data-nodeid=\"44270\">\n<p data-nodeid=\"44271\"><code data-backticks=\"1\" data-nodeid=\"44689\">salah dan &lt;tidak terdefinisi&gt;<\/code>\u00a0=\u00a0<strong data-nodeid=\"44694\">salah<\/strong><\/p>\n<\/li>\n<li data-nodeid=\"44272\">\n<p data-nodeid=\"44273\"><code data-backticks=\"1\" data-nodeid=\"44695\">salah menyiratkan &lt;tidak terdefinisi&gt;<\/code>\u00a0=\u00a0<strong data-nodeid=\"44700\">benar<\/strong><\/p>\n<\/li>\n<li data-nodeid=\"44274\">\n<p data-nodeid=\"44275\"><code data-backticks=\"1\" data-nodeid=\"44701\">&lt;tidak terdefinisi&gt; menyiratkan benar<\/code>\u00a0=\u00a0<strong data-nodeid=\"44706\">benar<\/strong><\/p>\n<\/li>\n<\/ul>\n<h3 data-nodeid=\"44276\">Fitur Kelas &amp; Properti Objek yang Didefinisikan Sebelumnya<\/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>: Mengembalikan Set dari semua contoh yang ada dari sebuah kelas.<\/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\">Properti objek:<\/strong>\u00a0<code data-backticks=\"1\" data-nodeid=\"44719\">oclIsTypeOf(Tipe)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44721\">oclIsKindOf(Tipe)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44723\">oclInState(State)<\/code>,\u00a0<code data-backticks=\"1\" data-nodeid=\"44725\">oclIsNew<\/code>\u00a0(digunakan dalam kondisi pasca).<\/p>\n<\/li>\n<\/ul>\n<hr data-nodeid=\"44283\"\/>\n<h2 data-nodeid=\"44284\">7. Studi Kasus Komprehensif: Model Perusahaan<\/h2>\n<p data-nodeid=\"44285\">Untuk memperkuat konsep-konsep ini, berikut adalah kumpulan batasan integritas yang diterapkan pada model basis data Perusahaan (Karyawan, Departemen, Proyek, Tanggungan).<\/p>\n<h3 data-nodeid=\"44286\">Batasan Atribut Dasar<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44287\"><code data-language=\"ocl\">-- Usia harus &gt;= 18\r\nkonteks Karyawan inv: self.usia() &gt;= 18\r\n\r\n-- Tanggal rekrutmen harus setelah tanggal lahir\r\nkonteks Karyawan inv: self.tanggalRekrutmen &gt; self.tanggalLahir\r\n\r\n-- Tanggal mulai manajer harus setelah tanggal rekrutmen\r\nkonteks Karyawan inv: self.manages-&gt;tidakKosong() menyiratkan self.manages.tanggalMulai &gt; self.tanggalRekrutmen\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44288\">Batasan Navigasi dan Hubungan<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44289\"><code data-language=\"ocl\">-- Atasan harus lebih tua dan dibayar lebih banyak daripada karyawan\r\nkonteks Karyawan\r\ninv: self.atasan-&gt;tidakKosong() menyiratkan self.usia() &gt; self.atasan.usia()\r\ninv: self.atasan-&gt;tidakKosong() menyiratkan self.gaji &lt; self.atasan.gaji\r\n\r\n-- Atasan harus direkrut sebelum bawahan mereka\r\nkonteks Karyawan\r\ninv: self.bawahan-&gt;tidakKosong() menyiratkan self.bawahan-&gt;untukSemua(e | e.tanggalRekrutmen &gt; self.tanggalRekrutmen)\r\n\r\n-- Manajer departemen harus merupakan karyawan dari departemen tersebut\r\nkonteks Departemen\r\ninv: self.bekerjaDi-&gt;mencakup(self.manajer.karyawan)\r\n\r\n-- Lokasi proyek harus salah satu lokasi departemen\r\nkonteks Proyek\r\ninv: self.mengendalikan.lokasi-&gt;mencakup(self.lokasi)\r\n\r\n-- Karyawan hanya boleh bekerja pada proyek yang dikendalikan oleh departemennya\r\nkonteks Karyawan\r\ninv: self.bekerjaDi.mengendalikan-&gt;mencakupSemua(self.bekerjaPada.proyek)\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44290\">Batasan Koleksi dan Iterator<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44291\"><code data-language=\"ocl\">-- Nomor SSN harus menjadi pengenal unik di seluruh karyawan\r\nkonteks Karyawan\r\ninv: Employee.allInstances-&gt;untukSemua(e1, e2 | e1 &lt;&gt; e2 menyiratkan e1.SSN &lt;&gt; e2.SSN)\r\n\r\n-- Nama tanggungan dan hubungan harus unik per karyawan\r\nkonteks Karyawan\r\ninv: self.tanggungan-&gt;untukSemua(e1, e2 |\r\n      e1 &lt;&gt; e2 menyiratkan (e1.nama &lt;&gt; e2.nama atau e1.hubungan &lt;&gt; e2.hubungan))\r\n\r\n-- Atribut turunan: jumlah karyawan dalam sebuah departemen\r\nkonteks Departemen\r\ninv: self.jumlahKaryawan = self.bekerjaDi-&gt;ukuran()\r\n\r\n-- Karyawan hanya boleh bekerja pada paling banyak 4 proyek\r\nkonteks Karyawan\r\ninv: self.bekerjaPada-&gt;ukuran() &lt;= 4\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44292\">Logika yang Rumit menggunakan\u00a0<code data-backticks=\"1\" data-nodeid=\"44734\">mengizinkan<\/code>\u00a0dan\u00a0<code data-backticks=\"1\" data-nodeid=\"44736\">pilih<\/code><\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44293\"><code data-language=\"ocl\">-- Jumlah jam kerja total harus antara 30 dan 50 per minggu\r\nkonteks Karyawan \r\ninv: biarkan totJam: Integer = self.bekerjaPada-&gt;kumpulkan(jam)-&gt;jumlah() \r\n     dalam totJam &gt;= 30 dan totJam &lt;= 50\r\n\r\n-- Paling banyak 2 karyawan yang dapat bekerja &lt; 10 jam pada proyek tertentu\r\nkonteks Proyek \r\ninv: self.bekerjaPada-&gt;pilih(jam &lt; 10)-&gt;ukuran() &lt;= 2\r\n\r\n-- Hanya manajer departemen yang boleh bekerja &lt; 5 jam pada proyek\r\nkonteks Karyawan \r\ninv: self.bekerjaPada-&gt;pilih(jam &lt; 5)-&gt;tidakKosong() mengimplikasikan \r\n     self.bekerjaUntuk.mengelola.karyawan = self\r\n\r\n-- Karyawan tanpa bawahan harus bekerja &gt;= 10 jam pada SEMUA proyek mereka\r\nkonteks Karyawan \r\ninv: self.bawahan-&gt;kosong() mengimplikasikan self.bekerjaPada-&gt;untukSemua(jam &gt;= 10)\r\n\r\n-- Manajer departemen harus bekerja &gt;= 5 jam pada semua proyek yang dikendalikan oleh departemen\r\nkonteks Departemen \r\ninv: self.mengendalikan-&gt;untukSemua(p: Proyek | \r\n      self.mengelola.karyawan.bekerjaPada-&gt;pilih(jam &gt;= 5)-&gt;mengandung(p))\r\n<\/code><\/pre>\n<h3 data-nodeid=\"44294\">Mencegah Siklus (Logika Rekursif)<\/h3>\n<pre class=\"lang-ocl\" data-nodeid=\"44295\"><code data-language=\"ocl\">-- Seorang karyawan tidak dapat mengawasi dirinya sendiri\r\nkonteks Karyawan inv: self.bawahan-&gt;menghindari(self)\r\n\r\n-- Hierarki pengawasan tidak boleh berupa siklus\r\nkonteks Karyawan \r\ndef: semuaBawahan = self.bawahan-&gt;gabung(\r\n          self.bawahan-&gt;kumpulkan(e: Karyawan | e.semuaBawahan))\r\ninv: self.semuaBawahan-&gt;menghindari(self)<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Berdasarkan bahan kuliah yang disediakan, panduan ini mencakup konsep dasar, sintaks, dan aplikasi praktis Bahasa Kendala Objek (OCL) dalam konteks pemodelan UML. 1. Pengantar OCL Mengapa kita membutuhkan OCL? Meskipun diagram UML (seperti diagram kelas) sangat baik untuk memvisualisasikan struktur, mereka tidak dapat mengekspresikan semua aspek yang relevan dari suatu spesifikasi. Bahasa alami\u00a0bersifat ambigu. Bahasa [&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-11825","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>Panduan Lengkap tentang Bahasa Kendala Objek (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\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\" \/>\n<meta property=\"og:locale\" content=\"id_ID\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Panduan Lengkap tentang Bahasa Kendala Objek (OCL) - Visual Paradigm Blog\" \/>\n<meta property=\"og:description\" content=\"Berdasarkan bahan kuliah yang disediakan, panduan ini mencakup konsep dasar, sintaks, dan aplikasi praktis Bahasa Kendala Objek (OCL) dalam konteks pemodelan UML. 1. Pengantar OCL Mengapa kita membutuhkan OCL? Meskipun diagram UML (seperti diagram kelas) sangat baik untuk memvisualisasikan struktur, mereka tidak dapat mengekspresikan semua aspek yang relevan dari suatu spesifikasi. Bahasa alami\u00a0bersifat ambigu. Bahasa [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.visual-paradigm.com\/id\/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:39:26+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=\"Ditulis oleh\" \/>\n\t<meta name=\"twitter:data1\" content=\"Admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimasi waktu membaca\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 menit\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\",\"url\":\"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\",\"name\":\"Panduan Lengkap tentang Bahasa Kendala Objek (OCL) - Visual Paradigm Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/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:39:26+00:00\",\"author\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#breadcrumb\"},\"inLanguage\":\"id\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/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\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.visual-paradigm.com\/id\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Panduan Lengkap tentang Bahasa Kendala Objek (OCL)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/#website\",\"url\":\"https:\/\/blog.visual-paradigm.com\/id\/\",\"name\":\"Visual Paradigm Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.visual-paradigm.com\/id\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"id\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/#\/schema\/person\/a649c442f11a53040710ddec750926c6\",\"name\":\"Admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"id\",\"@id\":\"https:\/\/blog.visual-paradigm.com\/id\/#\/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\/id\/author\/vpadminuser\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Panduan Lengkap tentang Bahasa Kendala Objek (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\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","og_locale":"id_ID","og_type":"article","og_title":"Panduan Lengkap tentang Bahasa Kendala Objek (OCL) - Visual Paradigm Blog","og_description":"Berdasarkan bahan kuliah yang disediakan, panduan ini mencakup konsep dasar, sintaks, dan aplikasi praktis Bahasa Kendala Objek (OCL) dalam konteks pemodelan UML. 1. Pengantar OCL Mengapa kita membutuhkan OCL? Meskipun diagram UML (seperti diagram kelas) sangat baik untuk memvisualisasikan struktur, mereka tidak dapat mengekspresikan semua aspek yang relevan dari suatu spesifikasi. Bahasa alami\u00a0bersifat ambigu. Bahasa [&hellip;]","og_url":"https:\/\/blog.visual-paradigm.com\/id\/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:39:26+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":{"Ditulis oleh":"Admin","Estimasi waktu membaca":"4 menit"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","url":"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/","name":"Panduan Lengkap tentang Bahasa Kendala Objek (OCL) - Visual Paradigm Blog","isPartOf":{"@id":"https:\/\/blog.visual-paradigm.com\/id\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#primaryimage"},"image":{"@id":"https:\/\/blog.visual-paradigm.com\/id\/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:39:26+00:00","author":{"@id":"https:\/\/blog.visual-paradigm.com\/id\/#\/schema\/person\/a649c442f11a53040710ddec750926c6"},"breadcrumb":{"@id":"https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#breadcrumb"},"inLanguage":"id","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.visual-paradigm.com\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/"]}]},{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/blog.visual-paradigm.com\/id\/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\/id\/a-comprehensive-guide-to-the-object-constraint-language-ocl\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.visual-paradigm.com\/id\/"},{"@type":"ListItem","position":2,"name":"Panduan Lengkap tentang Bahasa Kendala Objek (OCL)"}]},{"@type":"WebSite","@id":"https:\/\/blog.visual-paradigm.com\/id\/#website","url":"https:\/\/blog.visual-paradigm.com\/id\/","name":"Visual Paradigm Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.visual-paradigm.com\/id\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"id"},{"@type":"Person","@id":"https:\/\/blog.visual-paradigm.com\/id\/#\/schema\/person\/a649c442f11a53040710ddec750926c6","name":"Admin","image":{"@type":"ImageObject","inLanguage":"id","@id":"https:\/\/blog.visual-paradigm.com\/id\/#\/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\/id\/author\/vpadminuser\/"}]}},"modified_by":"Admin","_links":{"self":[{"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/posts\/11825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/comments?post=11825"}],"version-history":[{"count":0,"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/posts\/11825\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/media?parent=11825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/categories?post=11825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.visual-paradigm.com\/id\/wp-json\/wp\/v2\/tags?post=11825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}