blog.fuktommy.com

キーワード引数の代わりとしての関数はアリか否か

流れるようなインターフェイス - 予定は未定Blog版 から、部分文字列を作る疑似コード?

"hogepiyofoobar".Substr().From(2).To(5);

なんか素直じゃない気がするんですよね。 これ、言語仕様が許すのであればキーワード引数を使って

"hogepiyofoobar".substr(from=2, to=5);

と書いた方が素直だと思う。 JavaとかPHPはキーワード引数がないからこんなになっちゃう (元記事はC#なんだけど、C#は知らない)。 PHPだと連想配列を使って、

"hogepiyofoobar".substr(array('from' => 2, 'to' => 5));

みたいなスタイルも可能ではあるのだろうけど、これはこれでもやもやする。

流れるようなインターフェイス、 あるいは単なるメソッドチェインでもいいんだけど、 "hoge".substr().from(2).to(5) みたいな書き方をすると、from()関数、to()関数に適切な機能が分割できて、 それぞれの関数がすっきりして、 使う側からも読みやすくなるというのが幸せなのだろうとは思う。

依存性の逆転原則を生かしてコーディングすると、 オブジェクトに、それが依存するオブジェクトをいろいろ設定しなければならなくて、 コンストラクタの引数で渡せればいいのだけど、

$hoge = new Hoge(logger = $logger, pdo = $pdo, memcache = $memcache);

のようにキーワード引数が使えないから、

$hoge = Hoge::factory()
      ->withLogger($logger)
      ->withPdo($pdo)
      ->withMemcache($memcache);

こんな風に書いてたりする。 妥協の産物ではあるんだけど、 with*() 関数がそれなりにすっきりするので、そんなに嫌いではない。

キーワード引数がもっといろんな言語で使えたらいいんだけどなあ。

Copyright© 1998-2014 Fuktommy. All Rights Reserved.
webmaster@fuktommy.com (Legal Notices)