C++ でプログラミングしていて思ったことがある。 例えばあるオブジェクトの大小関係を定義しようとした場合のこと。 その性質はどこに記述されるべきだろう。 大まかにみっつのパターンに分けられると思う。
- そのオブジェクトが属するクラス
- オブジェクトが格納される集合 (コンテナ)
- 大小関係を必要とする手続き (アルゴリズム)
まず、クラスそのものに記述する場合というのは比較演算子のオーバーロードによる場合のことだ。 比較方法が一種類しかない場合はこれで問題ないだろう。
集合に記述する場合というのは STL の map や set のテンプレート引数で比較オブジェクトを渡す場合等のこと。 格納するオブジェクトに大小関係が定義されていない場合や、独自の定義を与えたい場合にはこれを使う必要がある。
手続きに記述する場合というのは sort メソッドに比較オブジェクトを渡す場合等のこと。 vector や list といったオブジェクトの大小関係とは無関係に格納するコンテナを使っている場合にはこの方法を利用することになる。
以上のように、大小関係というひとつの性質であっても、異なる層で定義することがあるわけだ。 クラス関係の設計時にはその性質が意味的に何に属するものなのかよく考えてみようと思った。
Document ID: 15df73f374ea4f0d4b21643952b294a6