2

Actorsに関連付けられているものは作成しませんWorld。次の2つのコードフラグメントのいずれかを使用することを考えています。これらのどれがより良いデザインと考えられていますか?つまり、ソースコードのメンテナにとって読みやすく、コードを読んでいるだけの人にとって読みやすく、将来の調整に対してより柔軟になります。

同様の質問がすでに出されている場合は申し訳ありませんが、このような概念がOOPでどのように呼ばれているのかはよくわかりません。

オプションA:

// declaration:
class World {
    public:
        RegisterActor(Actor* a);
};

class Actor {
    public:
        Actor(World& w) {
            w.RegisterActor(this);
        }
        foo();
};

// usage:
World myWorld;
Actor myActor(myWorld);
myActor.foo();

オプションB:

// delcaration:
class Actor;

class World {
    public:
        Actor& CreateActor();
}

class Actor {
    friend class World;
    public:
        foo();
    private:
        Actor();
};

// usage:
World myWorld;
Actor& myActor = myWorld.CreateActor();
myActor.foo();
4

5 に答える 5

3

いつものように、完全な使用状況なしで見分けるのは難しいですが、評価するべきいくつかの賛否両論が確かにあります:

最初のケースでは

  • ワールドはクラスに対してプログラムされていますが、インターフェイスまたはコントラクトActorに対して機能するように簡単に切り離すことができます。あなたのコードは今あるので、あなたは'sサブクラスを渡すことができ、世界は決して知りません。これには、世界とそのアクター間の結合を低くするという利点があります。Actor
  • あなたは、俳優を作成する責任を世界から世界のクライアントに移しています。Worldこれは、クラスがSRPを達成するのに役立ち、単体テストの実行(たとえば、モックオブジェクトのパス)を容易にし、クライアントにとってより柔軟になります。一方、これにより、クライアントでアクターインスタンスを作成(および最終的には構成)する作業が移動します。

2番目のケースでは、最初のケースとは逆の長所と短所があります。世界はアクターと緊密に結合されているため、構成とテストが難しくなりますが、クライアントはアクターを作成するプロセスについてあまり知らないようにする必要があります。

検討できる代替案は、ビルダー(作成プロセスがWorld複雑な場合)またはファクトリ(異なるサブクラスを作成するための異なる構成がある場合)の使用です。Worldこれは、作成の複雑さをクライアントから活用しながら、クラスをアクターから切り離しておくのに役立ちます。

HTH

于 2012-12-03T16:37:24.343 に答える
1

アクターは常に正確に1つの世界にのみ属し、常に同じ世界に属しますか?オプションBは状況に最も適しています。Actorコンストラクターの可視性を制限し、ファクトリメソッドを使用してインスタンスを構築します。これにより、コードのクライアントへのコミットメントが少なくなり、Actorの実装を変更する柔軟性が高まります。また、ドメインのセマンティクスにも非常によく適合します。ワールドを使用してアクターを作成します。

ただし、アクターがワールドを変更したり、同時に複数のワールドに登録したりする可能性がある場合は、オプションAに向かっています。

それはすべて、参照がどのように終わる必要があるかに依存します。

于 2012-12-03T16:41:09.283 に答える
0

どのクラスに責任を含めるべきかわからない場合は、 General Responsibility Assignment Software Patterns(GRASP)に基づいて決定することをお勧めします。

于 2012-12-03T16:28:54.250 に答える
0
  • 最初に考えたのは、ファクトリパターンです。オブジェクトの作成が複雑な場合、このジョブを処理する別のクラスが定義されます。

  • 2番目:作成が簡単な場合は、単純なコンストラクターである可能性があります。次に、メソッドを呼び出して、そのプロパティの1つを設定します。

  • 3番目:おそらくWorldであるAggregateオブジェクトが存在する場合、あなたは彼にあなたのためにアクターを作成するように頼むことができます、それはあなたのドメインに依存します。

于 2012-12-03T16:36:30.707 に答える
0

私が実際に2つで見ている唯一の違いは、Bでは、俳優が世界と結びついていることです。それはAの世界に結び付けられていません。俳優が世界の文脈の外に存在する必要がある場合、または俳優が複数の世界に存在できる場合、私はAに投票します。

将来の拡張性の観点から、アクターの基本クラスをインターフェースに変更することを検討することをお勧めします。そうすれば、誰もがベースから継承することなく、独自のアクタークラスを追加できるようになります。

于 2012-12-03T16:40:59.113 に答える