拡張メソッドを使ってみる

拡張メソッドを使ってみたかったので、ちょっと遊んでみます。


以前、LINQを利用して、読みやすいコードを書くサンプルとして以下のようなコードを提示していました。

    class 在庫計
    {
        public int 数量計 { get; set; }
        public int 金額計 { get; set; }
    }

    public class サンプル
    {
    
        public void サンプルメソッド(在庫[] 在庫リスト)
        {
            Func<在庫, bool> 集計対象 = 在庫情報 =>
            {
                if (在庫情報.数量 <= 10)
                {
                    return false;
                }
                if (在庫情報.数量 % 1000 != 0)
                {
                    return false;
                }
                return true;
            };

	   var 在庫計情報 = 集計(在庫リスト,集計対象);
            System.Windows.Forms.MessageBox.Show(string.Format("数量計 = {0},金額計 = {1} ", 在庫計情報.数量計, 在庫計情報.金額計));
        }

		private 在庫計 集計(在庫[] 在庫リスト,Func<在庫,bool> 集計対象)
		{
			在庫計 在庫計情報 = new 在庫計();

            在庫計情報.数量計 = 在庫リスト
                        .Where(集計対象)
                        .Sum(x => x.数量);

            在庫計情報.金額計 = 在庫リスト
                        .Where(集計対象)
                        .Sum(x => x.金額);

			return 在庫計情報;
		}

    }


集計メソッドで在庫リストにある数量と金額の合計を作成するわけですが、集計メソッドに在庫リストと抽出条件を引数で渡しているだけなので、特に在庫リストに結びついた処理であるといった情報はありません。
そこで拡張メソッドを利用したサンプルを書いてみます。


    class 在庫計
    {
        public int 数量計 { get; set; }
        public int 金額計 { get; set; }
    }

    class サンプル
    {
        public void サンプルメソッド(在庫[] 在庫リスト)
        {


            Func<在庫, Boolean> 抽出条件 = 在庫情報 =>
            {
                if (在庫情報.数量 <= 10)
                {
                    return false;
                }
                if (在庫情報.数量 % 1000 != 0)
                {
                    return false;
                }
                return true;
            };

            var 在庫計情報 = 在庫リスト.集計(抽出条件);
            System.Windows.Forms.MessageBox.Show(string.Format("数量計 = {0},金額計 = {1} ", 在庫計情報.数量計, 在庫計情報.金額計));
            
        }

    }

    static class 在庫処理拡張サンプル
    {
        public static 在庫計 集計(this 在庫[] 在庫リスト, Func<在庫, Boolean> 抽出条件)
        {

            在庫計 在庫計情報 = new 在庫計();

            var result = from 在庫情報 in 在庫リスト
                    where 抽出条件(在庫情報)
                    select 在庫情報;

            在庫計情報.数量計 = result.Sum(x => x.数量);
            在庫計情報.金額計 = result.Sum(x => x.金額);

            return 在庫計情報;
        }

    }

この例の場合、在庫リスト.集計とコーディングできるため、「在庫リストの集計」と読むことができて、より文脈に沿ったコードを書くことができるようになりました。

まぁ、在庫リストなんて在庫の配列があるかといえば、だいたいにおいて在庫テーブルにアクセスするクラスがあって、そこに集計メソッドがあれば済む話なので拡張メソッドを利用する事は無いし、あまり多用するものでもないのですが、今回の例みたいに


「特定の配列に処理を追加したい。」


なんてときには便利かもしれません。