Baru-baru ini saya membaca situs web tentang pengembangan kode bersih (saya tidak menaruh tautan di sini karena tidak dalam bahasa Inggris).
Salah satu prinsip yang diiklankan oleh situs ini adalah Prinsip Terbuka Tertutup : setiap komponen perangkat lunak harus terbuka untuk ekstensi dan ditutup untuk modifikasi. Misalnya, ketika kami telah mengimplementasikan dan menguji suatu kelas, kami hanya harus memodifikasinya untuk memperbaiki bug atau untuk menambahkan fungsionalitas baru (mis. Metode baru yang tidak memengaruhi yang sudah ada). Fungsi dan implementasi yang ada tidak boleh diubah.
Saya biasanya menerapkan prinsip ini dengan mendefinisikan antarmuka I
dan kelas implementasi yang sesuai A
. Ketika kelas A
telah menjadi stabil (diimplementasikan dan diuji), saya biasanya tidak memodifikasinya terlalu banyak (mungkin, tidak sama sekali), yaitu
- Jika persyaratan baru tiba (mis. Kinerja, atau implementasi antarmuka yang sama sekali baru) yang memerlukan perubahan besar pada kode, saya menulis implementasi baru
B
, dan tetap menggunakanA
selamaB
tidak matang. SaatB
sudah matang, yang dibutuhkan hanyalah mengubah caraI
instantiated. - Jika persyaratan baru menyarankan perubahan ke antarmuka juga, saya mendefinisikan antarmuka baru
I'
dan implementasi baruA'
. JadiI
,A
dibekukan dan tetap implementasi untuk sistem produksi selamaI'
danA'
tidak cukup stabil untuk menggantikannya.
Jadi, mengingat pengamatan ini, saya sedikit terkejut bahwa halaman web kemudian menyarankan penggunaan refactoring kompleks , "... karena tidak mungkin untuk menulis kode secara langsung dalam bentuk akhirnya."
Apakah tidak ada kontradiksi / konflik antara menegakkan Prinsip Terbuka / Tertutup dan menyarankan penggunaan refactoring kompleks sebagai praktik terbaik? Atau idenya di sini adalah bahwa seseorang dapat menggunakan refactoring yang kompleks selama pengembangan suatu kelas A
, tetapi ketika kelas itu telah diuji dengan sukses, ia harus dibekukan?