2010-11-19 19 views
5

Tôi hiện đang phát triển một khuôn khổ AI nhỏ (thuật toán di truyền/mạng thần kinh) trong C#, cho một dự án đại học.Làm thế nào để bạn khẳng định trong mã thuật toán trong .NET?

Mối quan tâm đầu tiên của tôi là phát triển một khuôn khổ có thể tái sử dụng, vì vậy tôi đang thiết kế mọi thứ trở nên khá mô-đun. Tôi biết tôi đang trả giá cho buổi biểu diễn này, nhưng tôi cảm thấy rằng mình có nhiều thứ để đạt được hơn là thua với nó (tốt hơn là phải viết mã gấp hai lần chậm hơn là phải mất gấp đôi thời gian sau đó để cố gắng không thể tìm lỗi và mất rất nhiều thời gian cố gắng để thêm những điều mới mà rất khó để giới thiệu trong một khối nguyên khối).

Tôi muốn có nhiều kiểm tra trên các phần khác nhau của mã, xác nhận, về cơ bản. Kiểm tra xem liệu khi nào phương pháp chạy XI thực sự ở trạng thái chính xác, v.v. Những loại xác nhận này hữu ích khi phát triển, nhưng tôi muốn chúng ở cách xa mã phát hành (tức là, khi tôi quyết định rằng tôi muốn rời khỏi điều này làm việc cho đêm để có được kết quả nghiên cứu cuối cùng của tôi).

tôi có thể thấy nhiều cách thực hiện điều này:

  1. System.Diagonists.Assert gia đình của phương pháp.
  2. Mã Hợp đồng
  3. Có if (x) sau đó ném InvalidStateException() được bao quanh bởi # nếu DEBUG/#endif

Làm thế nào bạn sẽ làm điều đó và tại sao?

Tôi cũng biết về Kiểm tra đơn vị (Tôi đang sử dụng chúng), nhưng tôi cũng muốn có một số loại xác nhận trên mã.

Trả lời

8

Bạn có thể sử dụng một phương pháp tĩnh như thế này:

[Conditional("DEBUG")] 
public static void Assert(bool condition, string message) 
{ 
    if (!condition) 
     throw new InvalidStateException("Assertion failed: " + message); 
} 

Và khẳng định như vậy, giả sử phương pháp được định nghĩa trong một lớp được gọi là Util:

Util.Assert(a == b, "a == b"); 

Các cuộc gọi đến phương pháp này sẽ chỉ có phát ra bởi trình biên dịch khi biểu tượng DEBUG được thiết lập, nhờ ConditionalAttribute. Vì vậy, bạn không cần phải bọc các cuộc gọi như vậy trong bất kỳ chỉ thị #if nào. Điều này sẽ dẫn đến sự lộn xộn mã ít hơn.

(Lưu ý rằng phương pháp riêng của mình sẽ vẫn được biên dịch. Điều này cho phép bạn sử dụng các phương pháp như vậy trong hội đồng khác nhau!)

+1

Các hợp đồng mã không hoạt động theo cách tương tự? Tôi đã có ý tưởng bạn hoàn toàn có thể tắt chúng trong chế độ Release, hoặc một cái gì đó như thế. –

+0

Có thể. Thành thật mà nói tôi không quen thuộc với nó. Kỹ thuật trong câu trả lời của tôi là câu trả lời tôi sử dụng, vì vậy tôi nghĩ tôi sẽ chia sẻ nó. Tôi không thể nói nó tốt hơn hay tệ hơn Code Contracts. – cdhowie

+0

Tôi sẽ đi với những gì cdhowie nói. hợp đồng mã cung cấp nhiều hơn nhưng có lẽ không phải những gì bạn cần trong trường hợp của bạn. Vì vậy, tôi nghĩ rằng công cụ thích hợp là sử dụng các phương thức được trang trí với thuộc tính Conditional thay vì inline # if, # else hoặc Debug.Asset() làm lộn xộn mã nội tuyến của bạn. –

0

Ưu điểm của #if/#endif là không chỉ là gọi hàm assert loại bỏ, nhưng cũng tất cả các công việc chuẩn bị các thông số của nó (mà hy vọng không có tác dụng phụ ...).

+2

Tương tự với '[Điều kiện (...)]'. – cdhowie

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