1

どのクラスが特定の情報を保持する必要があるかについてのガイダンスが欲しいです。「宇宙物体」内を動き回る「移動物体」がある場合、その移動物体は宇宙物体内のどこにあるか、どれだけ速く動いているか、どの方向に移動しているかを本当に気にしますか?

「場所」のモバイル オブジェクトにプロパティを割り当てると確かに便利に思えますが、実際には気にする必要はないと思います。だから私は思いついた:

class Mobile
    {        
        //some properties/fields/etc

        event EventHandler<MovementEventArgs> move;

        public void Move(Vector direction)
        {
            raiseMove(direction);
        }

        private raiseMove(Vector direction)
        {
            EventHandler<MovementEventArgs> handler = move;
            if (move != null)
                handler(this, New MovementEventArgs(direction));
        }
    }

class Space
    {
        Mobile someObject;
        Vector someObjectLocation;

        public Space()
        {
            someObject = new someObject();
            someObject.Move += HandleMobileMove;
        }

        public void MoveSomeObject(Vector direction)
        {
            someObject.Move(new Vector(1,0));
        }

        private void HandleMobileMove(object sender, MovementEventArgs e)
        {
            someObjectLocation += e.Direction;
        }
    }

少し性急に書いてしまいましたが…私の言いたいことが伝わってれば幸いです。要約すると、モバイルは場所を保持する必要がありますか、それともスペースを保持する必要がありますか? 誰が動きを制御する必要がありますか?

4

3 に答える 3

1

純粋に OOP の用語で考えると、空間を移動するときの位置と速度が私のプロパティであるのと同じように、これらは確かにモバイル オブジェクトのプロパティである必要があると主張します。スペース オブジェクトが境界チェックのためにこれらのプロパティにアクセスする必要がある場合は、モバイル インスタンスのパブリック get メソッドからそれらを取得できます。

于 2012-06-12T23:27:23.337 に答える
1

someObject.Move += HandleMobileMove;あなたの議論は論理的ですが、実装の無駄について考えてみてください ( someObjectLocation +=): 基本的に、thisポインターを無駄にしています。あなたMobileは確かにそれと1:1の関係を持っておりLocationSpaceクラスには1:Mの関係があるとMobile思います(空間にオブジェクトが1つしかない場合を除きます)。あなたのデザインでは、 to の関連付けを維持する必要があります。Spaceこれは面倒です。特に代替手段は単にあなたの要素を作成することであるためです。MobileLocationLocationMobile

于 2012-06-12T23:40:40.660 に答える
1

WPF では、Canvas オブジェクトがその子の位置を知る責任があります。それはあなたのアプローチに信憑性を与えるでしょう(これは添付プロパティと同様の構造を使用します)。

Space オブジェクトに保存されている場所が気に入らない場合は、Decoratorパターンを使用して追加情報を Mobile オブジェクトに添付することもできます。これにより、オブジェクト自体を気にせずに、オブジェクトを配置するかどうかを選択できます。

子のコレクションを取得するとき、(おそらく OfType 拡張メソッドを使用して) ロケーション デコレータを使用するオブジェクトのみを除外し、必要なことを行うことができます。ハード クラス参照ではなく、インターフェイスを使用するように変換する必要があります。それはそれで良いことなのだろうけど。

ただし、最終的には、Space オブジェクトと Mobile オブジェクトが何をしているかによって異なります。Space オブジェクトが Mobile オブジェクト (Canvas など) を表示している場合、位置情報を知る必要がありますが、Mobile は知りません。一方、モバイル自体が位置情報を使用して何かを追跡したり、何らかのタスクを実行したりする場合 (スペース オブジェクトは気にせず、おそらく境界を提供するだけなど)、その情報を彼ら。

この点をもう少し理解するために、次の質問を自問してください。場所を変更した場合、誰が気にしますか? コントロールは WPF であり、通常、その上座標と左座標の影響を受けませんが、コンテナー コントロールは影響を受けるため、その情報をコンテナーに格納することは理にかなっています。モバイルの場所を変更した場合、モバイルやその機能に影響はありますか? モバイル X が Y から Z に移動すると、スペースの動作が異なりますか?

于 2012-06-12T18:19:36.320 に答える