Дизайн отношений объекта - PullRequest
3 голосов
/ 03 июня 2011

Мне просто приходится задумываться о концепции ОО, которая может звучать довольно тривиально, но я не знаю, почему я нахожу ее довольно запутанной.

В любом случае, я думаю, например, есть ли у меня класс Animal и класс Location. И я позволяю только одному животному находиться в одном месте в любое время. Так что это похоже на отношения 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, которое я хотел. В моем случае я позволил Животному владеть Местом. это может быть причиной, почему это могло произойти. Если, скажем, я позволю Месту владеть Животным, это можно решить. Но в случае, если я хочу знать, где находится мое Животное, мне нужно пройтись по всей карте, чтобы просто найти местоположение одного из моих Животных? В качестве альтернативы, я могу сохранить двунаправленную ссылку, но это приведет к сильной связи классов.

Вторая проблема, которую я чувствую, может быть проблемой - это дизайн в классе Animal. У меня есть статический метод newAnimal () для создания экземпляров новых животных. Я сделал это таким образом, потому что думал, что разрешение вызывающей стороне создавать новый экземпляр Animal непосредственно из конструктора может разрешить ввод координат вне диапазона. Но я все еще нахожу дизайн очень неловким.

Я использую коды Java в моем примере. И я думаю, что дизайн внутри объектов класса сам по себе и еще не связан с базой данных.

Любые предложения по улучшению двух вопросов, которые я поднял, могут быть великолепными. Спасибо!

Ответы [ 4 ]

2 голосов
/ 03 июня 2011
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-D массив. В настоящее время мы предполагаем, что одно животное содержит только одну единицу (одну клетку) точно, но не меньше и не больше, чем в данный момент времени.

Этот 2D массив состоит из животных (который может содержать только объекты животных), тогда защитная оболочка является реальной, никакие два не могут занимать одно и то же пространство - она ​​должна заменить существующую, чтобы занять.

Кроме того, свойство местоположения животного должно быть обновлено.

Кроме того, A LocationManagerClass может быть записан для хранения и управления заполнением животных на карте. Но это следует оценивать дальше, если оно близко к реальному сценарию «космического занятия»

1 голос
/ 03 июня 2011

У меня был бы отдельный интерфейс + класс, который управляет / поддерживает отношения, и имел бы методы для добавления нового животного или перемещения животного в другое место.Таким образом, вы можете легко проверить и поддерживать ваши предварительные / последующие условия.Также я бы оставил Animal и Location неизменными (в этом контексте).Наличие интерфейса и класса облегчит выполнение различных реализаций отношений: Карта, БД, файл и т. Д.

0 голосов
/ 04 июня 2011

Вы можете использовать что-то вроде предыдущих ответов, но с другой структурой данных вместо двумерного массива. Например, разреженный массив, упорядоченный список или хеш-таблица. Это обеспечит более быстрый поиск, но более медленную вставку или движение животных. И он по-прежнему может требовать не более 1 животного в любом месте.

0 голосов
/ 04 июня 2011

Почему вы хотите, чтобы класс Animal содержал Location?

Альтернативой было бы иметь только свойства Animal в классе Animal. Класс местоположения в порядке, как это. Есть третий класс под названием Карта, который будет управлять Местами (на карте) и Животным, присутствующим в каждой локации.

Код 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();

};

...