デリゲートをむずかしくしているのはコールバックだね - C#

イベントを理解するにはデリゲートも理解してないと話が進まない。
とは言っても、デリゲートは理解に苦しむことが一つある。
何がデリゲートを難解にしているのか、それは正しく「コールバック」。
勉強のためと自身でデリゲートのコールバックを使ったコードを書いても、忘れた頃に読み返すと「何がしたかったんだろうか?」と解読に苦しんだりする。まだ私が未熟ということもあるが、可読性という側面から見て、このコールバックこそが他者に理解しづらくさせる要因では?と思ってしまう。

とりあえず基本から

delegate int del1(int x);

static void Main(string[] args)
{
    del1 lambda = x => x * x;
    del1 deldel = delegate(int x) { return x * x; };
    del1 delMethod = Method1;

    Console.WriteLine(lambda(5));
    Console.WriteLine(deldel(5));
    Console.WriteLine(delMethod(5));
}

static int Method1(int n)
{
    return n * n;
}
3種類あるが書き方が違うだけでどれも同じ処理。
これだけなら恐らく、プログラム始めて3ヶ月程度の方でも理解できるのでは?というぐらいに分かりやすい。

これにコールバックを組み合わせる。
要するにメソッドを引数にするデリゲートメソッドを作るということ。
delegate int del1(int x);
delegate int delCallback1(int x, del1 callback);

static void Main(string[] args)
{
    del1 lambda = x => x * x;
    del1 deldel = delegate(int x) { return x * x; };
    del1 delMethod = Method1;

    delCallback1 dc = Method2;

    Console.WriteLine(dc(5, lambda));
    Console.WriteLine(dc(5, deldel));
    Console.WriteLine(dc(5, delMethod));
}

static int Method1(int n)
{
    return n * n;
}

static int Method2(int i, del1 callback)
{
    return callback(i);
}

Method2のメソッドが引数として受け取ったメソッド(関数)を利用して値を返している。
ただこれだけでは芸がないのでもうひと工夫入れてみる。

まずはコードから
delegate int del2(int x, int y);
delegate int delCallback2(del2 callback);

static void Main(string[] args)
{
    delCallback2 dc2 = Method3;

    Console.WriteLine(dc2((x, y) => x + y));
    Console.WriteLine(dc2((x, y) => x - y));
    Console.WriteLine(dc2((x, y) => x * y));
    Console.WriteLine(dc2((x, y) => x / y));
}

static int Method3(del2 callback)
{
    return callback(Method4(),Method5());
}

static int Method4()
{
    return 5;
}

static int Method5()
{
    return 5;
}
処理方法は処理元から、値はMethod4とMethod5の作り次第で変わるというもの。
書いた本人、次読み返した時にすぐに理解できるかな…

0 Comments:

Recent Posts