C#中級

中級 C#で学ぶリファクタリング|練習問題編

導入

リファクタリングは、既存のコードを改善するための重要な手法です。特に中級エンジニアにとっては、コードの可読性や保守性を高めるためのスキルが求められます。今回は、C#を用いて具体的なリファクタリングのシチュエーションを考察し、実際にどのように改善できるかを見ていきます。

教科書レベルの解説(リファクタリング)

重要な概念の整理

リファクタリングは、機能を変更せずにコードの構造を改善するプロセスです。これには、コードの重複を減らす、クラスやメソッドの役割を明確にする、可読性を向上させるなどの目的があります。特に、特定のシチュエーションにおいて、リファクタリングの効果が顕著に現れることがあります。

コード例(C#)


// ユーザーの情報を取得するクラス
public class UserService
{
    public User GetUserInfo(int userId)
    {
        // データベースからユーザー情報を取得
        User user = Database.GetUserById(userId);
        
        // ユーザーの年齢を計算
        user.Age = CalculateAge(user.DateOfBirth);
        
        return user;
    }

    private int CalculateAge(DateTime dateOfBirth)
    {
        return DateTime.Now.Year - dateOfBirth.Year;
    }
}

コードの行ごとの解説

  1. ユーザー情報を取得するメソッドが定義されています。
  2. データベースからユーザー情報を取得する処理が行われています。
  3. 年齢を計算するためのメソッドが呼び出されています。
  4. 最終的にユーザー情報が返されます。

練習問題編

以下の練習問題に取り組んで、リファクタリングの理解を深めてください。

  1. 問題1: 上記のコードにおいて、年齢計算のロジックをリファクタリングして、より明確にする方法を考えてください。

    
    // リファクタリング後のコード
    public class UserService
    {
        public User GetUserInfo(int userId)
        {
            User user = Database.GetUserById(userId);
            user.Age = CalculateAge(user.DateOfBirth);
            return user;
        }
    
        private int CalculateAge(DateTime dateOfBirth)
        {
            var today = DateTime.Today;
            int age = today.Year - dateOfBirth.Year;
            if (dateOfBirth.Date > today.AddYears(-age)) age--;
            return age;
        }
    }
    
  2. 問題2: ユーザー情報取得メソッドの責務を分割するために、どのようにクラスを再設計しますか?

    
    // リファクタリング後のコード
    public class UserService
    {
        private readonly IUserRepository _userRepository;
        private readonly IAgeCalculator _ageCalculator;
    
        public UserService(IUserRepository userRepository, IAgeCalculator ageCalculator)
        {
            _userRepository = userRepository;
            _ageCalculator = ageCalculator;
        }
    
        public User GetUserInfo(int userId)
        {
            User user = _userRepository.GetUserById(userId);
            user.Age = _ageCalculator.Calculate(user.DateOfBirth);
            return user;
        }
    }
    
  3. 問題3: リファクタリングによってどのようなメリットが得られるか、具体的な例を挙げて説明してください。

    リファクタリングにより、コードの可読性が向上し、メンテナンスが容易になります。例えば、年齢計算のロジックを独立したメソッドに分けることで、他の部分で再利用可能になり、テストも容易になります。

まとめ

  • リファクタリングはコードの品質を向上させるための手法である。
  • 具体的なシチュエーションにおいて、責務の分割やロジックの明確化が重要である。
  • リファクタリングを通じて、保守性や再利用性を高めることができる。