fetus Diary
2008/07/04(金) - 名前が…
- 一般的なインタフェース「HogeBase」(という名の抽象クラス)を継承した「Hoge」を作って外部に公開していた。(外部に見せていたのは class HogeBase を定義したヘッダファイルと class Hoge を定義したヘッダファイル)
- class Hoge の private 領域があまりにもアレなので分離したくなった
- class HogeBase を継承した「HogeImpl」を作成して「Hoge」の実装を移動した
- class Hoge は仮想関数と「HogeImpl *」メンバ変数を一つだけもったクラスに変更した
- 新しい class Hoge の実装は「HogeImpl *」の同名関数へ委譲するだけとした(
bool Foo(int a) { return m_impl->Foo(a); }みたいな)
やること自体は大変ありがちで、実装をポインタ一つで隠蔽するってのも大変よくやるのだけど、基本的な実装「Hoge」に対して、その一般的インタフェース「HogeBase」、その実装「HogeImpl」って名前はどうにかならんもんか。
最初から 3 つにわけて設計していたら比較的綺麗な名前になるんだけどね…。「Hoge」「HogeImpl」を作ってから、「Hoge」と類似なクラス「Fuga」を作ることになって、「Fuga is-a Hoge」で無い場合には「Hoge」「Fuga」を一般化した基底クラスを作ることになるからついつい手抜きしちゃったりして…。
# 後々カオスになるのが経験上わかっているから名前ちゃんと考えればいいんだが。
そもそも「Hoge」「HogeImpl」ってのもどうなのよ、って気がしなくもない。でも、単純に実装の隠蔽のためにやった場合それ以外良い名前が無かったりするのよね。「Hoge *」とかをメンバーに持っているからといって実装が複数あり得て切り替えるわけじゃない場合もたくさんあるし。
- 08/07/05 1:23
コメント
コメントはありません。