The more I have been reading and practicing, the more convinced I have become of the necessity of continuous refactoring. Here are the list of advantages I am seeing as I refactor code:
- Code becomes cleaner, easier to understand and flows as-if though written in English, not in Java.
- Large complex methods, or classes get broken into much simpler to understand classes/methods.
- This has an advantage that now the same work is done my multiple small classes & methods, rather than big classes and methods. Hence "Merging" code into multiple branches becomes rather simple in comparison. One can easily see the change and its impact, and in most cases merging becomes an "Add" activity, because now one is adding multiple classes to code base, rather than merging lines into big methods. And anyone who has done branch folding/merging understands that adding a class to a branch is way simpler than doing a diff of classes and merging code lines.
- An interesting side-effect that happened due to refactoring is in profiling. Using a profiler for performance profiling usually gives method level results. Now, with refactored code, the same functionality is split into multiple methods, so now its much easier to identify the offending piece of code for optimization. Also, with refactoring, since methods are well named, and re-usable.. one good optimization has a bigger impact on other parts of the system.
I think to make your system loosely coupled, stable and 'evolvable'.. combine refactoring with unit testing (or better TDD) .