2013-05-30 39 views
13

Trước hết: Tôi đã cố gắng google, nhưng tôi chủ yếu chỉ tìm thấy các cuộc thảo luận về cách xác định mảng trong hằng số và thông tin không liên quan khác.Lớp PHP chỉ chứa các hằng số

Tôi có câu hỏi liên quan đến giải pháp để làm cho mã của tôi dễ đọc hơn (và đẹp) vừa mới xảy ra với tôi. Về cơ bản, tôi có hầu hết các hàm trả lại mã trạng thái cho biết thành công hoặc, trong trường hợp có sự cố, mã lỗi. Đối với điều này, tôi đã thực hiện một lớp được gọi là "StatusCode" chỉ chứa các hằng số, như vậy:

<?php 
class StatusCode { 
    const success = 0; 
    const badArgument = -1; 
    const badQuery = -2; 
    const outOfMana = -3; //Really just for demonstration purposes 
    ... 
} 

Mục đích là làm cho con số ma thuật biến mất từ ​​mã của tôi và làm cho nó rõ ràng những gì đã xảy ra mà không cần phải tìm kiếm một giải thích ở đâu đó:

if (mana > 10) { 
    //Do some magic 
    return StatusCode::success; 
} 
else { 
    //Oh god this is not good! 
    return StatusCode::outOfMana; 
} 

Nó cũng nên loại bỏ khả năng vô tình sử dụng mã lỗi trùng lặp. Tôi khá chắc chắn điều này bổ sung thêm một chi phí nhỏ cho ứng dụng của tôi, nhưng đã làm cho mã của tôi dễ hiểu hơn. Có một số lý do vỡ tan trái đất không phải để làm điều này? Có lẽ một cách tốt hơn để đi về nó?

(Tôi đã tránh được cách tiếp cận define(CONSTANT, "value") vì nó có vẻ ít xinh đẹp và đó là một rắc rối để viết trên bàn phím tiếng Đức của tôi :))

+7

Không có lý do gì để KHÔNG làm những gì bạn đã làm. Như bạn đã nói, nó làm cho mã của bạn dễ đọc hơn. Đối với việc thêm chi phí, ngay cả khi đó là sự thật, nó hoàn toàn tối thiểu trên không. Đối với những cách tốt hơn, có những biến thể cho những gì bạn đã thực hiện bằng cách sử dụng các giao diện để xác định các hằng số. TL; DR - những gì bạn đã làm là tốt. –

+1

Hoàn toàn đồng ý với những gì @ N.B. nói. Vấn đề duy nhất của tôi với bài viết này là nó nên được hơn lúc xem xét mã, không phải ở đây;) – Prisoner

+1

Trong góc nhỏ của phong cách mã hóa sự lựa chọn của bạn là tốt nhất tuyệt đối có.Và khi nói về phong cách, người ta không thể nói "tuyệt đối tốt nhất" rất thường xuyên. ;-) BTW, bạn có thể muốn làm cho lớp này 'abstract' hoặc' final' là một gợi ý bổ sung về cách nó không được sử dụng. Thật không may nó không thể là cả hai, mà sẽ niêm phong thỏa thuận. – Jon

Trả lời

17

Trong Java và các ngôn ngữ khác đây là một cách thường được sử dụng để không gian tên hằng số để tránh đặt tên va chạm. Xem here;

Cách mà tôi sẽ thực hiện một lớp học như vậy là như thế này"

// make this final so no one can extend it 
final class Errors{ 
    const SUCCESS = 0; 
    const BAD_ARGUMENT = -1; 
    const BAD_QUERY = -2; 
    const OUT_OF_MANA = -3; 

    // make this private so noone can make one 
    private function __construct(){ 
     // throw an exception if someone can get in here (I'm paranoid) 
     throw new Exception("Can't get an instance of Errors"); 
    } 
} 
+1

Tại sao tôi không nghĩ đến việc chỉ làm cho hàm tạo riêng tư thay vì sử dụng abstract? Cảm ơn, ví dụ của bạn bao gồm cả "không khởi tạo" và "không mở rộng". – Anpan

1

này có lợi thế là không gian tên và nhóm hằng số. Bạn có thể sử dụng phản chiếu trên lớp mà để lặp qua hằng xác định, mà cho phép bạn, ví dụ, để xác nhận rằng một giá trị là một giá trị của một nhóm hằng số nhất định (cho phép gợi ý kiểu hằng số của người nghèo). Purists có thể không thích điều đó. Các hằng số không được sử dụng trong sam lớp e phải là hằng số toàn cầu; bạn thậm chí có thể đặt tên chúng vào một cái gì đó như \StatusCodes\SUCCESS trong PHP 5.3+.

Sự lựa chọn là của bạn, thực sự.

+0

Tôi cho rằng đó là một chút giống như loại bỏ một nắp chai với một nhẹ hơn, sau đó. Nếu đối số duy nhất chống lại thực hành này là: "Nhưng các lớp học không được dành cho điều này" nhưng nó có một số lợi thế khác, sau đó tôi cho rằng nó là okay. – Anpan

+0

Sắp xếp, vâng. :) – deceze

1

Tạo một tĩnh lớp sẽ giải quyết vấn đề của bạn và tránh tạo ra nhiều trường hợp của StatusCode

Namespaces có thể được sử dụng nếu bạn nghĩ rằng ứng dụng của bạn có thể có nhiều lớp StatusCode nhưng vẫn StatusCode sẽ tĩnh.

Nếu bạn muốn sử dụng mẫu đơn, thao tác này cũng sẽ hoạt động quá

Lựa chọn là của bạn!

+0

Thực ra tôi không muốn bất kỳ ví dụ nào cả. – Anpan

+0

Từ định nghĩa lớp như thế này "lớp StatusCode" nhiều trường hợp có thể được thực hiện như vậy là quản lý bộ nhớ sẽ được dựa trên đó, vì vậy tốt hơn xác định tĩnh lớp StatusCode và sử dụng nó như StatusCode :: * –

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