2013-02-12 3 views
8

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

Мой первоначальный подход вдоль линий:

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

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

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

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

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

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

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

+3

Я бы не назвал эту «связь», так как «ErrorCodes» не имеет никакого поведения *. Это хорошая практика, и определенно не заслуживает негативного коннотации термина. Возможно, вам стоит подумать об этом как о «одном логическом объекте, реализованном как два физических класса», а не как о «соединении двух логических сущностей». – Jon

ответ

4

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

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

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

Я с тобой ... +1 – hek2mgl

1

Вы можете очистить некоторые этих препятствий с "препроцессор" макросов и Makefile. Макросы препроцессора получают любезность m4.

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

define(`ERR_REQUIRED_FIELD',`100')dnl 

Тогда вы можете написать свой PHP-код с английской ошибкой «constant».

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

И включите строку в ваш файл, который запускает эти два файла через m4. Существует несколько способов справиться с этим. (Для краткости я опускаю сборочный файл, а просто работает мой тестовый файл через 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.

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

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