2010-08-03 43 views
10

Tôi chỉ hỏi về các thực hành chuẩn về cú pháp xác thực đối số. Tôi đang làm việc với PHP như hiện tại, nhưng bất cứ thứ gì được coi là giải pháp thuyết bất khả tri về ngôn ngữ/nền tảng sẽ là tuyệt vời.Tiêu chuẩn xác thực đối số chức năng/phương pháp

Hiện tại, tôi biết hai cú pháp khá phổ biến. Ví dụ (sở thích của tôi):

function foo($a, $b, $c){ 
    if(!$a){ throw new Exception(); } 
    if($b < 0){ throw new Exception(); } 
    if(!check($c)){ throw new Exception(); } 

    //do stuff with $a, $b, and $c 

} 

Và cách khác:

function foo($a, $b, $c){ 
    if($a){ 
     if($b >= 0){ 
      if(check($c)){ 

       //do stuff with $a, $b, and $c 

      }else{ throw new Exception(); } 
     }else{ throw new Exception(); } 
    }else{ throw new Exception(); } 
} 

Trong mọi trường hợp, nếu có ai biết tài liệu minh họa bất kỳ loại tiêu chuẩn, hay các hoạt động chung về vấn đề này, tôi rất sẽ đánh giá cao một tài liệu tham khảo.

Tất nhiên, sở thích cá nhân và ý kiến ​​được chào đón nhiều hơn, nhưng lý do cho lựa chọn của bạn sẽ là tài sản.

Trả lời

6

tôi thích ví dụ cựu bạn đưa ra đối với một số lý do:

  • Mã không được cách không cần thiết thụt vào như nó với lồng nhau nếu phát biểu.
  • Các câu lệnh lồng nhau nếu có thể thêm một đống các nhánh phức tạp vào luồng logic trở nên khó quản lý
  • Điều kiện trước được chuyển xuống thấp hơn theo bản chất của câu hỏi if. Tôi thích để có tất cả các điều kiện tiên ngay lúc bắt đầu của phương pháp

Thiết kế theo hợp đồng là cách tiếp cận chung để đảm bảo điều kiện nhất định được đáp ứng (thường là thông qua khẳng định) như:

Assert.IsNotNull($a, '$a must not be null'); 

Nếu xác nhận không thành công, ngoại lệ được ném với thông báo được chỉ định.

Sử dụng cùng một cách tiếp cận, bạn có thể thực hiện một số xác nhận nhất định ở cuối phương thức (điều kiện sau) để đảm bảo phương thức được thực hiện như mong đợi.

+1

Cảm ơn bạn Michael - Đó là phương pháp tương tự tôi thích. Bất kỳ đề xuất nào về các lớp Assertion hiện có để xác nhận/ném ngoại lệ? Tôi cho rằng một thiết kế lớp Assertion có hiệu quả, sẽ mở rộng lớp Exception hiện có, đúng không? Bất kỳ đề xuất về nơi để bắt đầu viết của riêng tôi? – Dan

1

Ngoài ra, nhóm các bộ nếu xét nghiệm với nhau trong một đơn "nếu tuyên bố":

function foo($a, $b, $c) { 
    if ((!$a) || 
     ($b < 0) || 
     (!check($c))) { 
     throw new Exception(); 
    } 

    //do stuff with $a, $b, and $c 
} 
Các vấn đề liên quan