Prinsip open-closed (OCP) menyatakan bahwa suatu objek harus terbuka untuk ekstensi tetapi ditutup untuk modifikasi. Saya percaya saya memahaminya dan menggunakannya bersama dengan SRP untuk membuat kelas yang hanya melakukan satu hal. Dan, saya mencoba membuat banyak metode kecil yang memungkinkan untuk mengekstrak semua kontrol perilaku menjadi metode yang dapat diperluas atau diganti dalam beberapa subkelas. Dengan demikian, saya berakhir dengan kelas yang memiliki banyak titik ekstensi, baik melalui: injeksi ketergantungan dan komposisi, acara, delegasi, dll.
Pertimbangkan kelas berikut yang sederhana dan dapat diperpanjang:
class PaycheckCalculator {
// ...
protected decimal GetOvertimeFactor() { return 2.0M; }
}
Sekarang katakan, misalnya, bahwa OvertimeFactor
perubahan ke 1,5. Karena kelas di atas dirancang untuk diperluas, saya dapat dengan mudah subkelas dan mengembalikan yang berbeda OvertimeFactor
.
Tapi ... terlepas dari kelas yang dirancang untuk ekstensi dan mengikuti OCP, saya akan memodifikasi metode tunggal yang dipertanyakan, daripada subklasifikasi dan menimpa metode yang dimaksud dan kemudian mengirim ulang benda-benda saya ke dalam wadah IoC saya.
Akibatnya, saya telah melanggar bagian dari apa yang OCP coba capai. Rasanya saya hanya malas karena hal di atas sedikit lebih mudah. Apakah saya salah memahami OCP? Haruskah saya melakukan sesuatu yang berbeda? Apakah Anda memanfaatkan manfaat OCP secara berbeda?
Pembaruan : berdasarkan jawaban, sepertinya contoh yang dibuat-buat ini buruk karena sejumlah alasan berbeda. Maksud utama dari contoh ini adalah untuk menunjukkan bahwa kelas dirancang untuk diperluas dengan menyediakan metode yang bila diganti akan mengubah perilaku metode publik tanpa perlu mengubah kode internal atau pribadi. Tetap saja, saya pasti salah paham tentang OCP.