2013-02-12 29 views
8

Tôi đang tạo trình quản lý lỗi cho API mà tôi đang thực hiện. Ý tưởng là nó cung cấp một cửa hàng mã lỗi có thể được trả lại từ API, đảm bảo rằng cùng một lỗi trong các cuộc gọi khác nhau được xử lý theo cùng một cách (ví dụ: giá trị bắt buộc bị thiếu trong yêu cầu).Tránh các số ma thuật mà không tạo phụ thuộc

cách tiếp cận ban đầu của tôi là dọc theo dòng:

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

Tuy nhiên điều này tạo ra một sự phụ thuộc vào các lớp mã lỗi bất cứ nơi nào tôi muốn thiết lập một lỗi.

Cách khác là:

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

Nhưng bây giờ tôi đã có một số ngồi ở giữa mã của tôi có nghĩa là không có gì.

Trong khi tôi có thể nghĩ về các giải pháp cho vấn đề cụ thể này, sẽ có những tình huống khác mà tôi muốn sử dụng 'enum' và tôi không thể nghĩ ra giải pháp không kết hợp chặt chẽ các lớp.

Có cách nào tốt hơn để thực hiện điều này hay cách tiếp cận khác mà tôi có thể thực hiện để xóa số ma thuật? Hoặc là một cái gì đó khớp nối chặt chẽ tôi chỉ phải chấp nhận và xem xét trên cơ sở từng trường hợp?

+3

Tôi sẽ không thực sự gọi đây là "khớp nối", vì 'ErrorCodes' không có bất kỳ hành vi * nào *. Đó là thực hành tốt, và chắc chắn không xứng đáng với ý nghĩa tiêu cực của thuật ngữ. Bạn có thể nghĩ về nó như là "một thực thể hợp lý được thực hiện như hai lớp vật lý" chứ không phải là "hai thực thể hợp lý cùng nhau". – Jon

Trả lời

4

Đây là khớp nối mong muốn. Mặc dù có ý tưởng hay, để ứng dụng và trình quản lý lỗi của nó được ghép nối lỏng lẻo, không có lý do gì để tách ứng dụng và mã lỗi của ứng dụng, chúng thuộc về nhau.

Dependencies:

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

Tôi đang ở bên bạn ... +1 – hek2mgl

1

Bạn có thể xóa một số những rào cản với "Preprocessor" macro và một makefile. Các macro tiền xử lý được cung cấp bởi m4.

Giả sử bạn duy trì một tệp mã lỗi như thế này.

define(`ERR_REQUIRED_FIELD',`100')dnl 

Sau đó, bạn có thể viết mã PHP bằng lỗi "hằng số" bằng tiếng Anh.

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

Và bao gồm một dòng trong tệp makefile của bạn chạy hai tệp này qua m4. Có nhiều cách để quản lý điều đó. (Để ngắn gọn, tôi bỏ qua makefile, và chỉ cần chạy tập tin thử nghiệm của tôi qua m4.)

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

này giới thiệu một phụ thuộc; tất cả các tệp php sẽ phụ thuộc vào tệp mã lỗi. Nhưng đó là một sự phụ thuộc tầm thường dễ dàng được quản lý thông qua makefile. Trong thực tế, tôi có thể xây dựng một tập tin mã lỗi trông như thế này. . .

ERR_DISK_FULL 
ERR_REQUIRED_FIELD 
ERR_MISSING_ARG 

và sử dụng các tiện ích văn bản và make hoặc là

  • xây dựng các định nghĩa vĩ mô m4, hoặc
  • xây dựng các định nghĩa cho mô-đun ErrorCodes của bạn.

Giá trị số bằng số dòng; điều này đảm bảo bạn không bao giờ có mã lỗi trùng lặp.

Các vấn đề liên quan