Theo kinh nghiệm của tôi thiết kế theo hợp đồng là giá trị thực hiện, thậm chí không có hỗ trợ ngôn ngữ.Đối với các phương thức không phải là xác nhận ghi đè, cùng với tài liệu là đủ cho cả trước và sau điều kiện. Đối với các phương thức được ghi đè, chúng tôi chia phương thức thành hai: phương thức công khai kiểm tra trước và sau điều kiện và phương thức được bảo vệ cung cấp triển khai và có thể bị ghi đè bởi các lớp con. Dưới đây là một ví dụ về sau:
class Math:
def square_root(self, number)
"""
Calculate the square-root of C{number}
@precondition: C{number >= 0}
@postcondition: C{abs(result * result - number) < 0.01}
"""
assert number >= 0
result = self._square_root(number)
assert abs(result * result - number) < 0.01
return result
def _square_root(self, number):
"""
Abstract method for implementing L{square_root()}
"""
raise NotImplementedError()
Tôi có căn bậc hai là một ví dụ chung của thiết kế theo hợp đồng từ một tập phim về thiết kế theo hợp đồng trên đài phát thanh phần mềm kỹ thuật (http://www.se-radio.net/2007/03/episode-51-design-by-contract/). Họ cũng đề cập đến nhu cầu hỗ trợ ngôn ngữ bởi vì các xác nhận không hữu ích trong việc đảm bảo nguyên tắc thay thế Liskov, mặc dù ví dụ trên của tôi nhằm mục đích chứng minh khác. Tôi cũng nên đề cập đến thành ngữ C++ pimpl (tư nhân thực hiện) như một nguồn cảm hứng, mặc dù có một mục đích hoàn toàn khác.
Trong công việc của mình, gần đây tôi đã tái cấu trúc loại kiểm tra hợp đồng này thành một hệ thống phân cấp lớp học lớn hơn (hợp đồng đã được ghi nhận nhưng không được kiểm tra một cách hệ thống). Các bài kiểm tra đơn vị hiện tại đã tiết lộ rằng các hợp đồng đã bị vi phạm nhiều lần. Tôi chỉ có thể kết luận điều này nên đã được thực hiện một thời gian dài trước đây, và bảo hiểm đơn vị thử nghiệm trả hết ngay cả khi thiết kế theo hợp đồng được áp dụng. Tôi hy vọng bất kỳ ai cố gắng kết hợp các kỹ thuật này để thực hiện các quan sát giống nhau.
Hỗ trợ công cụ tốt hơn có thể cung cấp cho chúng tôi nhiều quyền lực hơn trong tương lai, tôi hoan nghênh điều đó.
Nguồn
2013-08-09 20:49:16
Lưu ý rằng bạn chỉ có thể kế thừa từ TestCase và bao gồm các bài kiểm tra đơn vị trong bất kỳ lớp nào. – Marcin
Phải, nhưng DBC có một chút khác biệt ở chỗ nó sẽ chạy kiểm tra trong sản xuất và trên tất cả các đầu vào dữ liệu. Từ những gì tôi hiểu bài kiểm tra đơn vị là thời gian chạy khẳng định với một tập dữ liệu được xác định trước, trong khi DBC là một mức độ trên khẳng định với tất cả các đầu vào. Cụ thể, tôi nghĩ có thể sử dụng DBC trong trường hợp của tôi vì rất nhiều mã thực sự là trạng thái nặng và thường phải lấy trạng thái từ một DB bên ngoài với lược đồ thường xuyên thay đổi và các mối quan hệ khá phức tạp, rất lộn xộn để giả lập . – ipartola
Thiết kế theo hợp đồng là nơi bạn chỉ định rõ ràng đặc điểm kỹ thuật mà từng đoạn mã phù hợp. Bạn không cần phải kiểm tra nó trong thời gian chạy đầy đủ. Đơn vị kiểm tra có thể được đặc điểm kỹ thuật đó cũng giống như bất cứ điều gì khác. TDD là một cách khác nhau của việc sử dụng các bài kiểm tra đơn vị, trong trường hợp đó để mô hình hóa một tập hợp các hành vi dự kiến. – Marcin