2013年10月21日 星期一

第一次互毆就上手 Swap Between Both

有時候 我們會遇到互毆的需求

像是我們要讓 A 跟 B 互毆

印出

AAA hit BBB!!!

BBB hit AAA!!!





這麼簡單一片蛋糕都不到的難度

            Member memberA = new Member { ID = 1, Name = "AAA" };

            Member memberB = new Member { ID = 2, Name = "BBB" };

            Debug.WriteLine(string.Format("{0} hit {1}!!!", memberA.Name, memberB.Name));


            Debug.WriteLine(string.Format("{0} hit {1}!!!", memberB.Name, memberA.Name));




但是別忘了 需求有時候是 會長大的幸福

重複代碼不說 有時候遇到邏輯有點兇殘的時候

Wo Ta Ma 的有時候忘了 現在到底誰是誰? 誰是攻誰是受? 誰又要對誰做什麼





此時我們冷靜的來瞧瞧有啥蛛絲馬跡

1.兩個人(物件)要做同一件事 例如 都是要打人

2.唯一的差異是 立場不同 A要打B B要打A

3.先後順序不是很重要 但是兩個人要確實都賞對方一拳





原先的代碼有什麼缺點?

1.相似內容重複代碼

2.不夠直覺 邏輯複雜時難以釐清兩者關係





若是有一個方法可以使用 我們希望他長什麼樣子?

1.泛型是基本 畢竟要什麼都吃

2.同樣的動作 我只想做一遍

3.其實當下我只在乎 哪個主動 哪個被動 骨子裡誰是誰 誰又是誰 我 TMD 一點也不在乎





綜合以上結論這個方法大概就長這樣

        public void Main()
        {
            Member memberA = new Member { ID = 1, Name = "AAA" };

            Member memberB = new Member { ID = 2, Name = "BBB" };

            SwapBetweenBoth<Member>(
                (from, to) =>
                {
                    Debug.WriteLine(string.Format("{0} hit {1}!!!", from.Name, to.Name));
                },
                memberA,
                memberB
            );
        }

        public void SwapBetweenBoth<T>(Action<T, T> action, T one, T another)
        {
            T[] array = { one, another };
            for (int i = 0; i < 2; i++)
            {
                T from = array[i];

                T to = array[(i + 1) % 2];

                action(from, to);
            }

        }




或許有人會問 這樣真的有比較好嗎?

但是至少自我感覺良好呀 哈哈哈