Refactoring adalah - dan harus - proses yang berkelanjutan. Tidak cukup hanya memenuhi persyaratan dengan implementasi yang berjalan dan diuji yang masih sedikit tidak lengkap.
"Buat itu berfungsi, lalu buat itu bekerja lebih baik" .
Saya tidak ingat di mana saya membaca kutipan itu, tetapi ini adalah kunci untuk menerapkan refactoring dengan baik, dan saya menganggapnya tidak profesional untuk melakukan sebaliknya.
Refactoring berkelanjutan seperti menyeka tumpahan saat Anda memasak, dan membersihkan piring setelah makan. Refactoring yang ditargetkan seperti menemukan dapur kotor, tetapi hanya memiliki waktu untuk mencuci satu atau dua gelas kotor. Apakah Anda lebih suka hidup dengan dapur yang terus menerus kotor, atau apakah Anda lebih memilih untuk menjaga kebersihan saat berjalan?
Anda mendapatkan kode untuk bekerja, kemudian Anda refactor kode Anda untuk memastikan bahwa Anda memiliki implementasi terbaik yang dapat Anda gunakan. Jika Anda melakukan sesuatu yang familier, mungkin Anda menerapkan kode terbaik pertama kali, namun perlu waktu untuk memeriksa ulang pekerjaan Anda untuk memastikan. Jika sepertinya Anda dapat meningkatkan kode Anda, maka Anda mencoba untuk refactor untuk memastikan kode Anda setidaknya ramping dan bersih yang Anda bisa. Ini berarti Anda mengurangi jumlah utang teknis yang Anda tinggalkan, dan Anda membuatnya lebih mudah untuk membaca dan refactor saat kode berikutnya perlu ditangani. Ini adalah nilai inti di balik mantra TDD "Red-Green-Refactor", kecuali bahwa di mana di TDD Anda melakukan refactor terutama untuk menghapus duplikasi, ada baiknya juga meninjau item lain yang bisa dire-refoured, seperti kelas besar, metode panjang,
Jika Anda mendapati diri Anda menghadapi desain ulang besar, maka mungkin Anda bisa menundanya untuk sementara waktu, terutama jika Anda kehabisan waktu dalam jadwal Anda. Namun ini asalkan fungsionalitas kode Anda tidak akan dikompromikan, dan juga asalkan implementasi akan terus memenuhi persyaratan. Situasi semacam ini seharusnya merupakan kejadian yang jarang, dan Anda dapat membantu memastikannya semakin jarang terjadi jika Anda terus-menerus melakukan refactoring saat Anda melanjutkan. Namun yang lebih penting adalah bahwa Anda tidak dapat mengambil risiko meninggalkan perubahan besar terlalu lama, jika tidak, Anda akhirnya akan menciptakan beban kerja yang lebih besar nantinya yang bisa jauh lebih mahal untuk diperbaiki, atau dapat berakhir dengan menghasilkan lebih mahal lagi kegagalan proyek.
Saya mendapat kesan bahwa banyak orang cenderung membingungkan definisi untuk Refactoring dan rekayasa ulang . Kedua istilah tersebut menggambarkan strategi untuk mengelola situasi yang sangat berbeda. Jika Anda ingin merekayasa ulang, Anda membuat komitmen untuk membuat perubahan drastis yang akan mengubah perilaku sistem. Ini akan membatalkan beberapa tes, dan juga akan memerlukan tes baru. Ketika Anda Refactor, Anda memastikan sistem Anda terus berperilaku tepatsama seperti yang terjadi sebelum perubahan, namun Anda juga memastikan bahwa kode Anda akan memiliki umur panjang, dan bahwa hal itu akan lebih mudah untuk mempertahankan dari waktu ke waktu. Anda tidak "mucikari" kode untuk neraka itu, Anda berkomitmen untuk standar profesional kode yang bersih yang akan mengurangi risiko kegagalan, dan akan memastikan kode Anda tetap menyenangkan untuk bekerja dengan, dan standar profesional .
Akan kembali ke jendela analogi rusak, jika Anda memutuskan jendela Anda harus memperbaikinya segera. Jika Anda belum menyadari bahwa jendela rusak, maka Anda perlu memutuskan biaya untuk Anda jika Anda meninggalkan jendela rusak. Sekarang, ulangi dua kalimat sebelumnya, tapi pengganti Bug untuk jendela. Anda akhirnya membutuhkan strategi yang berbeda. Jika Anda telah membuat sebuah bug sebagai kode Anda, Anda memperbaikinya segera, atau Anda melihat apakah perubahan akan membutuhkan upaya re-engineering, dan Anda membuat keputusan komersial kapan itu akan menjadi yang terbaik untuk memilah masalah. Jadi Anda tidak refactor untuk memperbaiki masalah, Anda refactor untuk memastikan lebih mudah untuk menemukan dan masalah memperbaiki. Saya tidak peduli betapa menakjubkan Anda berpikir kode Anda, sistem yang kompleks akan selalu memiliki masalah yang perlu ditangani dengan waktu lebih. Inilah yang dimaksud dengan utang teknis, dan mengapa refactoring perlu menjadi proses yang berkelanjutan saat Anda menerapkan kode Anda , dan tidak pergi untuk waktu mendatang yang sewenang-wenang.
Jadi singkatnya, jawaban bahwa kadang-kadang jarang dapat diterima untuk menunda perubahan besar untuk membuat tenggat waktu, namun itu tidak boleh dianggap praktik biasa untuk memperlakukan refactoring sebagai latihan yang independen dari pekerjaan implementasi harian Anda, dan tentu saja tidak pernah digunakan sebagai alasan oleh tim terbiasa dengan kode dasar sebagai pilihan untuk menghindari memastikan bahwa pelaksanaannya adalah sebagai ramping dan bersih karena mereka mungkin dapat membuatnya dalam situasi.