かってにコードいじって自己満足に浸る(3)

手元に下記のようなメソッドがある。
身バレ防止でだいぶ簡略にしてあるが実物はもっと改装が深くて条件が複雑である

        public bool Judge(int p)
        {
            if (p == 4 || p == 7 || p == 13)
                return false;

            return true;
        }

別に動作には問題ないのだが機能追加でthis.value<40の場合には(p == 4 || p == 7 || p == 13)ではなく(p == 3 || p == 9)にする必要がある。

さて、どう改修したものか?

素直に書くと

        public bool Judge(int p)
        {
            if (this.value1 < 40)
            {
                if (p == 3 || p == 9)
                    return false;
            }
            else
            {
                if (p == 4 || p == 7 || p == 13)
                    return false;
            }
            return true;
        }

だが、if文が二手に分かれるのがいやなので動作を変えないように注意深く変更していく。

1 まずは比較対象を配列におさめる

            int[] v; //配列
            if (this.value1 < 40)
            {
                v = new int[] { 3, 9 };//配列
                if (p == 3 || p == 9)
                    return false;
            }
            else
            {
                v = new int[] { 4, 7, 13 };//配列
                if (p == 4 || p == 7 || p == 13)
                    return false;
            }
            return true;

2 条件判定部分をv.Contain(p)に置き換える

            int[] v;
            if (this.value1 < 40)
            {
                v = new int[] { 3, 9 };
                if (v.Contains(p)) //置き換えた
                    return false;
            }
            else
            {
                v = new int[] { 4, 7, 13 };
                if (v.Contains(p)) //置き換えた
                    return false;
            }
            return true;

3 if{}の中身およびelse{}の中身で共通する末端部分をくくりだす

            int[] v;
            if (this.value1 < 40)
            {
                v = new int[] { 3, 9 };
            }
            else
            {
                v = new int[] { 4, 7, 13 };
            }
            if (v.Contains(p)) //くくりだされました
                return false;
            return true;

4 vを設定している箇所をメソッドの抽出

        public bool Judge(int p)
        {
            int[] v = NewMethod1(); //抽出

            if (v.Contains(p))
                return false;
            return true;
        }

        private int[] NewMethod1() //抽出されました
        {
            int[] v;
            if (this.value1 < 40)
            {
                v = new int[] { 3, 9 };
            }
            else
            {
                v = new int[] { 4, 7, 13 };
            }

            return v;
        }

5 return部分がうっとうしいのでついでに書き換える
6 vをインライン化して消去

        public bool Judge(int p)
        {
            return !NewMethod1().Contains(p);
        }

        private int[] NewMethod1()
        {
            int[] v;
            if (this.value1 < 40)
            {
                v = new int[] { 3, 9 };
            }
            else
            {
                v = new int[] { 4, 7, 13 };
            }

            return v;
        }