2010-03-24 18 views
5

Tôi đang làm việc trên một ứng dụng web php dựa trên lớp học. Tôi có một số nơi mà các đối tượng đang tương tác và tôi có một số tình huống nhất định khi tôi sử dụng mã lỗi để giao tiếp với người dùng cuối - thường khi giá trị biểu mẫu bị thiếu hoặc không hợp lệ. Đây là những tình huống mà các trường hợp ngoại lệ không được bảo đảm (và tôi không chắc chắn rằng tôi có thể tránh được các tình huống có ngoại lệ). Trong một đối tượng, tôi có một số 20 mã số, mỗi mã tương ứng với một tin nhắn hướng đến người dùng và một thông báo quản trị/nhà phát triển, vì vậy cả hai bên đều biết điều gì đang diễn ra. Bây giờ tôi đã làm việc trên mã nhiều lần, tôi thấy rằng rất khó để nhanh chóng tìm ra những con số mã trong chuỗi tôi đã sử dụng, vì vậy tôi vô tình tạo ra các mã số xung đột. Ví dụ: tôi đã làm điều đó ngay hôm nay với 12, 13, 14 và 15.systematizing mã lỗi cho một ứng dụng web trong php?

Làm cách nào để tổ chức tốt hơn điều này để tôi không tạo mã lỗi xung đột? Tôi có nên tạo một lớp đơn, errorCodes, có danh sách tổng thể tất cả các mã lỗi cho tất cả các lớp, hệ thống hóa chúng trên toàn bộ ứng dụng web không? Hoặc mỗi đối tượng sẽ có bộ mã lỗi riêng của mình, khi thích hợp và tôi chỉ giữ một danh sách trong phần bình luận của đối tượng, để sử dụng và cập nhật nó khi tôi đi cùng?


Chỉnh sửa: Vì vậy, tôi thích các đề xuất để sử dụng các hằng số hoặc các hằng số được đặt tên trong lớp. Điều đó mang lại cho tôi một nơi duy nhất mà tôi lập trình xác định và theo dõi các mã lỗi và thông điệp của họ.

Câu hỏi tiếp theo: Tôi cung cấp loại giao diện nào cho thế giới bên ngoài cho mã lỗi và thông báo của lớp học này? Tôi có làm điều gì đó như triggerError(20) trong lớp và sau đó cung cấp phương thức công khai để trả lại mã lỗi, chuỗi không đổi và thông báo phải đối mặt với người dùng và quản trị viên không?

Trả lời

7

Bạn có thể tạo một vài defines để tạo tên hằng cho tất cả các mã lỗi của bạn:

define('ERROR_CODE_SQL_QUERY', 1); 
define('ERROR_CODE_PAGE_NOT_FOUND', 2); 
define('ERROR_CODE_NOT_ALLOWED', 3); 
// and so on 

Và, sau đó, sử dụng các hằng số trong mã của bạn:

if ($errorCode == ERROR_CODE_SQL_QUERY) { 
    // deal with SQL errors 
} 


Với điều đó, không nơi nào trong mã của bạn, bạn sẽ sử dụng giá trị số: ở mọi nơi (ngoại trừ trong tệp trên và chỉ nơi bạn đặt define s), bạn sẽ sử dụng mã.

Nó có nghĩa là:

  • Ít nguy cơ sai sót, như tất cả các giá trị số được thiết lập chỉ trong một tập tin
  • Ít nguy cơ sai sót, như bạn sẽ sử dụng các hằng số, có một tên mà chỉ ý nghĩa của nó là gì
  • Và mã dễ đọc hơn.


ý tưởng khác có thể là để tạo ra một lớp học để đối phó với các lỗi:

class Error { 
    const CODE_SQL_QUERY = 1; 
    const CODE_PAGE_NOT_FOUND = 2; 
    const CODE_NOT_ALLOWED = 3; 

    // Add some methods here, if needed 
} 

Và, sau đó, sử dụng một cái gì đó như thế này:

if ($errorCode == Error::CODE_SQL_QUERY) { 
    // deal with SQL errors 
} 


Đó là một trong tốt nhất?

Đây có thể là vấn đề tùy chọn cá nhân ... Nếu bạn cần thêm một số phương pháp để xử lý lỗi, sử dụng lớp học có thể hữu ích. Khác, định nghĩa là một giải pháp tuyệt vời quá.

