Ini mungkin yang paling sulit dari prinsip-prinsip solid untuk dijelaskan. Biarkan aku mencoba. Bayangkan Anda menulis kelas Faktur yang berfungsi sempurna dan tidak memiliki bug. Itu membuat PDF dari faktur.
Lalu seseorang berkata mereka ingin faktur HTML dengan tautan di dalamnya. Anda tidak mengubah kode apa pun dalam Faktur untuk memenuhi permintaan ini. Sebaliknya, Anda membuat kelas lain, HTMLInvoice, yang melakukan apa yang mereka inginkan sekarang. Anda meningkatkan warisan sehingga Anda tidak perlu menulis banyak kode duplikat dalam HTMLInvoice.
Kode lama yang menggunakan Faktur lama tidak rusak atau benar-benar terpengaruh. Kode baru dapat menggunakan HTMLInvoice. (Jika Anda juga melakukan Liskov Substitutability , L of solid, Anda dapat memberikan contoh HTMLInvoice ke kode yang ada yang mengharapkan contoh Faktur.) Semua orang hidup bahagia selamanya.
Faktur tertutup untuk modifikasi, terbuka untuk ekstensi. Dan Anda harus menulis Faktur dengan benar sebelum ini berfungsi, btw.
Sudahkah Anda membaca artikel Prinsip Terbuka-Tertutup oleh teman-teman Paman Bob di ObjectMentor? Saya pikir itu salah satu penjelasan yang lebih baik di luar sana.
sumber
The jawaban dengan Kate Gregory sangat baik, tapi mempertimbangkan situasi yang berbeda di mana persyaratan baru dapat dipenuhi oleh perubahan yang relatif kecil di yang ada
Invoice
kelas. Misalnya, katakanlah bidang baru harus ditambahkan ke Faktur PDF. Menurut OCP, kita harus tetap membuat subkelas baru, bahkan jika bidang baru dapat ditambahkan dalam implementasi yang ada dengan mengubah beberapa baris kode.Dalam pemahaman saya, OCP mencerminkan realitas tahun 80-an dan awal 90-an, di mana proyek-proyek sering bahkan tidak menggunakan kontrol versi, apalagi memiliki tes regresi otomatis atau manfaat dari alat refactoring canggih. OCP adalah upaya untuk menghindari risiko melanggar kode yang telah diuji secara manual dan dimasukkan ke dalam produksi. Saat ini, kami memiliki cara yang lebih baik untuk mengelola risiko kerusakan perangkat lunak yang berfungsi (yaitu, sistem kontrol versi, TDD dan pengujian otomatis, dan alat refactoring).
sumber
Secara pribadi saya pikir prinsip ini harus diambil dengan sedikit garam. Kode bersifat organik, perubahan bisnis, dan perubahan kode sesuai dengan kebutuhan bisnis seiring berjalannya waktu.
Saya merasa sangat sulit untuk memahami fakta bahwa abstraksi adalah kunci. Bagaimana jika abstraksi itu semula salah? Bagaimana jika fungsi bisnis telah berubah secara signifikan?
Prinsip ini pada dasarnya memastikan bahwa niat dan perilaku ASLI suatu desain tidak boleh berubah. Itu mungkin bekerja untuk mereka yang memiliki API publik dan klien mereka mengalami kesulitan mengikuti rilis baru, dan beberapa kasus tepi lainnya. Namun, jika perusahaan memiliki SEMUA kode, maka saya menantang prinsip ini.
Memiliki cakupan tes yang baik dari kode Anda harus membuat refactoring basis kode Anda mudah. Itu berarti tidak masalah jika ada yang salah - tes Anda akan membantu memandu Anda ke desain yang lebih baik.
Mengatakan itu, jika tidak ada tes, maka prinsip ini masuk akal.
sumber