Skip to content
Home » Replace Method with Method Object

Replace Method with Method Object

Introduction

The Replace Method with Method Object refactoring technique is used to transform a method into a separate class, converting the method parameters into its fields, and allowing the method to be broken down into multiple methods within that new class.

The Replace Method with Method Object is often applied in cases where you have a long method that needs to be split into several smaller ones. However, these smaller methods require many temporary variables and control variables (e.g., loop variables), making it hard to apply the Extract Method technique. Instead, you can transform the method into a separate class where the local variables become fields of the class. Then you can split the method into several methods within the same class.

Example in Java

Before Refactoring

class Order {
    // ... other methods ...

    double calculateTotal() {
        double total = 0;
        for (Item item : items) {
            total += item.getPrice();
        }
        total = total - getDiscount();
        total = total + getTax();
        return total;
    }

    double getDiscount() {
        //... discount calculation
    }

    double getTax() {
        //... tax calculation
    }
}
Java

After Refactoring

class Order {
    // ... other methods ...

    double calculateTotal() {
        return new TotalCalculator(this).compute();
    }
}

class TotalCalculator {
    private double total;
    private Order order;

    TotalCalculator(Order order) {
        this.order = order;
    }

    double compute() {
        for (Item item : order.items) {
            total += item.getPrice();
        }
        total = total - getDiscount();
        total = total + getTax();
        return total;
    }

    double getDiscount() {
        //... discount calculation
    }

    double getTax() {
        //... tax calculation
    }
}
Java

In the example, the original calculateTotal() method is replaced with a TotalCalculator class. The new class is initialized with the Order object and a new compute() method that provides the total calculation. This refactoring makes it easier to split the compute() method into smaller methods if necessary, and it encapsulates the total calculation logic in a separate class, which can help improve readability and maintainability.

Benefits of Replace Method with Method Object Refactoring

This refactoring technique offers several benefits:

  1. Reduces complexity: Long methods that contain several control variables and temporary variables can become quite complicated, making them hard to understand and maintain. By replacing such a method with a method object, the method can be broken down into several smaller methods, each performing a single, specific task, reducing complexity.
  2. Improves readability: By organizing related calculations or operations into separate methods within a new class, the code becomes easier to read and understand.
  3. Enhances testability: Smaller methods that perform specific tasks can be more easily unit tested, which improves the robustness of the code. It is also easier to mock dependencies when testing the individual methods.
  4. Improves maintainability: Since each method within the new class performs a specific task, it’s easier to update or modify the behavior of one aspect of the computation without affecting the others. This makes the code more maintainable.
  5. Promotes code reuse: If the method contains logic that could potentially be used in other parts of the application, by converting it into its own class, this logic becomes more easily reusable.
  6. Better encapsulation: It helps to encapsulate the data and the operations on the data into a single object. This promotes information hiding and can make the code more modular and easier to manage.

It is worth mentioning that, as with any refactoring technique, Replace Method with Method Object should be used judiciously. Overusing this pattern might result in too many small classes, which can increase complexity rather than reduce it. The key is to find a good balance and use the technique when it makes sense to do so.