Definisi: Entitas perangkat lunak seperti kelas, modul, dan fungsi harus terbuka untuk ekstensi dan tertutup untuk modifikasi.
Asal usul masalah: Selama siklus hidup perangkat lunak, ketika kode asli perangkat lunak perlu dimodifikasi karena perubahan, peningkatan dan pemeliharaan, kesalahan dapat dimasukkan ke dalam kode lama, dan juga dapat memaksa kita untuk refactor seluruh fungsi, dan kode asli perlu dikembalikan.
Solusi: Ketika perangkat lunak perlu diubah, cobalah untuk mencapai perubahan dengan memperluas perilaku entitas perangkat lunak, daripada memodifikasi kode yang ada.
Prinsip pembukaan dan penutupan adalah prinsip desain paling mendasar dalam desain yang berorientasi objek, yang memandu kita bagaimana membangun sistem yang stabil dan fleksibel. Prinsip pembukaan dan penutupan mungkin merupakan definisi paling samar dari enam prinsip pola desain. Itu hanya memberitahu kita untuk membuka dan menutup modifikasi, tetapi bagaimana kita bisa dibuka dan ditutup dan tidak memberi tahu kita dengan jelas. Di masa lalu, jika seseorang mengatakan kepada saya, "Anda harus mematuhi prinsip pembukaan dan penutupan saat mendesain", saya akan merasa bahwa dia tidak mengatakan apa -apa, tetapi sepertinya dia mengatakan segalanya. Karena prinsip pembukaan dan penutupan benar -benar terlalu kosong.
Setelah dengan hati -hati berpikir dan membaca banyak artikel tentang pola desain, saya akhirnya mendapat sedikit pemahaman tentang prinsip pembukaan dan penutupan. Bahkan, kami mengikuti lima prinsip pertama dari pola desain, dan tujuan menggunakan 23 pola desain adalah untuk mengikuti prinsip pembukaan dan penutupan. Dengan kata lain, selama kita mematuhi lima prinsip pertama, perangkat lunak yang dirancang secara alami akan sesuai dengan prinsip pembukaan dan penutupan. Prinsip pembukaan dan penutupan ini lebih seperti "skor rata -rata" dari tingkat kepatuhan dari lima prinsip pertama. Jika lima prinsip sebelumnya diikuti dengan baik, skor rata -rata secara alami akan lebih tinggi, yang berarti bahwa prinsip -prinsip desain dan penutupan perangkat lunak diikuti dengan baik; Jika lima prinsip sebelumnya tidak dipatuhi, itu berarti bahwa prinsip pembukaan dan penutupan tidak dipatuhi.
Faktanya, penulis percaya bahwa prinsip pembukaan dan penutupan tidak lebih dari untuk mengungkapkan maknanya: membangun kerangka kerja dengan abstraksi dan memperluas detail dengan implementasi. Karena fleksibilitas dan kemampuan beradaptasi yang luas dari abstraksi, selama abstraksi masuk akal, stabilitas arsitektur perangkat lunak pada dasarnya dapat dipertahankan. Untuk detail variabel dalam perangkat lunak, kami menggunakan kelas implementasi yang berasal dari abstrak untuk memperluas. Ketika perangkat lunak perlu diubah, kita hanya perlu menurunkan kembali kelas implementasi sesuai dengan kebutuhan untuk memperpanjang. Tentu saja, premisnya adalah bahwa abstraksi kita harus masuk akal dan kita harus berwawasan ke depan dan ke depan dalam perubahan permintaan.
Dalam definisi prinsip pembukaan dan penutupan, entitas perangkat lunak dapat merujuk pada modul perangkat lunak, struktur lokal yang terdiri dari beberapa kelas, atau kelas independen.
Perangkat lunak apa pun perlu menghadapi masalah penting, yaitu, kebutuhan mereka akan berubah seiring waktu. Ketika sistem perangkat lunak perlu menghadapi kebutuhan baru, kita harus mencoba yang terbaik untuk memastikan bahwa kerangka desain sistem stabil. Jika desain perangkat lunak mematuhi prinsip pembukaan dan penutupan, akan sangat nyaman untuk memperluas sistem, dan tidak perlu memodifikasi kode yang ada saat berkembang, sehingga sistem perangkat lunak memiliki stabilitas dan kontinuitas yang lebih baik sambil memiliki kemampuan beradaptasi dan fleksibilitas. Ketika skala perangkat lunak menjadi lebih besar dan lebih besar, kehidupan perangkat lunak menjadi lebih lama dan biaya pemeliharaan perangkat lunak menjadi lebih tinggi dan lebih tinggi, dan merancang sistem perangkat lunak yang memenuhi prinsip pembukaan dan penutupan menjadi semakin penting.
Untuk memenuhi prinsip pembukaan dan penutupan, perlu secara abstrak merancang sistem, dan abstraksi adalah kunci prinsip pembukaan dan penutupan. Dalam bahasa pemrograman seperti Java dan C#, lapisan abstraksi yang relatif stabil dapat didefinisikan untuk sistem, dan perilaku implementasi yang berbeda dapat dipindahkan ke lapisan implementasi spesifik untuk diselesaikan. Dalam banyak bahasa pemrograman yang berorientasi objek, mekanisme seperti antarmuka dan kelas abstrak disediakan, di mana lapisan abstraksi sistem dapat ditentukan dan kemudian diperluas melalui kelas konkret. Jika Anda perlu memodifikasi perilaku sistem, tidak perlu melakukan perubahan pada lapisan abstraksi. Anda hanya perlu menambahkan kelas konkret baru untuk mengimplementasikan fungsi bisnis baru, sehingga dapat memperluas fungsi sistem tanpa memodifikasi kode yang ada, dan memenuhi persyaratan prinsip pembukaan dan penutupan.
Sistem CRM yang dikembangkan oleh Sunny Software dapat menampilkan berbagai jenis grafik, seperti diagram lingkaran dan diagram batang. Untuk mendukung beberapa metode tampilan bagan, rencana desain asli ditunjukkan pada gambar di bawah ini:
Cuplikan kode berikut ada dalam metode display () dari kelas ChartDisplay:
...... if (type.equals ("pie")) {piechart chart = new piechart (); chart.display (); } else if (type.equals ("bar")) {Barchart chart = new barchart (); chart.display (); } ...... Dalam kode ini, jika Anda perlu menambahkan kelas bagan baru, seperti Linechart, Anda perlu memodifikasi kode sumber metode tampilan () dari kelas ChartDisplay dan menambahkan logika penilaian baru, yang melanggar prinsip pembukaan dan penutupan.
Sistem ini sekarang dikonfigurasi ulang untuk membuatnya sesuai dengan prinsip pembukaan dan penutupan.
Dalam contoh ini, karena setiap kelas bagan diprogram dalam metode display () dari kelas ChartDisplay, menambahkan kelas bagan baru harus memodifikasi kode sumber. Sistem ini dapat diperbaiki dengan cara yang abstrak sehingga ketika menambahkan kelas bagan baru, tidak perlu memodifikasi kode sumber, yang memenuhi prinsip pembukaan dan penutupan. Metode spesifiknya adalah sebagai berikut:
(1) Tambahkan kelas bagan abstrak AbstractChart, dan gunakan berbagai kelas bagan beton sebagai subclass mereka;
(2) Kelas ChartDisplay diprogram untuk kelas grafik abstrak, dan klien memutuskan bagan spesifik mana yang akan digunakan.
Struktur setelah rekonstruksi ditunjukkan pada gambar di bawah ini:
Pada Gambar 2, kami memperkenalkan kelas bagan abstrak AbstractChart, dan ChartDisplay diprogram untuk kelas bagan abstrak, dan klien mengatur objek bagan spesifik yang instanatasi melalui metode setChart (). Dalam metode display () dari ChartDisplay, metode tampilan () dari objek bagan dipanggil untuk menampilkan grafik. Jika Anda perlu menambahkan bagan baru, seperti Linechart, Anda hanya perlu menggunakan Linechart sebagai subclass dari AbstractChart dan menyuntikkan objek Linechart ke dalam chartDisplay pada klien, tanpa memodifikasi kode sumber perpustakaan kelas yang ada.
Catatan: Karena file konfigurasi dalam format seperti XML dan properti adalah file teks biasa, mereka dapat diedit secara langsung melalui editor VI atau notepad tanpa kompilasi, dalam pengembangan perangkat lunak, modifikasi file konfigurasi umumnya tidak dianggap sebagai modifikasi dari kode sumber sistem. Jika suatu sistem hanya melibatkan memodifikasi file konfigurasi saat diperpanjang, dan kode Java asli atau kode C# belum membuat modifikasi apa pun, sistem dapat dianggap sebagai sistem yang sesuai dengan prinsip pembukaan dan penutupan.