Hello, Explorer! Today is about refactoring. Consider it as organizing your favorite toys in the toybox. We're going to learn about the Extract Method
, Rename Method
, and Substitute Algorithm
refactorings. Refactoring helps us make our code cleaner and neater while keeping the functionality the same!
Imagine having a complex map. Refactoring transforms it into simpler directions. Our code gets rearranged to make it more readable and efficient without altering what it does. Let's consider a small code snippet before and after refactoring:
C#1// Before refactoring 2public double Calculate(double total, int quantity) { 3 double price = total / quantity; 4 double tax = price * 0.2; 5 double totalPrice = price + tax; 6 return totalPrice; 7} 8 9// After refactoring 10public double CalculateTotalPrice(double total, int quantity) { 11 double price = CalculatePrice(total, quantity); 12 double tax = CalculateTax(price); 13 return price + tax; 14} 15 16public double CalculatePrice(double total, int quantity) { 17 return total / quantity; 18} 19 20public double CalculateTax(double price) { 21 return price * 0.2; 22}
Both versions of the code do the same thing, but the latter is simpler and easier to understand!
Imagine a large recipe for a complete breakfast. The Extract Method
technique is like having separate recipes for eggs, toast, coffee, etc., instead of one large recipe. Take a look at this code:
C#1// Before refactoring 2public string GreetUser(string username) { 3 username = username.Trim().ToLowerInvariant(); // Prepare the username 4 string message = "Hello, " + username + "!"; // Prepare the message 5 return message; // Return the prepared message 6} 7 8// After refactoring 9public string CleanUsername(string username) { 10 return username.Trim().ToLowerInvariant(); // Returns a cleaned version of the username 11} 12 13public string GreetUser(string username) { 14 username = CleanUsername(username); // Clean the username 15 string message = "Hello, " + username + "!"; // Prepare and return the message 16 return message; 17}
Here, we moved the username preparation from GreetUser
into its own function, CleanUsername
. Nice and tidy!
Clear method names make it easy to understand our code, just as clear street names make navigating a city more accessible. Let's have a look at renaming a method:
C#1// Before refactoring 2public double Fx(double x) { 3 return 3.14 * (x * x); // Calculates a value that is pi times the square of x 4} 5 6// After refactoring 7public double CalculateCircleArea(double radius) { 8 return 3.14 * (radius * radius); // Calculates the area of a circle with a given radius 9}
Renaming the function Fx
to CalculateCircleArea
makes it easier to understand its purpose.
A Substitute Algorithm
involves replacing a part of a code (an algorithm) with a simpler one, analogous to discovering a faster route to school. Here's an example:
C#1// Before refactoring 2public int FindSmallest(int[] numbers) { 3 int smallest = int.MaxValue; 4 foreach (var num in numbers) { 5 if (num < smallest) { 6 smallest = num; 7 } 8 } 9 return smallest; 10} 11 12// After refactoring 13using System.Linq; 14 15public int FindSmallest(int[] numbers) { 16 return numbers.Min(); // Returns the smallest number from 'numbers' 17}
Using numbers.Min()
from LINQ
performs the same job as our previous function but with less code.
Great work! We've learned how to use the Extract Method
, Rename Method
, and Substitute Algorithm
to keep our code clean and efficient. Now, it's time for some hands-on practice with real examples. Remember, practice makes perfect. Let's do some refactoring!