NEWS / BLOG
2016.03.02
リンゴ好きなので虫歯
#プログラマー

おはこんばんにゃープログラムがうまく書けないKNT(ハイスコアラーネーム)です。

去年末からルーティンって言葉がはやったようなのでコ・ルーチンの話をしたいと思います。

さてみなさん私はプログラムが下手なので上から下へ流れるプログラムが大好きです!例えばこんな感じなプログラムが好きなんですがどうでしょう?

Console.WriteLine("はじめの第一歩");
       for(var i = 0; i < 3; ++i) {
              Console.WriteLine("町民文化発展");
       }
Console.WriteLine("文化衰退");

 

分かりやすいでしょう!上から下へ流れが一目で分かりやすいプログラムだと思いませんか?がしかしある種の処理を書く時に...というかゲームの主だった処理を書く時に時分割でやらないとダメなことが大半で多くはこんな感じなプログラミングする事を求められます。

 

       public class リンゴ好きなので虫歯 {
 
              int Counter;
              Action 処理;
 
             
              public リンゴ好きなので虫歯() {
                     処理 = はじめの第一歩;
                     }
                    
              public bool 一寸だけ実行() {
                     処理();
                     return 処理 != null;
              }
 
              void はじめの第一歩() {
                     Console.WriteLine("はじめの第一歩");
                     処理 = 町民文化発展;
              }
 
              void 町民文化発展() {
                     Console.WriteLine("町民文化発展");
                     if (++Counter >= 3) {
                            処理 = 文化衰退;
                     }
              }
 
              void 文化衰退() {
                     Console.WriteLine("文化衰退");
                     処理 = null;
              }
       }
 
       public class 蜻蛉好きなので羽ちぎる {
 
              int Counter;
             
              enum ステートの種類 {
                     無,
                     はじめの第一歩,
                     町民文化発展,
                     文化衰退
              }
             
              ステートの種類 ステート;
             
              public 蜻蛉好きなので羽ちぎる() {
                     ステート = ステートの種類.はじめの第一歩;
              }
             
              public bool 一寸だけ実行() {
                     switch(ステート) {
                            case ステートの種類.はじめの第一歩:
                                   Console.WriteLine("はじめの第一歩");
                                   ステート = ステートの種類.町民文化発展;
                                   break;
                            case ステートの種類.町民文化発展:
                                   Console.WriteLine("町民文化発展");
                                   if (++Counter >= 3) {
                                          ステート = ステートの種類.文化衰退;
                                   }
                                   break;
                            case ステートの種類.文化衰退:
                                   Console.WriteLine("文化衰退");
                                   ステート = ステートの種類.無;
                                   break;
                     }
                     return ステート != ステートの種類.無;
              }
       }
      

2倍以上のコードになってて辛いです何と言いますかぶっといプログラムですな超辛いです21世紀なのにこんなことしないといけないなんて・なんて・なんてぇーーーー

プログラミングが下手なのでおっきくなるプログラムなんかメンテナンス出来ないよっ!はぁ・はぁ・はぁ...

大丈夫 C# にはコルーチンがあります!これをコルーチンで書き直してみましょう!

 

       public class 蜜柑好きなので逆剥け {
 
              public IEnumerator 一寸だけ実行() {
                     Console.WriteLine("はじめの第一歩");
                     yield return null;
                     for(var i = 0; i < 3; ++i) {
                            Console.WriteLine("町民文化発展");
                            yield return null;
                     }
                     Console.WriteLine("文化衰退");
                     yield return null;
              }
       }            
      

ふ・ふぁ・ふぁ・ふぁ・ふぁ・ふぁ・ふぁーーーーあら不思議上から下へと変わりましたよ!switch制御や関数置き換え制御が煩わしくなったらコルーチン化を検討してみるのもいいかもしれませんね。

 

さてゲームでは C/C++ の仕事がまだまだあるやん?コルーチンないやん?どうすんの?ってな人は以下を参考にどぞ (*1)

 

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4134.pdf

http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/overview/core/coroutine.html

http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/overview/core/spawn.html

https://github.com/contiki-os/contiki/blob/master/core/sys/lc-switch.h

      

xeen ではメインルーチン・サブルーチン・コルーチンを綺麗に書くことが大好きなプログラマを募集しています、気になった方はこちらの採用情報をチェックよろしくお願いします。

 

LLAP

 

(*1) C/C++ を捨ててる企業もありますな