問い合わせによる一時変数の置き換え
前回のリファクタリング「説明用変数の導入」で冗長になったコードに、「問い合わせによる一時変数の置き換え」を試してみましょう。
「問い合わせによる一時変数の置き換え」は意味のある式を一時変数に代入して利用しているため、メソッド内でしかその値を活用できない場合に用いられ、「意味のある式」を問い合わせメソッドとして抽出するリファクタリングです。
とくにフィールドから意味のある値を導出している場合に効果を発揮します。
●
説明用変数の導入後のコード
// ビットマップを中央に描画
private void DrawCenter(Bitmap bitmap)
{
// ピクチャーボックス設定用ビットマップを生成
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
// キャンバスのGraphicsオブジェクトを生成
Graphics g = Graphics.FromImage(canvas);
// 中央描画用x座標を取得
int centerDrawXPosition = (canvas.Width / 2) - (bitmap.Width / 2);
// 中央表示用y座標を取得
int centerDrawYPosition = (canvas.Height / 2) - (bitmap.Height / 2);
// キャンバスの中央にビットマップを描画
g.DrawImage(bitmap, centerDrawXPosition, centerDrawYPosition);
// Graphicsオブジェクトのリソースを解放
g.Dispose();
// ピクチャーボックスに描画
PictureBox1.Image = canvas;
}
コードを眺めると、やはり中央描画用x座標およびy座標を計算している個所が目につきます。
キャンバスの幅と高さを利用しておりますが、これらはもともとピクチャーボックスの幅と高さからビットマップを生成していますので、問い合わせメソッドとして抽出してみる価値がありそうです。
●
説明用変数の導入後のコード
// ビットマップを中央に描画
private void DrawCenter(Bitmap bitmap)
{
// ピクチャーボックス設定用ビットマップを生成
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
// キャンバスのGraphicsオブジェクトを生成
Graphics g = Graphics.FromImage(canvas);
// キャンバスの中央にビットマップを描画
g.DrawImage(bitmap,
GetCenterDrawXPosition(bitmap), GetCenterDrawYPosition(bitmap));
// Graphicsオブジェクトのリソースを解放
g.Dispose();
// ピクチャーボックスに描画
PictureBox1.Image = canvas;
}
// 中央描画用x座標を取得
private int GetCenterDrawXPosition(Bitmap bitmap)
{
return (PictureBox1.Width / 2) - (bitmap.Width / 2);
}
// 中央描画用y座標を取得
private int GetCenterDrawYPosition(Bitmap bitmap)
{
return (PictureBox1.Height / 2) - (bitmap.Height / 2);
}
メソッドの数が増えてしまいましたが、DrawCenterメソッドは簡潔に表現できるようになりましたし、中央描画用x座標およびy座標を取得するメソッドは再利用が可能になりました。
「一時変数のインライン化」に始まり、「説明用変数の導入」、今回の「問い合わせによる一時変数の置き換え」は、よく使われるリファクタリングなので必ず覚えておきましょう。
コメントはまだありません。