2016-09-29 6 views
2

こんにちは私はそのような状況があります。多くのサブクラスで使用されているクラスのデカップリング

enter image description here

私は自分のデザインでさまざまなアイテムを持っているし、すべてのこれらの項目は、文字上のいくつかの具体的な効果を持っています。各項目に適用関数があり、Characterオブジェクトを使用してその機能を変更することができます。しかし、私がCharacter関数を変更した場合、それに応じてすべてのItemクラスを変更する必要があります。

アイテムとキャラクターを効率的にデカップリングするにはどうすればよいですか?

私が使用しようとしている言語はC++であり、ItemクラスとCharacterクラス内の他の変数と関数は分かりません。私はそれらを切り離したい。

+0

OOPデザインでは、 'Character'はそれ自身に変更を適用します。ロジックを 'Item'に分離し、データを' Character'に分離するのは、OOPではなく_procedural programming_です。 – jaco0646

答えて

0

Characterが継承するインターフェイス(C++の抽象クラス)を導入することができます。それをItemUserとしましょう。 の代わりにItemUserというオブジェクトが入るように、Item#applyの署名が変更されます。今度は、ItemUser契約を尊重している限り、Characterの実装を自由に変更することができます。

0

デコレータのデザインパターンを確認すると、このデザインパターンがあなたが探しているものと思われます。リンク:Decorator design pattern

0

私があなたの質問を読んで理解していることは次のとおりです。それぞれにエフェクトが関連付けられた複数のアイテムクラスがあります。 Itemオブジェクトのタイプに対応するエフェクトは、Characterである別のエンティティに適用されます。今度は、Characterクラスに変更があるたびにItemクラスも変更する必要があり、これを避けるためのよりきれいな方法が必要になります。

変更を処理する良い方法は、あまり変更されない明確に定義された契約を定義することです。たとえば、2つの整数を追加する機能があり、後で2つの浮動小数点数を追加する必要があるような変更があり、後で追加操作を乗算に置き換える必要がある場合があります。そのような場合、抽象計算Compute(INum num1、INum num2)を定義することができます。戻り値の型はINumです。ここでは、INumは型の抽象であり、Computeは関数の振る舞いの抽象です。実際の実装では、INumとComputeが定義されています。今私たちのコードを使用しているコードは、抽象に依存しており、ユーザーコードに影響を与えることなく、操作と実際のタイプを自由に変更できます。

契約を実装する際に、契約を使用して外部コードに影響を与えずに内部実装を変更することができます。

抽象クラスICharacterを定義できます。将来型が変更される可能性のある属性については、テンプレートとジェネリックを使用するか、単に属性型のインタフェースを作成して、具体的な型にインタフェースを実装させることができます。すべてのフィールドをインタフェースで参照してください。 ICharacterは、Interfaces型のパラメータを持つパブリック抽象メソッドを定義し、Intercepts型も返すようにします。

アイテムクラスにICharacterを使用させるアイテムクラスごとに効果を適用する必要がある場合は、定義された定数抽象関数を使用してください。キャラクターの内部修正は、アイテムクラスに影響を与えずに変更できるようになりました。

関連する問題