Entry

プログラミングメモ - NPI について少し

2011年12月19日

大した話じゃないんだけれども,NPI(Named Parameter Idiom)について少し。NPI というのは,クラスの振る舞いを決定するパラメタにメンバ変数を使って,setter/getter で制御しようとゆイディオムです。普通は,関数の引数で挙動を決めることもあるけれど,メンバ変数を使うとゆわけ。もっとも,こゆのは Command パターンやファンクタなんかを使うときは,大体そんな感じの設計になるわけで,改めて名前をつける必要もないくらい,みんながやってることなんですが。

で,そのイディオムの中で,setter で自分自身の参照を返すイディオムがあります。こんな感じにする。

class some_object {
public:
  some_object& x(int x) {
    x_ = x;
    return *this;
  }
  some_object& y(int y) {
    y_ = y;
    return *this;
  }
  void execute() {
    // some executions...
  }
private:
  int x_;
  int y_;
};

こうすると何が便利かというと,次のように値をセットできるんですね。

some_object obj;
obj.x(12).y(249).execute();

たしか,boost::program_options もこんな作りだったと思うけれども,要するに戻りを使っていくらでも引数を設定することができて,最後に実行することができる,と。洒落た方法なので,やりたがる人も多いかもしれない。性能的には,通常の setter(戻りが void の関数)と大して違いはないので,単純にセマンティックスの問題です。

もっとも,この方法を採る積極的な理由はあまりないわけで,ま,通常 void 型を戻りにしている setter だったら,折角なので自分を戻してみるか,くらいの理由しかないんだと思う。同様に,この手法を否定する積極的な理由もあまりないわけで,強いて言うなら,setter が例外を投げる時,通常のコードベースでステップ実行するデバッガでは,どこで例外が投げられたか見つけにくい,とゆもんがありそうな感じ。これも,機械語ベースでステップ実行すればいいだけなので,大したディスアドバンテージでもないんだけれども。

個人的には,こゆセマンティックスになったからといって特段便利になった感じもしないので,使うことはないだろうな,とは思う。setter で自分を戻すことが,関数それ自体の「意味」として成り立っているのか微妙なところだし。純粋に好みの問題だとは思うけど。

ま,ただそれだけ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN