SOLID in Action — Prinsip Terbuka-tertutup
Di dunia fisik, pintu yang tertutup adalah pintu yang tertutup. Di dunia perangkat lunak, entitas tertutup mungkin masih terbuka untuk ekstensi. Dan memang seharusnya demikian, sesuai dengan prinsip Open-closed (OCP).
Ada 2 cara populer untuk menerapkan prinsip ini. Kami akan membahas keduanya.
Dan opsi ketiga.
#1 — Warisan
Ini adalah aplikasi asli OCP. Bertrand Meyer , yang memperkenalkan istilah tersebut dalam bukunya tahun 1988 Konstruksi Perangkat Lunak Berorientasi Objek , bermaksud bahwa:
Kelas ditutup, karena dapat dikompilasi, disimpan di perpustakaan, dijadikan dasar, dan digunakan oleh kelas klien. Tapi itu juga terbuka, karena setiap kelas baru dapat menggunakannya sebagai induk, menambahkan fitur baru. Ketika kelas keturunan didefinisikan, tidak perlu mengubah yang asli atau mengganggu kliennya.
Carditutup karena kode sumbernya tidak tersedia untuk dimodifikasi, atau karena digunakan oleh kelas klien lain yang tidak menyetujui perubahan apa pun.
Tetapi Carterbuka untuk perpanjangan . Memperpanjang Carsebenarnya mudah. Subtipe, ElectricCar, dapat diperluas dari kelas induknya Car, memberikan nilai aktual ke properti modeland seats, dan menambahkan batteryLevelproperti baru dan recharge()metode baru.
#2 — Polimorfisme
Tahun 1990-an melihat OCP ditafsirkan ulang untuk mempromosikan polimorfisme melalui abstraksi dan implementasi. Menurut artikel “ Prinsip Terbuka-Tertutup ” Robert C. Martin :
Abstraksi adalah kuncinya
Abstraksi , menurut Paman Bob, tertutup untuk modifikasi namun terbuka untuk perluasan melalui implementasinya yang tidak terbatas.
Pertimbangkan abstraksi yang disediakan oleh Car. Itu diperbaiki dan karena itu ditutup . Sejauh UrbanTripPlannermenyangkut, Carsediakan 2 properti ( modeldan seats) dan 2 metode ( getSpeed()dan getPosition()).
Implementasi Car, baik secara langsung misalnya ToyotaViosatau tidak langsung misalnya TelsaModel3, memperluas abstraksi ini dengan informasi dan perilaku konkret dari model mobil tertentu, jumlah tempat duduk, kecepatan saat ini, dan posisi saat ini. CarDengan demikian , terbuka untuk perpanjangan.
Bandingkan dengan Inheritance, interpretasi OCP ini berfokus pada perluasan implementasi konkret ke abstraksi yang dideklarasikan . Semua properti, metode, atau tipe tambahan yang diperkenalkan melalui Warisan akan diabaikan.
OCP melalui Abstraksi lebih luas dan lebih kuat.
Mari kita perluas pandangan kita lebih jauh Caruntuk menyertakan UrbanTripPlannerdan penerapannya. Jika mereka mengetahui sesuatu tentang EletricCar, maka perilaku yang dideklarasikan dalam metode searchDirection(Car, Position, Position)tersebut akan melanggar prinsip OCP, karena harus dimodifikasi, sehingga tidak lagi ditutup, untuk mendukung tipe baru dari Car. Untuk menghindari pelanggaran ini berarti mengabaikan identitas semua Carsubtipe dan properti serta metode tambahannya. Itu secara efektif memangkas efek Inheritance menjadi hanya mengimplementasikan Carabstraksi .
Selain itu, dengan abstraksi, kami menikmati banyak dukungan bawaan dalam bahasa pemrograman berorientasi objek dan IDE modern. Lupa menerapkan metode? itu adalah kesalahan kompilasi. Ingin menerima daftar Cardengan cara yang aman? Generik List<? extend Car>untuk menyelamatkan. Dalam contoh kita, karena UrbanTripPlannerhanya memperhatikan Car, selama ToyotaVios, TeslaModel3implement Car, program kita baik-baik saja.
#3 — Dibuat untuk ekstensi
Kami telah melihat bagaimana Pewarisan dan Abstraksi membantu kami mencapai OCP. Kedua mekanisme ini adalah alat umum yang ditentukan oleh pilihan bahasa pemrograman atau keputusan desain kita.
Pada bagian ini, kita akan mengeksplorasi pendekatan ketiga untuk OCP di mana mekanismenya lebih mudah bagi kita. Itu baik secara langsung dikodekan dalam program kami atau secara tidak langsung disediakan oleh perpustakaan atau kerangka kerja yang kami gunakan.
Plug-in, Add-on, Add-in
Ini hanyalah nama yang berbeda untuk konsep yang sama. Menurut Britannica :
plug-in, disebut juga add-on atau ekstensi, perangkat lunak komputer yang menambahkan fungsi baru ke program host tanpa mengubah program host itu sendiri
Plug-in dengan demikian merupakan contoh nyata dari keterbukaan dalam program host built-for-extension.
Ada berbagai jenis perangkat lunak yang sangat bergantung pada ekstensi. Bagi kami para pengembang, ini seharusnya sangat familiar karena kami menggunakan plugin produktivitas dan bahasa setiap hari di IDE favorit kami seperti VSCode, Eclipse, dan IntelliJ. Beberapa ekstensi browser sangat berharga bagi pengguna internet. Ada banyak paket dan filter emoji untuk meningkatkan pengalaman pengguna seluler…
API, Acara
Terkait, tetapi layak sub-kategorinya sendiri, di bawah build-for-extension adalah API dan Acara.
Ekstensi paling terkenal di bawah sub-kategori ini adalah kode HTML, CSS, dan javascript. Mereka semua memperluas fungsionalitas browser tanpa mengubah internal host mereka. Itu dimungkinkan melalui ketersediaan API dan Peristiwa yang ditentukan oleh antarmuka yang dapat diprogram browser. Upaya standardisasi ada dan sebagian besar telah mendorong pengembangan lanskap Web 2.0 dan Web 3.0 saat ini.
Kesimpulan
OCP tentunya merupakan salah satu prinsip terpenting dalam Rekayasa Perangkat Lunak. Ini memberikan perlindungan terhadap perubahan yang tidak diinginkan dan tidak bijaksana namun memungkinkan perpanjangan bila diperlukan.
Kami telah mengunjungi dua cara tradisional untuk menerapkan prinsip ini: Pewarisan dan Abstraksi. Bisa dibilang, Abstraksi lebih disukai dengan dampak yang lebih luas dan efek yang lebih kuat.
Kami juga memeriksa opsi ketiga untuk menerapkan prinsip tersebut. Ada 2 sub-kategori yang menonjol, Plugin dan API & Acara di bawah pendekatan ini.
Jika Anda menyukai artikel ini, ikuti saya untuk konten yang lebih berkualitas.
Artikel lain dalam seri ini:
- Menjadi pengembang SOLID
- SOLID in Action — Prinsip Tanggung Jawab Tunggal
- SOLID in Action — Prinsip buka-tutup : artikel ini
- SOLID in Action — prinsip Pergantian Liskov: sedang dikembangkan
- SOLID in Action — prinsip Segregasi Antarmuka: terencana
- SOLID in Action — prinsip Dependency Inversion: direncanakan

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































