2011-07-28 10 views
3

私はすべて単一のインタフェースを実装する小さなC++クラスのセットを設計しています。インターフェイスをIHandlerとしましょう。 1つの方法しかありません。データメンバを保持するためだけに親クラスを導入する必要がありますか?

Googleのドメイン内の各タイプごとに1つのハンドラがあります。 FooHandlerBarHandlerなどとしましょう。PassiveHandlerもありますが、これは何もしません(これは、処理する必要のないドメインオブジェクトに使用されます)。

だから、私たちの階層が素晴らしく、このようなフラットになります:

IHandler 
|-PassiveHandler 
|-FooHandler 
|-BarHandler 
| (...) 
|-BazHandler 

しかし、すべてのハンドラはのはdomainObjectそれを呼びましょう、データメンバを必要とするので、私はちょうどこれを保持している共通のスーパークラスHandlerを抽出について考えましたオブジェクト。

PassiveHandler以外のすべてのハンドラは、2番目のデータメンバーが必要です。それをinfoObjectとしましょう。このオブジェクトを保持する別の共通スーパークラスActiveHandlerを抽出することを考えました。今度は階層構造の見直しが進んでいますが、重複を取り除いています。

IHandler 
|-Handler 
| |-PassiveHandler 
| |-ActiveHandler 
| |-FooHandler 
| |-BarHandler 
| | (...) 
| |-BazHandler 

あなたはdomainObjectメンバ宣言は、すべてのクラスで重複しているの浅い設計、一緒に行く、そして最もにおけるinfoObjectメンバ宣言しませんか?または、重複が削除されるより複雑な階層を好むでしょうか?これらのデータメンバーのためだけに価値がありますか?

+0

(+1) "PassiveHandler"(ヌルオブジェクト/ヌルメソッドデザインパターン)を追加する場合、時には "0"が多くを意味します... – umlcat

答えて

3

私は2番目のより階層的なソリューションを選択したいと思います。データメンバーだけでなく、あなたの発言のために:「これは、処理する必要のないドメインオブジェクトに使用されます。このようなサウンドはナルハンドラのようなもので、何もしません。アクティブなハンドラにしか適用されない他の機能も導入する可能性が高いので、ツリーから取り除くのは良いことです。

1

純粋なインタフェースではなく、抽象クラスを基本型として使用することはどうですか?このようにして、共通の祖先を持ち、すべての基本クラスに共通するdomainObjectを持つことができます。

私の経験では、開発のトレンチで使用すると純粋なOOを達成することはできません。完璧ではないソリューションが必ずあるはずですが、継承階層を単純化するこのようなケースは、いつルールを適用するかの良い例です。

0

さて、あなたhierachyの合計で4層は非常に深いではありません; D

しかし他の可能な解決策として:あなたはおそらくActiveHandlerとPassiveHandlerのための2つのテンプレートクラスを作ることができ、両方のみIHandlerからハンドラメソッドを継承し、保持するデータを保持するためにテンプレートパラメータを使用します。

私はかつてこのようなものにする必要があったし、最終的に私はそのようなハンドラの配列をどこかに持っていたので非常に強力でした。だから、同じ場所にインスタンス化されていて、テンプレート引数として使う新しいヘルパークラスを作成することで、既存のもののバリエーションである新しいハンドラを追加するのはとてもエレガントでした。

+0

残念ながら、ハンドラーメソッドはドメインオブジェクトの種類ごとに異なるロジックを持つ – knatten

関連する問題