2013-02-12 18 views
8

Tworzę menedżera błędów dla interfejsu API, nad którym pracuję. Chodzi o to, że zapewnia on pojedynczy zbiór kodów błędów, które można zwrócić z interfejsu API, zapewniając, że ten sam błąd w różnych połączeniach jest obsługiwany w ten sam sposób (np. Wymagana wartość brakuje w żądaniu).Unikanie magicznych liczb bez tworzenia zależności

Moje pierwsze podejście było wzdłuż linii:

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

Jednak to stwarza zależność od klasy kodów błędów gdziekolwiek chcę ustawić błąd.

Alternatywą jest:

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

Ale teraz mam kilka siedzi w środku mojego kodu, który nic nie znaczy.

Chociaż mogę myśleć o rozwiązaniach do tego konkretnego problemu nie będzie innych sytuacjach, gdzie będę chciał użyć „” enum i nie mogę wymyślić rozwiązanie, które nie robi ciasno kilka klas.

Czy jest lepszy sposób na zrobienie tego lub inne podejście, które mogę podjąć, aby usunąć magiczne liczby? Czy jest to ścisłe połączenie, które muszę zaakceptować i rozważyć indywidualnie dla każdego przypadku?

+3

Nie nazwałbym tego "sprzężeniem", ponieważ "ErrorCodes" nie ma żadnego * zachowania *. To dobra praktyka i zdecydowanie nie zasługuje na negatywne konotacje tego terminu. Możesz pomyśleć o tym, że jest to "jedna jednostka logiczna zaimplementowana jako dwie klasy fizyczne", a nie "dwie logiczne jednostki połączone ze sobą". – Jon

Odpowiedz

4

To pożądane połączenie. Chociaż jest to dobry pomysł, aby aplikacja i jej menedżer błędów były luźno powiązane, nie ma powodu, aby oddzielać aplikację od jej kodów błędów, ponieważ są one ze sobą powiązane: należą do siebie:.

zależności:

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

Jestem z tobą ... +1 – hek2mgl

1

można wyczyścić trochę tych przeszkód z "preprocesor" makr i makefile. Makra preprocesora są dostępne dzięki uprzejmości m4.

Załóżmy, że przechowujesz plik kodów błędów w ten sposób.

define(`ERR_REQUIRED_FIELD',`100')dnl 

Następnie możesz napisać swój kod PHP z angielskim błędem "stała".

I dołącz linię do pliku makefile, która uruchamia te dwa pliki przez m4. Istnieje więcej niż jeden sposób na zarządzanie tym. (Dla zwięzłości, mam pomijając makefile, i tak działa mój plik testowy przez m4).

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

ten ma przedstawić zależność; pliki php będą zależeć od pliku kodów błędów. Ale jest to trywialna zależność, którą można łatwo zarządzać za pomocą pliku makefile. W praktyce prawdopodobnie utworzę plik kodów błędów, który wygląda tak. . .

ERR_DISK_FULL 
ERR_REQUIRED_FIELD 
ERR_MISSING_ARG 

i używać narzędzi tekstowych i make albo

  • budować M4 definicji makr lub
  • zbudować definicje dla modułu ErrorCodes.

Wartości numeryczne są równe numerom linii; to gwarantuje, że nigdy nie będziesz mieć duplikatu kodu błędu.

Powiązane problemy