はかせのラボ

私の頭の中を書いていく雑記ブログです

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();

}

実行結果です。
f:id:hakase0274:20181229232504p:plain

見ての通り結果はメソッドチェーンで
書こうと書かまいと同じです。

メソッドチェーンの利点

なぜ結果は変わらないのにメソッドチェーンで書くのか?
私は次の2つであると認識しています。
①記述量の削減
②処理の直感的理解を助ける

①は上のコードを見てもらえばわかると思います。
通常で書くと6行で書くものが
メソッドチェーンで書くと2行で済んでいます。

②も上のコードを見てもらえれば感じ取ってもらえるかもしれません。
通常で書くと同じような記述が続き、
目で追ったとき1行飛ばしてみてしまったり逆に1行戻ってしまったりと
パッと見で追いづらい印象を受けます。
(少なくとも私はそうです)

メソッドチェーンで書くとメソッド名だけが続くので
行の読み違いも起きにくいですし
メソッド名の順に処理が行われていくんだろうと
なんとなく予測が立てられます。

またメソッドチェーンは次のように書いても動きます。
(メソッドチェーンだけじゃないとおもうけど)

testMethodChain
		.Test1()
		.Test2()
		.Test3();

プログラムは書く時間より読む時間のほうが長いといいます。
実際私もそうだと思いますし、そうなっています。

なので読み手に負担をかけないコードを書くということも
とても大事です。

メソッドチェーンで書けば前述のように読み手の誤読等を
軽減することが出来ると思っています。
(もちろん記法に慣れているかというのも大事だと思います)

あとがき

今回はメソッドチェーンに挑戦でした。
やろうと思った理由なんですが、
私はUnity開発においてUniRxというアセットをよく使います。
これはRxという仕組みをUnity上で使えるように作られたアセットです。
UniRxはメソッドチェーンを使って記述されることが多いです。
なのでより慣れた使い勝手にしたく今回やってみた次第です。

ただ目的の機能はまだ実装できていません・・・orz
今rxcppというRxをC++向けにしたライブラリのコードを読んで
勉強しているのですが、イマイチよくわかりません・・・・
(どうしても無理そうならrxcppを使うことも検討中です)

それでは今回はこの辺でノシ