NEWS / BLOG
2016.05.11
エクステンション・メソッド やん!
#プログラマー

おはこんばんニャー、プログラムが上手く書けないKNT(ハイスコアラーネーム)です。

自分的にコルーチン理解したつもりでいたんでコルーチンだとある種のプログラムが書きやすくなることを紹介しましたんですよぅ。

まあ覚えたからにゃ使わな損って事で処理をアレコレ書いているうちに

なんだかコレ面倒じゃね?

とか思い始めて

あっ!コレ!ゼンゼンイケてない!

ってなことがあったんですぅ、そんな話を紹介したいと思います。

どういう事かと言いますとぉ!

  • 在る処理を受け持つクラスがありましてね
  • 処理は並列実行出来ないので待ちリストに積む
  • 順番回ってきたら積まれた処理をする

ってな物があったとします。これを誰でも分かりやすい話に例えて言います

きゅう連続体*1
ねきすとじぇねれーしょん
ぼいじゃー中で
指パチン

する出来事を表現したいわけなんです、で・こんな感じでプログラミングしたわけですよ。

class App {

    public class きゅう連続体 : IEnumerator {
        
        public void Reset() {
            throw new NotImplementedException("300年間幽閉じゃ");
        }

        public object Current { get; private set; }
        
        public bool MoveNext() {
            while (指ぱっちん.Count > 0) {
                if (指ぱっちん[0].MoveNext()) {
                    Current = 指ぱっちん[0].Current;
                    return true;
                }
                指ぱっちん.RemoveAt(0);
            }
            return false;
        }
        
        public IEnumerator GetEnumerator() {
            return this;
        }
        
        public きゅう連続体 Concat(IEnumerator frontier) {
            指ぱっちん.Add(frontier);
            return this;
        }
        
        public List<IEnumerator> 指ぱっちん = new List<IEnumerator>();
    }

    static IEnumerator ねきすとじぇねれーしょん() {
        for(var i = 0; i < 3; ++i ) {
            Console.WriteLine("じゃんと遭遇 " + i);
            yield return null;
        }
    }
    
    static IEnumerator ぼいじゃー() {
        for(var i = 0; i < 3; ++i ) {
            Console.WriteLine("きゃすりんと遭遇 " + i);
            yield return null;
        }
    }
    
    public static void Main() {
        var 指ぱっちん = new きゅう連続体().Concat(ねきすとじぇねれーしょん()).Concat(ぼいじゃー());
        while(指ぱっちん.MoveNext());
    }
}

コルーチン覚えて上記のようなプログラムを書いたわけなんですね、 処理待ちのコルーチンの数が分かるし、そんな悪くない気もしますがいちいちクラス作ってそこに入れてって流れが回りくどいなーと思ったんです。

お腹が空いている時にぼけーと考えてたんです。

ゲーム屋なんでコスプレ社員とかゴスロリ社員とか女装社員とかいるですやん*2

でね

髪の毛まきまき面倒そう

いやいやあれエクステだし面倒ちゃうし

やっぱ面倒やん

エクステなら面倒じゃないやん

やっぱ面倒やん

エクステなら面倒じゃないやん

いやいや面倒やん

エクステは面倒じゃないやん

ん?

エクステンション・メソッド やん!

はぅ!

ってことでエクステンションメソッドってのがあるのに気が付きました

でどうしたかというと

public static class ExtensionMethod {
    public static IEnumerator Concat(this IEnumerator @this, IEnumerator follow){
        while(@this.MoveNext()) yield return @this.Current;
        while(follow.MoveNext()) yield return follow.Current;       
    }
}

class App {

    static IEnumerator きゅう連続体() {
        yield break;
    }
    
    static IEnumerator ねきすとじぇねれーしょん() {
        for(var i = 0; i < 3; ++i ) {
            Console.WriteLine("じゃんと遭遇 " + i);
            yield return null;
        }
    }
    
    static IEnumerator ぼいじゃー() {
        for(var i = 0; i < 3; ++i ) {
            Console.WriteLine("きゃすりんと遭遇 " + i);
            yield return null;
        }
    }
    public static void Main() {
        var 指ぱっちん = きゅう連続体().Concat(ねきすとじぇねれーしょん()).Concat(ぼいじゃー());
        while(指ぱっちん.MoveNext());
    }
}

前より上手く書けたような気がしたんですがどうでしょうか? こんな感じでいいじゃんと考え変わったわけなんですが、アルファ宇宙域で一か月位の話なんですがデルタ宇宙域では時すでにお寿司*3技術的負債を完成させたわけです。

xeen ではエクステンションメソッドを上手く使ったり技術的負債を出来るだけ作らず出来るだけ良いプログラミングしたいと思っている*4プログラマを募集しています気になった方は此方をご覧ください~

LLAP

ps ある人がちゃこてぃに似てるような気がして記事を書いたのは内緒である (ボクとろいのカウンセリング受けたほうがいいかも)


*1 : きゅう連続体 は何もかも超越しているので細かい事は気にスンナ
*2 : (編集注:筆者にだけ見えていると思われます)
*3 : 食べたい
*4 : まあ手段なので優先順位は低いかも