2014-04-23 16 views
7

Tại sao tôi nên sử dụng hợp đồng mã nhưhợp đồng Mã lợi ích

Contract.Requires<ArgumentNullException>(x != null, "x"); 

thay vì tốt cũ

if (x!=null){} 
else throw... 

Có bất kỳ lợi ích nào khác ngoài của conciseness?

Trả lời

10

Theo MSDN:

Những lợi ích của hợp đồng đang bao gồm:

  • Cải thiện thử nghiệm: hợp đồng Mã cung cấp xác minh tĩnh hợp đồng, kiểm tra thời gian chạy, và thế hệ tài liệu.
  • Công cụ kiểm tra tự động: Bạn có thể sử dụng hợp đồng mã để tạo các kiểm tra đơn vị có ý nghĩa hơn bằng cách lọc ra các đối số kiểm tra vô nghĩa không đáp ứng điều kiện tiên quyết.
  • Xác minh tĩnh: Trình kiểm tra tĩnh có thể quyết định xem có bất kỳ vi phạm hợp đồng nào mà không chạy chương trình hay không. Nó kiểm tra các hợp đồng tiềm ẩn, chẳng hạn như các tham chiếu rỗng và các giới hạn mảng, và các hợp đồng rõ ràng.
  • Tài liệu tham khảo: Trình tạo tài liệu bổ sung các tệp tài liệu XML hiện có với thông tin hợp đồng. Cũng có các bảng định kiểu có thể được sử dụng với Sandcastle để các trang tài liệu được tạo ra có các phần hợp đồng.

Số dặm của bạn có thể thay đổi điểm quan trọng nào. Tôi thấy thứ ba và thứ tư (xác minh tĩnh và tài liệu) đặc biệt thú vị.

Nói cách khác, đó là cách cấu trúc hợp lý hơn (thay vì cấu trúc như if (x!=null){}) mà các công cụ bổ sung có thể hiểu được.

+0

Cá nhân tôi thích điểm 3 nhiều nhất, bạn bây giờ nhận được lỗi trình biên dịch trên những thứ mà có thể đã có lỗi thời gian chạy như 'NullRefrenceExcption' hoặc' Arg umentOutOfRangeException'. –

5

Ngoài đường cú pháp, Hợp đồng mã là công cụ của Microsoft dành cho mô hình "Thiết kế theo hợp đồng". http://en.wikipedia.org/wiki/Design_by_contract

Về cơ bản, đây là một cách suy nghĩ khác khi bạn thiết kế các lớp và hoạt động của mình. Từ kinh nghiệm, DbC hoạt động rất tốt với Test Driven Development, với bạn về cơ bản xác định các hợp đồng và viết các bài kiểm tra cho nó trước khi bạn viết bất kỳ logic nghiệp vụ nào.

Phía sau hậu trường, Hợp đồng hợp đồng tạo mã tương tự như mã cũ tốt của bạn vào thời gian biên dịch, vì vậy mã IL chứa tất cả các kiểm tra.

Ví dụ, lớp

public class Scheduler 
{ 
    public bool ScheduleTask(string taskname, DateTime startTime, DateTime endTime) 
    { 
     Contract.Requires(!string.IsNullOrWhiteSpace(taskname)); 
     Contract.Requires(startTime != null); 
     Contract.Requires(endTime != null); 
     return true; 
    } 
} 

sẽ dẫn đến một cái gì đó giống như

public bool ScheduleTask(string taskname, DateTime startTime, DateTime endTime) 
{ 
    __ContractsRuntime.Requires(!string.IsNullOrWhiteSpace(taskname), null, "!string.IsNullOrWhiteSpace(taskname)"); 
    __ContractsRuntime.Requires(true, null, "startTime != null"); 
    __ContractsRuntime.Requires(true, null, "endTime != null"); 
    return true; 
} 

nơi _ContractsRuntime.Requests trông giống như sau

internal static void Requires(bool condition, string msg, string conditionTxt) 
{ 
    if (!condition) 
    { 
     __ContractsRuntime.ReportFailure(ContractFailureKind.Precondition, msg, conditionTxt, null); 
    } 
}