導入
リファクタリングは、既存のコードを改善するための重要な手法です。特に中級エンジニアにとっては、コードの可読性や保守性を高めるためのスキルが求められます。今回は、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: 上記のコードにおいて、年齢計算のロジックをリファクタリングして、より明確にする方法を考えてください。
// リファクタリング後のコード 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: ユーザー情報取得メソッドの責務を分割するために、どのようにクラスを再設計しますか?
// リファクタリング後のコード 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: リファクタリングによってどのようなメリットが得られるか、具体的な例を挙げて説明してください。
リファクタリングにより、コードの可読性が向上し、メンテナンスが容易になります。例えば、年齢計算のロジックを独立したメソッドに分けることで、他の部分で再利用可能になり、テストも容易になります。
まとめ
- リファクタリングはコードの品質を向上させるための手法である。
- 具体的なシチュエーションにおいて、責務の分割やロジックの明確化が重要である。
- リファクタリングを通じて、保守性や再利用性を高めることができる。