パラメータへの代入の除去

引数に対して代入している個所があったら、代わりに一時変数を使用します。
 
たとえば「四角を描画する」メソッドが以下のように定義されていたとします。
 
        // 四角を描画します
        private void DrawRectangle(int x, int y, int width, int height)
        {
            // x座標が0より小さい場合
            if (x < 0)
            {
                x = 0;
            }

            // y座標が0より小さい場合
            if (y < 0)
            {
                y = 0;
            }

            ・・・
        }
 
どうやらx座標とy座標には0以上の値を指定しなければならないようで、0より小さい値が指定された場合に0へ補正する処理が入っています。
 
しかし0を「パラメータへ直接代入」している個所が問題です。
 
上級プログラマーがパラメータの「値渡し」と「参照渡し」を適切に切り分け、可読性を考慮して行っている場合もありますが、たいていは「面倒くさい」という理由で行われたバグの源です。
 
後の修正でこのようなコードに出会った場合、プログラマーは「値渡し」か「参照渡し」かを確認し、自分が行う修正が呼び出し元まで波及するかまで調べなければなりません。
 
これではプログラマーがどんなに優秀でも保守性が向上しませんので、「パラメータへの代入の除去」のリファクタリングを行いましょう。
 
この例だと三項演算子を使うとキレイにまとめられそうです。
 
        // 四角を描画します
        private void DrawRectangle(int x, int y, int width, int height)
        {
            // x座標を補正
            int correctX = (x < 0) ? 0 : x;

            // y座標を補正
            int correctY = (y < 0) ? 0 : y;

            ・・・
        }
 
ここで重要なことは三項演算子を使ったことではなく、「値を補正するため、一時変数を使用した」ことですので、お間違いのないようよろしくお願いします。

g h T
 3,014 Total Views

ADVERTISING

駅チカ!ホテル検索
全国の駅や目的地近くの宿泊施設を検索し予約することができます。最寄駅沿線からもホテルを検索できるので、アクセスのよいホテルを予約することが可能です。
  1. コメントはまだありません。

  1. トラックバックはまだありません。