Stepping into Refactoring Code

Welcome to our captivating session on refactoring, a powerful tool for tidying up code, much like you would organize a messy toy box or find a faster route to school.

As each line of code is as essential as a brick in a building, clumsy code may result in an unstable structure. Today, we'll focus on enhancing the readability, maintainability, and performance of our code through refactoring.

Recapping Crucial Concepts

Let's briefly revisit a few key concepts:

  • Code Smells: Indicators that our code needs refactoring, akin to clutter calling for cleanup.
  • Refactoring Techniques: We've familiarized ourselves with Extract Method, Rename Method, and Substitute Algorithm techniques in earlier lessons.
  • OOP in Refactoring: We've learned how to leverage Object-Oriented Programming principles to enhance our code's structure.
  • Code Decoupling and Modularization: Methods to make code easier to manage by minimizing dependencies.

We'll use these concepts as guiding stars as we traverse the cosmos of refactoring.

Practice Problem 1: Taming a Complex Function

We'll start by rewriting a complex game score computation function. Let's look at it:

public class Game {
    public static int computeScore(Player player, List<Integer> monsters) {
        int score = 0;
        for (int monster : monsters) {
            if (player.getPower() > monster) {
                score += player.getPower() - monster;
            } else {
                score -= player.getPower() - monster;
            }
        }
        return score;
    }
}

This code uses some algorithm to adjust the score based on the player's and monster's power. The parts player.getPower() > monster and player.getPower() - monster recur in this function, indicating room for refactoring. We'll apply the Extract Method and Rename Method to untangle this:

  • We'll extract the scoring logic into a separate function, scoreChange.
  • We'll rename the original function to computeGameScore.

With these adjustments, our improved code might look something like this:

// New function to calculate score changes.
public class Game {
    private static int scoreChange(int power, int monster) {
        if (power > monster) {
            return power - monster;
        } else {
            return monster - power;
        }
    }

    // Refactored function to calculate the game score.
    public static int computeGameScore(Player player, List<Integer> monsters) {
        int score = 0;
        for (int monster : monsters) {
            score += scoreChange(player.getPower(), monster);
        }
        return score;
    }
}

This refactoring has simplified the function and made it easier to modify in the future.

Sign up
Join the 1M+ learners on CodeSignal
Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal