Saya mengerti maksud dari prinsip buka-tutup. Ini dimaksudkan untuk mengurangi risiko melanggar sesuatu yang sudah berfungsi saat memodifikasinya, dengan memberitahu Anda untuk mencoba memperluas tanpa memodifikasi.
Namun, saya kesulitan memahami bagaimana prinsip ini diterapkan dalam praktik. Menurut pemahaman saya, ada dua cara untuk menerapkannya. Sebelumnya dan setelah perubahan yang memungkinkan:
Sebelum: program untuk abstraksi dan 'prediksi masa depan' sebanyak yang Anda bisa. Sebagai contoh, suatu metode
drive(Car car)
harus berubah jikaMotorcycle
s ditambahkan ke sistem di masa depan, sehingga mungkin melanggar OCP. Tetapi metodedrive(MotorVehicle vehicle)
ini cenderung tidak harus berubah di masa depan, sehingga mematuhi OCP.Namun, cukup sulit untuk memprediksi masa depan dan mengetahui terlebih dahulu perubahan apa yang akan dilakukan pada sistem.
Setelah: ketika perubahan diperlukan, perluas kelas alih-alih mengubah kode saat ini.
Latihan # 1 tidak sulit untuk dipahami. Namun itu praktik nomor 2 yang membuat saya kesulitan memahami cara mendaftar.
Misalnya (saya mengambilnya dari video di YouTube): katakanlah kita memiliki metode di kelas yang menerima CreditCard
objek:makePayment(CraditCard card)
. Satu hari Voucher
ditambahkan ke sistem. Metode ini tidak mendukung mereka sehingga harus dimodifikasi.
Ketika menerapkan metode ini sejak awal, kami gagal memprediksi masa depan dan program dalam istilah yang lebih abstrak (mis makePayment(Payment pay)
, jadi sekarang kita harus mengubah kode yang ada.
Praktik # 2 mengatakan kita harus menambahkan fungsionalitas dengan memperluas alih-alih memodifikasi. Apa artinya? Haruskah saya mensubkelas kelas yang ada daripada hanya mengubah kode yang sudah ada?Haruskah saya membuat semacam pembungkus untuk menghindari penulisan ulang kode?
Atau apakah prinsip itu bahkan tidak merujuk pada 'bagaimana cara memodifikasi / menambah fungsionalitas dengan benar', tetapi lebih mengacu pada 'bagaimana menghindari keharusan membuat perubahan di tempat pertama (yaitu program untuk abstraksi)?