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 Idan kelas implementasi yang sesuai A. Ketika kelas Atelah 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 menggunakanAselamaBtidak matang. SaatBsudah matang, yang dibutuhkan hanyalah mengubah caraIinstantiated. - Jika persyaratan baru menyarankan perubahan ke antarmuka juga, saya mendefinisikan antarmuka baru
I'dan implementasi baruA'. JadiI,Adibekukan 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?