Dalam Konstruksi Perangkat Lunak Berorientasi Objek Meyer (1988) ia mendefinisikan prinsip terbuka / tertutup sebagai berikut:
- Modul akan dikatakan terbuka jika masih tersedia untuk perpanjangan. Misalnya, harus dimungkinkan untuk menambahkan bidang ke struktur data yang dikandungnya, atau elemen baru ke set fungsi yang dijalankannya.
- Modul akan dikatakan tertutup jika tersedia untuk digunakan oleh modul lain. Ini mengasumsikan bahwa modul telah diberikan deskripsi yang stabil dan terdefinisi dengan baik (antarmuka dalam arti menyembunyikan informasi).
Dia melanjutkan dengan mengatakan:
Jika Anda membuka kembali modul, Anda juga harus membuka kembali semua kliennya untuk memperbaruinya, karena mereka bergantung pada versi yang lama. ... [Masalah ini] muncul setiap kali sebuah modul harus diperluas oleh fungsi atau elemen data baru, memicu perubahan pada klien langsung dan tidak langsung. ... Dengan pendekatan klasik untuk desain dan pemrograman, tidak ada cara untuk menulis modul yang terbuka dan tertutup.
Solusi Meyer untuk dilema ini adalah: jangan pernah memperluas modul perpustakaan dengan memodifikasi kelas yang ada; sebagai gantinya, tulis modul baru yang mensubkelaskan kelas yang ada, dan minta klien baru bergantung pada modul baru itu.
Sekarang, pada tahun 1988, saya menulis program mainan (prosedural) di Turbo Pascal dan Blankenship Basic, dan pengalaman profesional abad ke-21 saya adalah pada JVM, CLR, dan dalam bahasa yang dinamis, jadi saya tidak tahu apa yang dimaksud Meyer oleh "pendekatan klasik untuk desain dan pemrograman".
Salah satu contoh konkret Meyer tentang mengapa modul klien harus dibuka kembali (pernyataan beralih pada enumerasi yang sekarang memiliki lebih banyak anggota, membutuhkan lebih banyak kasus) tampaknya cukup masuk akal, tetapi ia hampir tidak membenarkan pernyataan bahwa setiap kali Anda menambahkan fungsionalitas ke perpustakaan modul, Anda perlu memperbarui semua kliennya .
Apakah ada alasan historis bahwa pernyataan ini tampak jelas pada tahun 1988? Apakah, katakanlah, menambahkan fungsi atau struktur data ke pustaka C statis mengubah tata letak sedemikian rupa sehingga bahkan dengan API yang kompatibel mundur, klien harus dikompilasi ulang? Atau apakah Meyer benar-benar hanya berbicara tentang mekanisme untuk menegakkan kompatibilitas API?
Jawaban:
Sejauh yang saya tahu, pertanyaan ini telah dijawab oleh Bertrand Meyer sendiri, dan jawabannya adalah, pernyataan ini tidak akurat. Dengan pendekatan klasik untuk merancang dan pemrograman, ada memang bisa menjadi cara untuk menulis modul yang baik terbuka dan tertutup.
Untuk mengetahuinya, Anda perlu mempelajari edisi kedua buku ini (diterbitkan sembilan tahun kemudian, pada tahun 1997). Menurut Kata Pengantar untuk edisi kedua , itu
Secara khusus, pernyataan yang membingungkan Anda telah hilang. Masih ada bab prinsip Tertutup Terbuka di "§3.3 Lima Prinsip", dan ada diskusi lebih lanjut menyeluruh dari topik ini di "§14.7 Pengantar Warisan" tetapi pernyataan dari edisi pertama tidak ada lagi.
Apa yang ada di sana sebagai gantinya berfokus pada bagaimana lebih mudah dan idiomatis dalam pendekatan OO yang bertentangan dengan cara-cara sebelumnya,
Karena Anda juga tampaknya bertanya-tanya tentang apa yang dimaksud "pendekatan klasik" Meyer di sini, Anda dapat menemukan penjelasannya di §4.7 Struktur Modular Tradisional . Bagian ini menjelaskan bahwa ini berarti "perpustakaan rutin" dan "paket" (untuk yang terakhir, penulis mengatakan istilah ini diambil dari Ada dan menyebutkan bahasa lain yang memiliki fitur ini - cluster di CLU dan modul di Modula).
Jika Anda memikirkannya, tidak satu pun dari pendekatan ini pada awalnya dimaksudkan untuk membantu dalam penulisan kode yang menganut prinsip terbuka-tertutup. Hal ini dapat mengarahkan penulis ke penilaian yang agak prematur yang kemudian diperbaiki di edisi kedua.
Adapun apa yang secara khusus membuat penulis berubah pikiran tentang pernyataan itu di antara edisi pertama dan kedua, saya pikir orang dapat menemukan jawaban, lagi, dalam buku itu sendiri, yaitu di Bagian F: Menerapkan metode dalam berbagai bahasa dan lingkungan " . bab ini, penulis membahas bagaimana metode berorientasi objek dapat digunakan dalam bahasa yang lebih lama:
Secara khusus, pada bagian ini Meyer menjelaskan secara terperinci bagaimana mungkin untuk menerapkan warisan (dengan beberapa peringatan dan batasan, tetapi masih) di C dan bahkan di Fortran.
Anda lihat, ini benar-benar panggilan untuk merevisi pernyataan itu dari edisi pertama. Tampaknya mustahil untuk menjelaskan bagaimana mendamaikan "dengan pendekatan klasik ... tidak ada cara" dengan contoh-contoh realistis tentang bagaimana tepatnya hal itu dapat dilakukan.
sumber