Welcome to the world of refactoring! We're learning about Code Smells, which are patterns in code that hint at potential problems. Our mission is to help you spot these smells and understand how to improve them through refactoring. We'll delve into the concept of Code Smell, examine different types, and apply real-world code examples to solidify your understanding. Let's get started!
Code smells indicate something might be off within your code, akin to a warning that the code may not be as readable, efficient, or manageable as it could be.
Consider this bit of code:
The function name calculate is too vague. What exactly does it calculate? For whom? This ambiguity is a sign of a 'bad naming' code smell.
If you notice the same piece of code in more than one place, you may be looking at an example of the Duplicate Code smell. Duplicate code leaves room for errors and bugs. If you need to make a change, you might overlook one instance of duplication.
Here's a simple example:
This code performs the same operation on different data. Instead of duplicating the operation, we can create a function to handle it:
With this solution, if we need to change the discount or the formula, we can do so in one place: the calculate_price function.
A method that does too many things or is too long is harder to read and understand, making it a prime candidate for the Too Long Method smell.
Consider this example:
This function handles too many aspects of order processing, suggesting a 'Too Long Method' smell. A better approach could involve breaking down the functionality into smaller, more focused methods and using a cleaner structure for handling payment types, avoiding strings altogether.
Here's the refactored version:
The original process_order function was overly long, handling order validation, payment processing, and email sending within a single block. In the refactored version, functionality is divided into smaller functions, such as process_payment, which uses the PaymentType enum and a switch-case structure. This separation clarifies responsibilities and simplifies the logic, transforming the code into more readable, manageable units. The resulting code is more modular, easier to maintain, and focused on single responsibilities, effectively addressing the initial 'Too Long Method' smell.
