メソッドの抽出
1つのメソッドに重複したコードが存在する場合や、長すぎて読みづらい場合は「メソッドの抽出」を行います。
たとえば「2つのファイルを比較して、内容が一致しているかを判定する」メソッドを以下のように定義したとします。
●
リファクタリング前のコード
// 2つのファイルを比較して、内容が一致しているかを判定します
private bool IsMatchContents(string filePath1, string filePath2)
{
StreamReader sr1 = new StreamReader(filePath1);
string fileContents1 = sr1.ReadToEnd();
StreamReader sr2 = new StreamReader(filePath2);
string fileContents2 = sr2.ReadToEnd();
sr1.Close();
sr2.Close();
return fileContents1 == fileContents2;
}
このメソッドは「ファイルの内容を読み込む」部分が重複していますので、重複部分をメソッドとして抽出し「ReadFileContents」と命名してみましょう。
●
リファクタリング後のコード
// 2つのファイルを比較して、内容が一致しているかを判定します
private bool IsMatchContents(string filePath1, string filePath2)
{
return ReadFileContents(filePath1) == ReadFileContents(filePath2);
}
// ファイルを読み込んで内容を返します
private string ReadFileContents(string filePath)
{
StreamReader sr = new StreamReader(filePath);
try
{
return sr.ReadToEnd();
}
finally{
sr.Close();
}
}
「ファイルを開いたら必ず閉じる」プログラムの基本中の基本ですが、最初のコードでは非常に書きづらかった概念が、リファクタリング後は簡単に書くことができました。
このように単機能ごとにメソッドを抽出すると、可読性が上がるだけではなく、例外処理や必ず実行しなければならない処理が書きやすくなるメリットもあります。
ただし振る舞いが変わるような「メソッドの抽出」を行ってはいけません。ですから「メソッドの抽出」前後のテストは必須です。
コメントはまだありません。