C++ タスクシステム⑪ ~メソッドチェーンに挑戦~
あいさつ
どうも、はかせです。
今回はメソッドチェーンに挑戦してみたいと思います。
メソッドチェーンとは
メソッドを連鎖的に呼び出すことです。
class TestMethodChain { public: TestMethodChain() {}; TestMethodChain& Test1() { std::cout << "Test1" << std::endl; return *this; }; TestMethodChain& Test2() { std::cout << "Test2" << std::endl; return *this; }; TestMethodChain& Test3() { std::cout << "Test3" << std::endl; return *this; }; }; int main(int argc, char const* argv[]) { #if _DEBUG _CrtSetDbgFlag (_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF); #endif //インスタンス TestMethodChain testMethodChain; //ポインタ auto test = new TestMethodChain(); std::cout << "通常" << std::endl; //通常 testMethodChain.Test1(); testMethodChain.Test2(); testMethodChain.Test3(); test->Test1(); test->Test2(); test->Test3(); std::cout << "メソッドチェーン" << std::endl; //メソッドチェーン testMethodChain.Test1().Test2().Test3(); test->Test1().Test2().Test3(); getchar(); //解放 delete test; getchar(); }
実行結果です。
見ての通り結果はメソッドチェーンで
書こうと書かまいと同じです。
メソッドチェーンの利点
なぜ結果は変わらないのにメソッドチェーンで書くのか?
私は次の2つであると認識しています。
①記述量の削減
②処理の直感的理解を助ける
①は上のコードを見てもらえばわかると思います。
通常で書くと6行で書くものが
メソッドチェーンで書くと2行で済んでいます。
②も上のコードを見てもらえれば感じ取ってもらえるかもしれません。
通常で書くと同じような記述が続き、
目で追ったとき1行飛ばしてみてしまったり逆に1行戻ってしまったりと
パッと見で追いづらい印象を受けます。
(少なくとも私はそうです)
メソッドチェーンで書くとメソッド名だけが続くので
行の読み違いも起きにくいですし
メソッド名の順に処理が行われていくんだろうと
なんとなく予測が立てられます。
またメソッドチェーンは次のように書いても動きます。
(メソッドチェーンだけじゃないとおもうけど)
testMethodChain .Test1() .Test2() .Test3();
プログラムは書く時間より読む時間のほうが長いといいます。
実際私もそうだと思いますし、そうなっています。
なので読み手に負担をかけないコードを書くということも
とても大事です。
メソッドチェーンで書けば前述のように読み手の誤読等を
軽減することが出来ると思っています。
(もちろん記法に慣れているかというのも大事だと思います)
あとがき
今回はメソッドチェーンに挑戦でした。
やろうと思った理由なんですが、
私はUnity開発においてUniRxというアセットをよく使います。
これはRxという仕組みをUnity上で使えるように作られたアセットです。
UniRxはメソッドチェーンを使って記述されることが多いです。
なのでより慣れた使い勝手にしたく今回やってみた次第です。
ただ目的の機能はまだ実装できていません・・・orz
今rxcppというRxをC++向けにしたライブラリのコードを読んで
勉強しているのですが、イマイチよくわかりません・・・・
(どうしても無理そうならrxcppを使うことも検討中です)
それでは今回はこの辺でノシ