Как мне работать с коллекциями объектов? Или, скорее, объект получает коллекцию похожих объектов? - PullRequest
3 голосов
/ 09 августа 2009

Я думаю, что я понимаю парадигму ООП на ее базовом уровне, но мне трудно осмыслить правильный способ поиска записей в базе данных. Я подозреваю, что это потому, что я не получаю ООП так сильно, как я думаю ...

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

<?php
    class Product
    {
        public $id = 0;
        public $name = '';
        public $price = 0;

        function __construct($id)
        {
            // if $id exists try to retrieve
            // a product with $id
            // else create a new product
            // and set $this->id
        }
    }

    $product = new Product();
    echo $product->name;
?>

Достаточно просто. Но теперь я хочу найти несколько продуктов (для страницы результатов поиска) и не знаю, как с этим справиться.

Я склонен писать другой класс, который принимает некоторые данные и выполняет SQL-запрос, который просто возвращает список идентификаторов продуктов. Затем я бы просмотрел эти результаты и создал бы объект продукта для каждого из них. Затем я мог бы перебрать массив объектов и построить свою страницу с результатами поиска.

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

Что правильно делать? Возможно, что-то еще?

Ответы [ 4 ]

2 голосов
/ 09 августа 2009

Отображение из базы данных в объектно-ориентированное приложение не тривиально. Есть разные способы решения этой проблемы, но простая стратегия состоит в том, чтобы иметь класс сущности (Product) и класс шлюза (их можно назвать разными вещами, но обычно это ProductGateway или ProductFinder). Класс шлюза имеет доступ к базе данных и знает , как извлекать и инициализировать сущности. Этот же класс также знает, как отобразить объект обратно в базу данных.

Например:

class ProductGateway {
  function getProductById($id) {
    $result = $this->db->query("select * from products where id = ?", $id);
    return new Product($result->next());
  }
  function save($product) {
    if ($product->getId()) {
      return $this->update($product);
    } else {
      return $this->insert($product);
    }
  }
  ...
}

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

2 голосов
/ 09 августа 2009

Напишите класс продукта, который не знает о базе данных (трудно поверить, но продукты могут существовать без базы данных;)) и класс, который может создавать объекты продукта из результата базы данных.

0 голосов
/ 09 августа 2009

Не отказывайтесь от использования уже существующих платформ для работы с базами данных в ООП. Zend_Db имеет разные методы использования, в частности, метод Table Gateway / Row Gateway, который описан выше. TableGateway предназначен для выполнения запросов и возврата строк. Строки представляют одну строку и могут управляться независимо.

Если вы выполняете запрос для многих строк, отдельный класс, который представляет таблицу (или даже «виртуальную» таблицу в случае какого-либо сложного соединения), является наиболее чистым способом сохранить проблемы этой таблицы и отдельного пользователя. отдельные строки.

0 голосов
/ 09 августа 2009

Я думаю, что вы думаете о правильных строках - одна вещь, хотя, зачем возвращать только идентификаторы, возвращать массив (или список) соответствующих продуктов.

Как насчет ProductFinder, который имеет методы запросов, параметры которых являются определениями продуктов, а тип возврата - это набор продуктов.

Затем вы можете увидеть, что ProductFinder также может взять на себя ответственность за создание продуктов (вставку в БД), удаление продуктов и т. Д. Следовательно, сам продукт мало или совсем ничего не знает о БД. Тогда ProductFinder может получить немного другое имя, например ProductKeeper или ProductHome.

Если у вас есть несколько сущностей в дополнение к продуктам, вы можете обнаружить, что их "хранители" имеют очень много общего кода, и вскоре вы в конечном итоге получите постоянную среду. Кажется, что есть хотя бы один уже для php, я предлагаю вам взглянуть на него.

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