Stepping into Refactoring Code

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

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:

class Game {
    companion object {
        fun computeScore(player: Player, monsters: List<Int>): Int {
            var score = 0
            for (monster in monsters) {
                if (player.power > monster) {
                    score += player.power - monster
                } else {
                    score -= player.power - monster
                }
            }
            return score
        }
    }
}

This code uses an algorithm to adjust the score based on the player's and the monsters' power. The parts player.power > monster and player.power - 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.
class Game {
    companion object {
        private fun scoreChange(power: Int, monster: Int): Int {
            return if (power > monster) {
                power - monster
            } else {
                monster - power
            }
        }

        // Refactored function to calculate the game score.
        fun computeGameScore(player: Player, monsters: List<Int>): Int {
            var score = 0
            for (monster in monsters) {
                score += scoreChange(player.power, 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