We've learned a lot of things in this chapter, all around improving design. We learned that refactoring means restructuring the code without changing the external behavior of a program. We saw that to ensure the preservation of behavior, we need to make very small steps and tests. We learned that legacy code is code that we're afraid to change, and in order to write tests for it, we need to change the code first, which leads to a dilemma. We've also learned that, fortunately, we can make some small changes in the code that are guaranteed to preserve behavior, but that break dependencies and thus allow us to plug into the code with tests. We saw then that we can use pure functions to identify and break the dependencies, leading to lambdas that we can regroup into classes based on cohesiveness.
Finally, we learned that we can use design patterns with functional...