Tôi đang gỡ lỗi với các điểm dừng và tôi nhận ra cuộc gọi khẳng định? Tôi nghĩ rằng nó chỉ dành cho các bài kiểm tra đơn vị. Nó làm gì hơn điểm dừng? Vì tôi có thể dừng lại, tại sao tôi nên sử dụng Assert?
Tôi đang gỡ lỗi với các điểm dừng và tôi nhận ra cuộc gọi khẳng định? Tôi nghĩ rằng nó chỉ dành cho các bài kiểm tra đơn vị. Nó làm gì hơn điểm dừng? Vì tôi có thể dừng lại, tại sao tôi nên sử dụng Assert?
Câu trả lời:
Trong quá trình biên dịch gỡ lỗi, Assert
lấy một điều kiện Boolean làm tham số và hiển thị hộp thoại lỗi nếu điều kiện sai. Chương trình tiến hành mà không có bất kỳ gián đoạn nếu điều kiện là đúng.
Nếu bạn biên dịch trong Bản phát hành, tất cả Debug.Assert
sẽ tự động bị bỏ qua.
Debug.Assert
ở chế độ phát hành?
8 Lập trình phòng thủ
8.2 Khẳng định
Một xác nhận là mã được sử dụng trong quá trình phát triển, thường là một chương trình macro hoặc macro cho phép chương trình tự kiểm tra khi nó chạy. Khi một khẳng định là đúng, điều đó có nghĩa là mọi thứ đang hoạt động như mong đợi. Khi nó sai, điều đó có nghĩa là nó đã phát hiện ra một lỗi không mong muốn trong mã. Ví dụ: nếu hệ thống giả định rằng tệp thông tin khách hàng sẽ không bao giờ có hơn 50.000 bản ghi, chương trình có thể chứa một xác nhận rằng số lượng bản ghi nhỏ hơn hoặc bằng 50.000. Miễn là số lượng hồ sơ ít hơn hoặc bằng 50.000, khẳng định sẽ im lặng. Tuy nhiên, nếu nó gặp hơn 50.000 bản ghi, tuy nhiên, nó sẽ lớn tiếng khẳng định rằng có lỗi trong chương trình.
Các xác nhận đặc biệt hữu ích trong các chương trình lớn, phức tạp và trong các chương trình có độ tin cậy cao. Chúng cho phép các lập trình viên nhanh chóng loại bỏ các giả định giao diện không khớp, các lỗi xuất hiện khi mã được sửa đổi, v.v.
Một xác nhận thường có hai đối số: một biểu thức boolean mô tả giả định được cho là đúng và một thông báo sẽ hiển thị nếu không.
(Càng)
Thông thường, bạn không muốn người dùng thấy thông báo xác nhận trong mã sản xuất; khẳng định chủ yếu để sử dụng trong quá trình phát triển và bảo trì. Các xác nhận thường được biên dịch thành mã tại thời điểm phát triển và được biên dịch ra khỏi mã để sản xuất. Trong quá trình phát triển, các xác nhận tuôn ra các giả định mâu thuẫn, các điều kiện bất ngờ, các giá trị xấu được truyền vào các thói quen, v.v. Trong quá trình sản xuất, chúng được biên dịch ra khỏi mã để các xác nhận không làm giảm hiệu năng hệ thống.
Bạn nên sử dụng nó cho những lúc bạn không muốn phải ngắt từng dòng mã nhỏ để kiểm tra các biến, nhưng bạn muốn nhận được một số phản hồi nếu có tình huống nhất định, ví dụ:
Debug.Assert(someObject != null, "someObject is null! this could totally be a bug!");
System.Diagnostics
Khẳng định cũng cung cấp cho bạn một cơ hội khác để cười thầm về các kỹ năng thiết kế UI của Microsoft. Ý tôi là: một hộp thoại có ba nút Hủy bỏ, Thử lại, Bỏ qua và giải thích về cách diễn giải chúng trong thanh tiêu đề!
Khẳng định cho phép bạn xác nhận một điều kiện (bài hoặc tiền) áp dụng trong mã của bạn. Đó là một cách để ghi lại ý định của bạn và yêu cầu trình gỡ lỗi thông báo cho bạn một hộp thoại nếu ý định của bạn không được đáp ứng.
Không giống như điểm dừng, Assert đi cùng với mã của bạn và có thể được sử dụng để thêm chi tiết bổ sung về ý định của bạn.
Trước hết Assert()
phương pháp có sẵn cho Trace
và Debug
các lớp.
Debug.Assert()
chỉ thực hiện trong chế độ Gỡ lỗi.
Trace.Assert()
đang thực thi trong chế độ Gỡ lỗi và Phát hành.
Đây là một ví dụ:
int i = 1 + 3;
// Debug.Assert method in Debug mode fails, since i == 4
Debug.Assert(i == 3);
Debug.WriteLine(i == 3, "i is equal to 3");
// Trace.Assert method in Release mode is not failing.
Trace.Assert(i == 4);
Trace.WriteLine(i == 4, "i is equla to 4");
Console.WriteLine("Press a key to continue...");
Console.ReadLine();
Chạy mã này trong chế độ Gỡ lỗi và sau đó ở chế độ Phát hành.
Bạn sẽ nhận thấy rằng trong chế độ Gỡ lỗi, Debug.Assert
câu lệnh mã của bạn không thành công, bạn nhận được một hộp thông báo hiển thị dấu vết ngăn xếp hiện tại của ứng dụng. Điều này không xảy ra trong chế độ Phát hành vì Trace.Assert()
điều kiện là đúng (i == 4)
.
WriteLine()
Phương thức đơn giản chỉ cung cấp cho bạn một tùy chọn ghi thông tin vào đầu ra Visual Studio.
Các xác nhận đặc trưng rất nhiều trong Thiết kế theo Hợp đồng (DbC) mà theo tôi hiểu được giới thiệu / chứng thực bởi Meyer, Bertand. 1997. Tương phản phần mềm hướng đối tượng.
Một tính năng quan trọng là chúng không được tạo ra các hiệu ứng phụ, ví dụ bạn có thể xử lý một ngoại lệ hoặc thực hiện một hành động khác với một câu lệnh if (lập trình phòng thủ).
Các xác nhận được sử dụng để kiểm tra các điều kiện trước / sau của hợp đồng, mối quan hệ khách hàng / nhà cung cấp - khách hàng phải đảm bảo rằng các điều kiện trước của nhà cung cấp được đáp ứng, ví dụ. gửi £ 5 và nhà cung cấp phải đảm bảo các điều kiện hậu được đáp ứng, ví dụ. cung cấp 12 hoa hồng. (Chỉ cần giải thích đơn giản về khách hàng / nhà cung cấp - có thể chấp nhận ít hơn và cung cấp nhiều hơn, nhưng về Xác nhận). C # cũng giới thiệu Trace.Assert (), có thể được sử dụng cho mã phát hành.
Để trả lời câu hỏi, chúng vẫn hữu ích, nhưng có thể thêm độ phức tạp + khả năng đọc vào mã và thời gian + khó duy trì. Chúng ta vẫn nên sử dụng chúng? Vâng, tất cả chúng ta sẽ sử dụng chúng? Có lẽ là không, hoặc không đến mức mà Meyer mô tả.
(Ngay cả khóa học OU Java mà tôi đã học kỹ thuật này chỉ hiển thị các ví dụ đơn giản và phần còn lại của mã không thực thi các quy tắc xác nhận DbC trên hầu hết các mã, nhưng được cho là được sử dụng để đảm bảo tính chính xác của chương trình!)
Cách tôi nghĩ về nó là Debug.Assert là một cách để thiết lập một hợp đồng về cách gọi một phương thức, tập trung vào các chi tiết cụ thể về các giá trị của một tham số (thay vì chỉ loại). Ví dụ: nếu bạn không được gửi null trong tham số thứ hai, bạn thêm Assert xung quanh tham số đó để báo cho người tiêu dùng không làm điều đó.
Nó ngăn không cho ai đó sử dụng mã của bạn theo cách xương đầu. Nhưng nó cũng cho phép cách thức đi đầu để đi vào sản xuất và không đưa ra thông điệp khó chịu cho khách hàng (giả sử bạn xây dựng bản dựng Phát hành).