Как избежать магических чисел без создания зависимостей

Я создаю менеджер ошибок для API, над которым я работаю. Идея состоит в том, что он предоставляет единое хранилище кодов ошибок, которые могут быть возвращены из API, обеспечивая одинаковую обработку одной и той же ошибки в разных вызовах (например, в запросе отсутствует требуемое значение).

Мой первоначальный подход был следующим:

$this->_errorManager->setError(ErrorCodes::REQUIRED_FIELD);

Однако это создает зависимость от класса кодов ошибок везде, где я хочу установить ошибку.

Альтернатива:

$this->_errorManager->setError(100);

Но теперь у меня в середине кода сидит число, которое ничего не значит.

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

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

2 ответа

Решение

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

зависимости:

+-----------------------+
|Application error codes|<------------+
+-----------------------+             |
           ^                          |
           |                          |
+----------+----------+               |
|Application component|               |
+----------+----------+               |
           |                          |
           v                          |
+-----------------------+     +-------+-----+
|Error handler interface|<|---+Error handler|
+-----------------------+     +-------------+

Вы можете устранить некоторые из этих препятствий с помощью макросов "препроцессор" и make-файла. Макросы препроцессора предоставлены m4.

Предположим, вы поддерживаете файл с кодами ошибок, как этот.

   define(`ERR_REQUIRED_FIELD',`100')dnl

Затем вы можете написать свой код PHP с английской ошибкой "константа".

$this->_errorManager->setError(ERR_REQUIRED_FIELD);

И включите в ваш make-файл строку, которая запускает эти два файла через m4. Есть несколько способов справиться с этим. (Для краткости я опускаю make-файл и просто запускаю свой тестовый файл через m4.)

$ m4 test.php.m4 > test.php
$ cat test.php
$this->_errorManager->setError(100);

Это вводит зависимость; все файлы php зависят от файла кодов ошибок. Но это тривиальная зависимость, которой легко управлять через make-файл. На практике я бы, вероятно, создал файл с кодами ошибок, который выглядит следующим образом.,,

ERR_DISK_FULL
ERR_REQUIRED_FIELD
ERR_MISSING_ARG

и использовать текстовые утилиты и make либо

  • построить определения макроса m4, или
  • постройте определения для вашего модуля ErrorCodes.

Числовые значения равны номерам строк; это гарантирует, что у вас никогда не будет повторяющегося кода ошибки.

Другие вопросы по тегам