3

私はたまたまOOの概念について考えていますが、それは非常に些細なことのように聞こえるかもしれませんが、なぜそれが非常に混乱しているのかわかりません。

とにかく、たとえば、AnimalクラスとLocationクラスがあるかどうかを考えています。そして、私はいつでも1匹の動物だけが1つの場所にいることを許可します。つまり、1対1の関係のようなものです。同時に、AnimalクラスとLocationクラスは、ゆるく結合された状態に保たれるように、ある種の双方向参照を必要としないことを望みます。私がこれを持っていると言うなら:

class Animal {
   private Location loc;

   public Animal(int x, int y) {
      loc = new Location(x,y);
   }

   public static newAnimal(Location[][] map, int x, int y) {
      if(map[x][y] != null) {
         return new Animal(x, y);
      } else return null;
}

class Location extends Point {
   public Location(int x, int y) {
      super(x, y);
   }
}

public static void main(String[] args) {
   //populates a map
   Location[][] map = new Location[10][10];
   for(int x=0; x<10; x++) {
      for(int y=0; y<10; y++) {
         map[x][y] = new Location(x, y);
      }
   }

   Animal dog = new Animal(2, 4);    //dog is at location 2,4
   Animal cat = new Animal(5, 6);    //cat is at location 5,6

   //But this does not restrict a constraint requirement that there should only be one animal at any one point
   Animal horse = new Animal(2, 4);    //now, horse is at the same location as dog but we only wanted one location to have one animal

   Animal rabbit = Animal.newAnimal(map, 20, 50);    //rabbit is null because it is out of the map size
}

このことから、2つの問題が予想されます。

まず、私の場所では動物がすでにそこにいるかどうかわからないため、多くの動物がすべてマップ配列上の同じ場所を指している可能性があります。これは、私が望んでいた1-1の多重度制約に違反します。私の場合、私は動物に場所を所有させました。これが、これが発生する理由である可能性があります。場所に動物を所有させると言うと、これは解決できます。しかし、私の動物がどこにいるかを知りたい場合は、私の動物の場所の1つがどこにあるかを見つけるために、マップ全体をループする必要がありますか?または、双方向の参照を保持することもできますが、これによりクラスが高度に結合されます。

私が問題になる可能性があると感じる2番目の問題は、Animalクラスのデザインです。新しい動物をインスタンス化するための静的なnewAnimal()メソッドがあります。呼び出し元がコンストラクターから直接新しいAnimalインスタンスを作成できるようにすると、範囲外の座標入力が可能になると考えたため、このようにしました。しかし、私はまだデザインが非常に厄介だと感じています。

私の例ではJavaコードを使用しています。そして、私はクラスオブジェクト自体の設計を考えており、データベースはまだ含まれていません。

私が提起した2つの問題を改善するための提案は素晴らしいかもしれません。ありがとう!

4

4 に答える 4

2
1.Location/Map in our case is a real world object and has boundaries.
2.Map can not hold more than one animal at any pont
3.An animal can not occupy more than one location

上記は問題に関連する事実です。

場所はマトリックスと見なすことができます。2次元配列。当面は、1匹の動物が正確に1つのユニット(1つのセル)のみを保持し、特定の時点でそれより少なくも多くも持たないと仮定します。

この2D配列は動物(動物オブジェクトのみを含むことができます)であり、封じ込めは実際のものであり、2つが同じスペースを占めることはできません。占有するには、既存の1つを置き換える必要があります。

また、動物の場所のプロパティを更新する必要があります。

または、LocationManagerClassを記述して、動物の占有率を地図上に保存および管理することもできます。しかし、それが「宇宙占有」の現実のシナリオに近い場合、それはさらに評価されるべきです。

于 2011-06-03T11:58:37.017 に答える
1

関係を管理/維持する別のインターフェイスとクラスがあり、新しい動物を追加したり、動物を他の場所に移動したりするメソッドがあります。このようにして、事前/事後条件を簡単に確認および維持できます。また、動物と場所を不変に保ちます(このコンテキストでは)。インターフェイスとクラスがあると、マップ、DB、ファイルなどの関係のさまざまな実装が簡単になります。

于 2011-06-03T04:55:15.707 に答える
0

Animal クラスに Location を含める理由は何ですか?

別の方法として、Animal クラスに Animal プロパティのみを含めることもできます。場所クラスはそのままで結構です。Map という名前の 3 番目のクラスを用意します。これは、場所 (マップ内) と各場所に存在する動物を管理します。

このための C++ コードは次のようになります。

class Animal
{
    public:

            Animal(char *name);
            ~Animal();

            char *getName();
    private:

            char *name;

};

// ここでは Location クラスを使用していません。代わりに x,y を使用しています。その小さな変化を起こすことができます。

class Map
{

    private:

        Animal *animalLocation[10][10];


    public:
        //Note this function will check if any Animal exists at the specified (x,y). 
        void addAnimal(int x, int y, void *animal);
        void* getAnimal(int x, int y);

        Map();
        ~Map();

};

于 2011-06-04T11:45:40.643 に答える
0

前の回答のようなものを使用できますが、2D 配列の代わりに別のデータ構造を使用できます。スパース配列、順序付きリスト、ハッシュ テーブルなど。これにより、ルックアップは高速になりますが、動物の挿入や移動は遅くなります。また、どの場所でも動物を 1 頭以下にするという要件を引き続き適用できます。

于 2011-06-04T15:41:52.400 に答える