Должен ли я использовать один класс или более? - PullRequest
1 голос
/ 24 февраля 2011

В моем веб-приложении PHP я хочу иметь возможность выполнять следующие операции регистрации:

  1. Запись записи базы данных в таблицу error_log.
  2. Запись записи базы данных в таблицу 'history_log'.
  3. Записывать все запросы в консоль Firebug через FirePHP.
  4. Записывайте любые произвольные данные в консоль Firebug, используя FirePHP.

Я пытаюсь выбрать лучшую архитектуру. Я имею в виду два. Какой из них лучше? Я открыт и для других.

Дизайн # 1

  • абстрактный класс Logger
    • класс FirebugConsoleLogger
      • журнал (строка)
    • класс DatabaseLogger
      • деЫпзЬапс ()
      • logError (logTypeId, affiliateId, detailsArray)
      • logHistory (logTypeId, affiliateId, detailsArray)

Дизайн # 2

  • Класс Logger
  • деЫпзЬапс ()
  • logToFirebugConsole (строка)
  • logHistory (строка)

РЕДАКТИРОВАТЬ Вот что я, вероятно, пойду с.

  • класс FirebugConsoleLogger
    • public getInstance ()
    • открытый журнал (строка)
  • абстрактный класс Logger
    • абстрактный публичный журнал (typeId, affiliateId, подробности)
    • класс ErrorLogger
      • public getInstance ()
      • публичный журнал (typeId, affiliateId, подробности)
    • класс HistoryLogger
      • public getInstance ()
      • публичный журнал (typeId, affiliateId, подробности)

1 Ответ

2 голосов
/ 24 февраля 2011

Я бы не использовал ни того, ни другого. Я бы использовал дизайн, который реализует один и тот же метод журнала для каждой реализации. Так что это выглядит как Дизайн № 1, но немного по-другому.

  • абстрактный класс Logger
    • журнал (строка)

Создайте потомков для каждого типа журнала и переопределите метод журнала.

Затем создайте фабрику для определенных целей, так:

  • класс QueryLoggerFactory
    • getInstance () // Возвращает экземпляр FireBugConsoleLogger
  • класс ErrorLoggerFactory
    • getInstance () // Возвращает экземпляр регистратора базы данных
  • класс HistoryLoggerFactory
    • getInstance () // Возвращает тот же или другой экземпляр регистратора базы данных

Таким образом, когда вам нужно зарегистрировать запрос, просто позвоните

QueryLoggerFactory->getInstance()->log($query);

И нигде в вашем приложении вам не нужно вызывать определенный метод. Если вы решите, что хотите сохранить запрос и в базе данных, просто создайте другой регистратор на своей фабрике. Вы можете даже создать регистратор, который регистрирует себя для двух других регистраторов, так что вы можете хранить ошибки в FireBug и в базе данных. Или вы можете создать журнал void, который ничего не регистрирует.

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