2016-10-11 9 views
1

このオブジェクトの作成に関連するすべてのロジックを非表示にするために、オブジェクトから派生させるのは、この優れた/受け入れ可能なプラクティスです。コンポジションをカプセル化するために継承を使用する

たとえば(完全な例ではありませんが)私はSceneクラスを持っています。いくつかのエンティティ、いくつかのシステムで初期化したい、背景色を設定するなど。 私はFactoryを作成することができましたが、代わりに派生クラスのコンストラクタですべてを行うことを選択しました。これに代えて

var scene = new Scene(); 
scene.Systems (new ColisionSystem); 
scene.Systems (new MovementSystem); 
scene.SceneGraph = new MyCustomSceneGraph(); 

私はこれを行う:

class MyScene : Scene 
{ 
    void MyScene(SceneGraph sceneGraph) 
    { 
     this.Systems (new ColisionSystem); 
     this.Systems (new MovementSystem); 

     this.SceneGraph = sceneGraph; 
    } 
} 

var scene = new MyScene(new MyCustomSceneGraph()); 

は、だから私はコンストラクタですべてのこと作成のものを隠していると私はすべてのシーンのために別のファイルを得たボーナスとして、私が作成されます。 。

他の方法で。シーンエディタを作成した場合、これが問題になる可能性があります。その場合、シーンオブジェクトのクライアントはシーン自体ではなく、シーンを準備する責任がある必要があるためです。

これは受け入れられる練習ですか、それともSRPに違反していますか?

+3

私には非常に良い継承の使用のように見えません。なぜあなたのためにすべてを行う静的メソッドを作成していないのですか?私はここで継承を使うことに何の恩恵も見ません。あなたは何の振る舞いも特化していないし、状態を追加していないからです。 –

+0

一般的には、[継承上の合成](https://en.wikipedia.org/wiki/Composition_over_inheritance)を選択する必要があります。 – Steven

+1

@Steven OPのクラスの構造は、彼がすでに継承を超えた構成を好むことを示唆しています。彼の質問は継承を使用して構成を構成する妥当性についてのものだと私は考えています。 – dasblinkenlight

答えて

1

サブクラスごとのコンポジションアプローチの正確な問題を特定しました。コンパイル時にバインドされているため、実行時のコンポジションがずっと難しくなります。

さらに、コンポジションロジックをサブクラスコンストラクタにハードコーディングすると、ロジックが変更されるたびに再コンパイルする必要があります。ただし、変更されるのはシステム内のランタイムインスタンスグラフだけです。

オブジェクトを作成せずに接続を記述するクラスを追加し、その記述を取得するコンストラクタを追加して完全なSceneオブジェクトに処理することで、オブジェクトを実行時に作成するという要件に対処することができます。

これを抽象化しないようにするには、設定ファイルを人間が判読できる形式(たとえば、

{"Systems":["ColisionSystem", "MovementSystem"], "SceneGraph":"MyCustomSceneGraph"} 

、あなたがこのデータにアクセスすることができますインターフェース:

interface SceneConfiguration { 
    IList<String> Systems {get;} 
    String SceneGraph {get;} 
    ... // More configuration items 
} 

今、この表現からSceneConfigurationのインスタンスを生成し、パーサー、およびその引数としてSceneConfigurationを取るSceneのコンストラクタを考えてみます。

public Scene(SceneConfiguration config) 

この構成では、構成ファイルを使用して構成を「ソフトコード」することができます。このアプローチはシーンエディタでもうまくいきます。シーンエディタはSceneConfigurationのインスタンスを作成し、Sceneはそれ自体の作成を制御します。