+0

Đó là một ý tưởng tuyệt vời. Tôi thích mã hóa cứng các số có * một số * loại thông báo chuỗi cho biết ý nghĩa của chúng. Vì vậy, bước tiếp theo: làm thế nào để cung cấp một giao diện cho thế giới bên ngoài cho các lỗi? Một đối tượng sử dụng đối tượng được kích hoạt lỗi có nhận được chuỗi, mã lỗi hay không? – user151841

+0

@ user151841: Dường như với tôi như bạn có thể làm bất cứ điều gì bạn muốn với một mã lỗi nhất định. Cá nhân, tôi sẽ sử dụng ngoại lệ cho điều này nhưng điều đó dường như nằm ngoài những gì bạn đang tìm kiếm. –

1

Ít nhất, bạn có thể làm tăng số mã lên thành hằng số lớp hoặc thành viên không?

class MyErrorProneClass { 
    const TURNED_INTO_A_NEWT = 12; 
    ... 

    public function dontBurnMe() { 
     // echo your error here using self::TURNED_INTO_A_NEWT 
} 

Bằng cách này bạn có thể quản lý lỗi ở cùng nơi bạn sử dụng, thay vì phải bảo trì tệp trung tâm lớn. Tôi đã thử một cái gì đó để có hiệu lực trong quá khứ và nó trở nên khó khăn để theo kịp.

Tạo các số lỗi có lập trình có thể là một giải pháp lâu dài tốt hơn. Nếu bạn có thể sử dụng thông tin về tệp hoặc số dòng (__FILE____LINE__ tương ứng), điều đó sẽ hữu ích.

Hy vọng rằng di chuyển đúng hướng ít nhất.

Cảm ơn, Joe


Edit:

Một thành viên lớp sẽ làm theo cú pháp này để thay thế:

class MyErrorProneClass { 
    protected static $turnedIntoANewt = 12; 
    ... 

    public function dontBurnMe() { 
     // echo your error here using self::$turnedIntoANewt 
} 

Kể từ hằng số là công khai theo mặc định, bạn có thể truy cập chúng từ các lớp khác trực tiếp nếu bạn muốn. Vì vậy, từ bên ngoài, các lỗi sẽ được tham chiếu như:

MyErrorProneClass::TURNED_INTO_A_NEWT 

Đối với liên kết đến bài viết, bạn sẽ sử dụng một ánh xạ (hoặc trong một cơ sở dữ liệu, hoặc trong một số tập tin nội địa hóa) từ ID lỗi (và frontend/backend) để hiển thị chuỗi. Việc sử dụng các khóa này cho các thư không phải là tối ưu, nhưng nó sẽ cho phép bạn thay đổi các thông báo lỗi mà không thay đổi mã.

+0

Joe, tôi thích ý tưởng sử dụng hằng số trong lớp. Làm thế nào để cung cấp một giao diện từ lớp tới thế giới bên ngoài cho các hằng số và giá trị đó? Tôi cũng muốn liên kết chúng với một chuỗi các chuỗi thông báo lỗi người dùng và quản trị viên. Ngoài ra, lớp "thành viên" là gì? – user151841

0

Nếu bạn không biết đã có ý tưởng sử dụng trigger_error(), cộng với trình xử lý lỗi nếu bạn muốn trình bày cho người dùng thông báo lỗi tốt hơn.

+0

Vâng, nhưng điều này giống như câu trả lời "sử dụng ngoại lệ" - tôi vẫn phải tổ chức các mã lỗi và chuỗi khi tôi đang làm việc. Nó chỉ di chuyển vấn đề. – user151841

0

Bạn đã từng nghĩ đến việc sử dụng exceptions? Họ có thể là một lựa chọn tốt cho vấn đề của bạn ở đây mặc dù thêm chúng vào dự án của bạn bây giờ có lẽ sẽ yêu cầu một số cơ cấu lại.

Bạn có thể mở rộng lớp ngoại lệ cơ bản để nó phù hợp với vấn đề của bạn về việc tách thông báo lỗi người dùng/nhà phát triển.

+0

Vâng, vâng, với ngoại lệ, tôi vẫn gặp vấn đề với việc tổ chức các mã lỗi và giữ chúng hoàn toàn thẳng.Nó chỉ di chuyển vấn đề, không giải quyết nó. – user151841

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