ООП дизайн: как включить обработку БД в объекты приложения - PullRequest
5 голосов
/ 19 февраля 2010

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

На этапе проектирования легко решить, что вам нужен объект:

User
==========
Unique ID
Login name
Password
Full name

И его легко преобразовать в объект базы данных:

CREATE TABLE user (
    user_id INT NOT NULL PRIMARY KEY,
    username VARCHAR(15) NOT NULL UNIQUE,
    password_hash CHAR(32) NOT NULL,
    full_name VARCHAR(50)
);

Мои сомнения начинаются на уровне PHP.Очевидное преобразование:

<?php
class User{
    public $user_id, $username, $full_name;
}
?>

Однако, как мне заполнить фактические значения?

Я могу сохранить класс DB-agnostic:

<?php
class User{
    public $user_id, $username, $full_name;
    public function __construct($user_id, $username, $full_name){
        $this->user_id = $user_id;
        $this->username = $username;
        $this->full_name = $full_name;
    }
}
?>

Нотогда мне нужно выполнить запрос где-то еще ...

Я могу инкапсулировать его внутри конструктора класса:

<?php
class User{
    public $user_id, $username, $full_name;
    public function __construct($user_id){
        $sql = 'SELECT username, full_name FROM user WHERE user_id=?';
        $parameters = array($user_id);
        $res = get_row_from_db($sql, $parameters);

        $this->user_id = $user_id;
        $this->username = $res['username'];
        $this->full_name = $res['username'];
    }
}
?>

Это выглядит элегантно, но мешает мне делать много вещей скласс:

  • Проверка пользователя по имени пользователя и паролю ($ user_id пока не известен)
  • Печать информации о пользователях из сообщений форума (я не могу позволить 100 запросов, чтобы показать 100 пользователей))

Скорее всего, мне нужно определить несколько классов, но я не уверен, как это организовать.Один базовый класс и много дочерних классов?Самостоятельные занятия?Один класс с конкретными методами?Возможно, это хорошо известный шаблон проектирования, но меня учили процедурному программированию.

Буду также признателен за некоторые идеи о:

  • Обработка набора пользователей
  • Хранение информации в сеансе, поэтому к БД не нужно запрашивать каждый запрос страницы

==== ДЛЯ ЗАПИСЕЙ ====

IЯ пометил ответ Гордона как ответ, потому что он интересен.Как бы то ни было, стоит отметить, что я обнаружил очень иллюстративный фрагмент кода в одном из комментариев пользователя на странице Сериализация объектов в руководстве по PHP, который можно обобщить следующим образом:

  • Используется один класс.
  • Экземпляр представляет определенного пользователя.
  • Конструктор снабжается сведениями о пользователе.
  • Класс предоставляет статические методы для требуемой функциональности.прежде чем иметь возможность иметь экземпляр, например, выборку пользователя из БД по ИД или имени.
  • Пользовательские экземпляры могут быть сериализованы как данные сеанса.

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

Ответы [ 3 ]

7 голосов
/ 19 февраля 2010

Это зависит от вашей архитектуры. Четыре общих архитектурных шаблона источника данных можно найти в Мартине Фаулере шаблонах архитектуры корпоративных приложений :

  • Шлюз табличных данных

    Объект, который действует как шлюз к таблице базы данных. Один экземпляр обрабатывает все строки в таблице.

  • Шлюз данных строк

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

  • Активная запись

    Объект, который упаковывает строку в таблицу или представление базы данных, инкапсулирует доступ к базе данных и добавляет логику домена к этим данным.

  • Data Mapper

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

Дальнейшие паттерны:

2 голосов
/ 19 февраля 2010

Рассматривали ли вы использование библиотеки реляционных объектов, например Doctrine или Propel ?

0 голосов
/ 19 февраля 2010

Быстрый старт Zend Framework имеет довольно простой для понимания обзор моделей и картографов (термины Google), а также некоторый исходный код .

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