2011-02-07 3 views
0

Я немного много о том, что делать в ОО/DB отношения ...единой ссылки на несколько объектов

Вот модель DB:

CREATE TABLE User 
    Id 

CREATE TABLE Location 
    userId 
    // EDIT oups, wrong ! 
    // placeId 
    // Should be : 
    seatId 

CREATE TABLE Game 
    locationId 

Теперь некоторый код:

class User 
{ 
    private Location locations[]; // need this for several reasons... 

    public function loadFromDatabase() 
    { 
     // Load data from DB 
     // ... 
     result = DB::query("SELECT Id FROM Locations WHERE userId="+this->Id); 
     foreach(result) 
     { 
      l = new Location(); 
      l->loadFromDatabase(result); 
      locations[] = l; 
     } 
    }  
} 

class Location 
{ 
    private User user; 
    public function loadFromDatabase() 
    { 
     ... 
    } 
} 

class Game 
{ 
    private Location location; 
    public loadFromDatabase() 
    { 
     /* 
     Here comes the problem : 
     how to have a reference to a location 
     created by the User class ? 
     */ 
    } 
} 

A Пользователь игры Игры в нескольких местах. EDIT: И для каждого местоположения пользователь играет на сиденье. Или на другом месте ... Когда я хочу знать, где игра была сыграна, я обращаюсь к Game.location. И когда я хочу узнать, кто играл в нее, я получаю доступ к Game.location.user

Вот моя проблема: я хочу, чтобы Game.location была той же ссылкой на одну из User.locations, и я не знаю, как для этого ... И, во всем мире, я чувствую, что что-то не так в моем коде ...

Любая помощь? Благодаря

ответ

1

Поскольку у вас есть в вашем Location столе placeId, я полагаю, есть Place таблицы, которая описывает то, что места на самом деле, в то время как Location таблица представляет собой просто многие-ко-многим между пользователями и местами.

В этом случае Location не обязательно должен иметь Id и не должен быть классом, но Place.

Чтобы загрузить только один экземпляр каждого объекта из базы данных, кешируйте экземпляры в статической карте внутри каждого класса.

class Place 
{ 
    // Static 
    private static Place loadedPlaces[]; 

    public static function get(id) 
    { 
     if (!loadedPlaces[id]) 
     { 
      loadedPlaces[id] = new Place(id); 
      loadedPlaces[id]->loadFromDatabase(); 
     } 
     return loadedPlaces[id]; 
    } 

    // Non-static 
    private id; 

    public function loadFromDatabase() 
    { 
     // ... 
    } 
} 

Затем, чтобы получить ссылки на сайты о свойствах пользователя или игры, вы просто обращаетесь к ним через статический метод.

class User 
{ 
    public function loadFromDatabase() 
    { 
     result = DB::query("SELECT placeId FROM Locations WHERE userId="+this->Id); 
     foreach(result) 
     { 
      places[] = Place::get(result); 
     } 
    }  
} 

class Game 
{ 
    public function loadFromDatabase() 
    { 
     place = Place::get(place); 
    } 
} 

Это использует:

  • Lazy initialization, потому что места загружаются только тогда, когда они необходимы.
  • Multiton pattern, потому что есть только один экземпляр каждого места по id.
  • Не совсем factory method, потому что нет иерархии объектов.
+1

Благодарим вас за ответ. Ты дал мне то, что мне нужно. Я не дал никаких подробностей, и я неправильно писал имена классов. Вместо placeId, вы должны прочитать seatId. Пользователь может играть в игру в месте на одном зарезервированном месте и играть в том же месте на другом зарезервированном месте. Но то, что вы рассказали о статической карте, именно то, что мне нужно: таким образом я могу сохранить уникальные экземпляры. Кстати, есть ли какой-либо шаблон дизайна в соответствии с этим способом? – Antoine

+0

Добавлены некоторые ссылки. Что касается отношения к игре/местоположению, это звучит так, как будто это один к одному, поэтому, возможно, нет необходимости разделять их. Вместо этого у вас может быть таблица с параметрами 'game_id',' user_id' и 'place_number', чтобы связать игры с пользователями и их номерами мест и иметь массив (фиксированный размер?) В объекте' Game', связывающем пользователей. – aaz

+0

Спасибо за ссылки, это именно то, что мне нужно.В большинстве случаев у меня есть решения для моих проблем, но я никогда не уверен, что они «хорошо закодированы». Вот почему я люблю писать код на основе шаблонов дизайна. И ваши объяснения + ссылки выполняют эту работу! – Antoine

Смежные вопросы