Saya memiliki kelas yang menghitung pendapatan tahunan bersih pekerja. Ini memiliki konstanta yang mewakili persentase pajak. Tetapi suatu hari tarif pajak telah berubah, jadi saya perlu memperbaiki kodenya.
Apakah tindakan memperbaiki konstanta ini menunjukkan pelanggaran terhadap Prinsip Terbuka-Tertutup , karena mendalilkan bahwa suatu kelas harus ditutup untuk modifikasi?
object-oriented
object-oriented-design
solid
Analisis Paradisys
sumber
sumber
Jawaban:
OCP dapat dipahami dengan lebih baik ketika memikirkan kelas atau komponen yang disediakan oleh vendor A di semacam perpustakaan kotak hitam, untuk penggunaan oleh pengguna B, C, dan D (perhatikan ini hanyalah model mental yang saya gunakan untuk kejelasan, tidak masalah jika dalam kenyataannya satu-satunya pengguna kelas adalah A sendiri).
Jika B, C dan D dapat menggunakan atau menggunakan kembali kelas yang disediakan untuk kasus penggunaan yang berbeda, tanpa perlu modifikasi kode sumber perpustakaan, maka komponen memenuhi OCP ( sehubungan dengan kategori kasus penggunaan ). Ada berbagai cara untuk mencapai ini, seperti
membuat kelas bisa diwariskan (biasanya dalam hubungannya dengan pola metode templat atau pola strategi)
dengan memberikan "titik injeksi" untuk injeksi ketergantungan
dengan memberikan parameter konfigurasi untuk kelas atau komponen (misalnya, dengan memiliki parameter konstruktor "persentase pajak", seperti dalam kasus Anda, atau dengan menggunakan beberapa mekanisme konfigurasi lainnya)
mungkin cara lain, tergantung pada bahasa pemrograman atau ekosistem
Contoh-contoh khas yang Anda temukan dalam buku teks sering kali dari tipe pertama atau kedua (saya kira karena di mata penulis buku itu, tipe ketiga terlalu sepele untuk disebutkan).
Seperti yang Anda lihat, ini tidak ada hubungannya dengan melarang perubahan kode sumber oleh vendor A (seperti untuk memperbaiki bug, optimasi atau menambahkan fitur baru dengan cara yang kompatibel dengan mundur), yang sangat tidak terkait dengan OCP. OCP adalah tentang bagaimana A mendesain antarmuka dan rincian komponen dalam lib, sehingga skenario penggunaan kembali yang berbeda (seperti bahasa dengan tarif pajak yang berbeda) tidak secara otomatis mendorong persyaratan untuk perubahan.
Jadi, terlepas dari apa yang orang lain katakan kepada Anda di sini, jawabannya jelas "ya" , itu akan menjadi pelanggaran terhadap OCP.
EDIT: tampaknya di antara seseorang menulis posting blog rinci tentang topik ini. Meskipun sebagian dari kata-kata itu bisa saja lebih baik (seperti yang ditunjukkan Derek Elkins), tampaknya penulis pada umumnya memiliki pandangan yang sama bahwa "memenuhi OCP" bukanlah properti absolut, tetapi sesuatu yang hanya dapat dievaluasi dalam konteks tertentu kategori perubahan persyaratan.
sumber
Seperti yang dikatakan orang lain, idealnya kelas pendapatan pekerja akan memungkinkan parameterisasi konstanta, membuat kelas ini independen dari nilai itu.
Pada akhirnya, aplikasi panggilan juga memungkinkan untuk parameterisasi dalam hal konfigurasi eksternal (misalnya file). Setelah kita memiliki konfigurasi eksternal, kita dapat mengubah tarif pajak - meskipun mempertimbangkan bahwa jika file konfigurasi hanya dibaca sekali pada saat startup, maka aplikasi harus direstart agar persentase pajak yang diperbarui berlaku, sehingga ada sesuatu yang harus tetap dalam pikiran. Kami dapat menyediakan fitur aplikasi untuk membaca ulang konfigurasi ketika diarahkan untuk melakukannya, atau kami mungkin menyediakan mekanisme yang lebih rumit yang memperhatikan ketika file konfigurasi berubah ...
Jangka panjang, Anda mungkin menemukan bahwa masalah pajak membutuhkan lebih dari sekadar persentase - misalnya, bahwa suatu hari undang-undang pajak lebih kompleks dan memerlukan beberapa persentase dan beberapa konstanta (misalnya jumlah di bawah $ 10 ribu dikenakan pajak X%, sedangkan sisanya dikenakan pajak pada Y%).
Ini pada dasarnya menyarankan menggunakan pola strategi, di mana kelas utama yang dimaksud di sini menerima objek strategi untuk menghitung pajak.
Berbagai strategi (dan% 's dan $ konstanta) harus dapat dipilih dari file konfigurasi, dan sekarang, menambahkan strategi baru memerlukan penambahan beberapa kode baru, tetapi belum tentu pembaruan untuk kode yang ada.
Setiap strategi mungkin tahu bagaimana mem-parsing / menafsirkan argumen konfigurasi eksternal sendiri, bersama dengan cara menghitung pajak aktual.
Secara dinamis, pajak lebih lanjut tergantung pada pemerintah setempat, jadi Anda mungkin memiliki lokal yang terkait dengan penghasilan atau dengan karyawan (atau keduanya). Dalam konfigurasi eksternal, kami mungkin mengaitkan lokal dengan strategi pajak.
Lihat juga injeksi ketergantungan , tempat kami mengelola hal-hal ini dengan jelas.
sumber
Jika Anda perlu memodifikasi kelas untuk mengubah nilai pajak, maka desainnya memang melanggar OCP. Desain yang sesuai, untuk apa yang telah Anda jelaskan sejauh ini, adalah untuk kelas kalkulator untuk mengambil nilai pajak sebagai parameter.
Jika kelas Anda dipasang (artinya ini bukan kelas statis), dengan membuat properti kelas variabel pajak, yang nilainya disuntikkan melalui konstruktor, Anda juga akan meningkatkan kohesi kelas.
Singkatnya, desain Anda saat ini membuat kelas Anda bergantung pada nilai konstan yang tidak benar-benar konstan (mendefinisikan konstanta sebagai nilai yang tidak akan pernah berubah apa pun yang terjadi, seperti nilai PI). Itu melanggar OCP. Ubah desain untuk menerima nilai pajak sebagai argumen konstruktor.
sumber
Sepenuhnya setuju dengan @Becuzz, dan saya hanya ingin meringkas ini: OCP adalah tentang menemukan abstraksi yang digunakan kembali (karenanya, berguna) yang disuntikkan dalam kelas. Jadi perilaku kelas dimodifikasi bukan dengan mengubah kodenya, tetapi dengan menyediakannya dengan implementasi yang berbeda. Ini diperjelas dalam buku Robert Martin " Pengembangan Perangkat Lunak Agile, Prinsip, Pola, dan Praktik ", periksa bab yang sesuai "Prinsip terbuka-terbuka", "Abstraksi adalah Kunci" sub-bab. Ini mengklarifikasi kesalahpahaman lain bahwa perilaku hanya dapat dimodifikasi dengan pewarisan. Bertrand Meyer yang mengusulkan itu pada tahun 1988 dalam bukunya " Object Oriented Software Construction ", bukan Robert Martin.
sumber
Cara saya melihatnya bukanlah pelanggaran terhadap prinsip tertutup yang terbuka. Namun, fakta bahwa sesuatu yang pasti berubah dalam waktu (seperti persentase pajak) adalah konstan adalah cacat desain: Anda tidak boleh mengubah nilai konstanta tetapi bagaimana Anda menangani persentase pajak. Ini harus menjadi beberapa jenis pengaturan yang dapat dimodifikasi tanpa mengkompilasi ulang semuanya.
sumber