Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C# Hình 13-1: Một vòng lặp tính toán Một tính toán bằng vòng lặp gồm những thành phần sau: Mục tiêu post, là một hậu điều kiện, được định nghĩa như là một thuộc tính mà bất cứ trạng thái cuối nào của sự tính toán đều phải thỏa mản. Ví dụ như: “Result là giá trị lớn nhất của mảng”. Mục tiêu này được biểu diễn trong hình minh họa là một tập hợp những trạng thái POST thỏa mãn post. Điều kiện bất biến inv,...
Tìm hiểu cơng nghệ Design By Contract Xây dựng cơng cụ hỗ trợ cho C# Hình 13-1: Một vịng lặp tính tốn Một tính tốn vịng lặp gồm thành phần sau: Mục tiêu post, hậu điều kiện, định nghĩa thuộc tính mà trạng thái cuối tính tốn phải thỏa mản Ví dụ như: “Result giá trị lớn mảng” Mục tiêu biểu diễn hình minh họa tập hợp trạng thái POST thỏa mãn post Điều kiện bất biến inv, tổng quát hóa mục tiêu (post trường hợp đặc biệt inv) Ví dụ: “Result giá trị lớn phần mảng không rỗng biên thấp nhất” Điều kiện bất biến biểu diễn hình minh họa tập hợp trạng thái INV thỏa mãn inv Điểm khởi động init thuộc INV, điểm thỏa mãn điều kiện bất biến Ví dụ: giá trị i biên mảng giá trị Result phần tử mảng tương ứng vị trí đó, thỏa mãn điều kiện bất biến phần tử lớn mảng phần tử phần tử 73 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# Sự biến đổi body (bắt đầu từ điểm INV POST) phát sinh điểm tiến đến gần POST thuộc INV Trong ví dụ trên, biến đổi mở rộng mảng lên phần tử thay Result phần tử thêm lớn Result Thân vịng lặp hàm maxarray ví dụ cài đặt biến đổi Biên dựa vào số body cần thiết để đưa điểm INV đến POST Đây biến Tính tốn xấp xỉ phương pháp tốn giải tích, ý tưởng áp dụng rộng rãi Sự khác biệt toán học túy, ta chấp nhận có tồn giới hạn, khơng thể đạt giới hạn Ví dụ 1/n có giới hạn khơng có n cụ thể để đạt giới hạn Cịn tin học, cần có kết cụ thể, phải nhấn mạnh tất xấp xỉ tiến đến kết cụ thể sau số lần lặp lặp lại định 13.4 Cú pháp vòng lặp − Gồm thành phần sau: − Điều kiện bất biến (invariant) vòng lặp inv – xác nhận − Điều kiện khỏi vịng lặp exit − Điều kiện biến đổi (variant) vòng lặp var – biểu thức nguyên − Tập lệnh khởi tạo init, tập lệnh tạo trạng thái thỏa inv làm var không âm − Tập lệnh body, tập lệnh này, khởi đầu trạng thái mà inv giữ var không âm, bảo vệ điều kiện bất biến làm điều kiện biến đổi giảm (nhưng bảo đảm khơng âm) Vì vậy, trạng thái kết quả, inv thỏa var có giá trị nhỏ trước (nhưng ln khơng âm) Tóm lại, vịng lặp có cú pháp sau: 74 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# from init invariant inv variant var until exit loop body end Đây phiên vòng lặp cho hàm maxarray: from i := t.lower; Result := t @ lower invariant Result giá trị lớn t số t.lower = i variant t.lower – i until i = t.upper loop i := i + Result := Result.max (t @ i) end Dưới ví dụ khác điều kiện bất biến, hàm tính ước chung lớn (greatest common divisor - gcd) số nguyên dương a, b thuật tốn Euclid Phiên khơng có khơng có điều kiện bất biến điều kiện biến đổi: 75 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# gcd (a, b: INTEGER): INTEGER is Uớc chung lớn a b require a > 0; b > local x, y: INTEGER from x := a; y := b until x = y loop if x>y then x:=x–y else y:=y–x end end Result := x ensure Result ước chung lớn a b end Làm chắn hàm gcd trả giá trị ước chung lớn a b Có cách để kiểm tra điều này, lưu ý thuộc tính ln suốt trình lặp: x > 0; y > Cặp x, y có ước chung lớn với cặp a, b Đây điều kiện bất biến mà ta cần cho hàm Làm biết vịng lặp ln ln kết thúc? Chúng ta cần điều kiện biến đổi để xác định điều Không thể chọn x làm điều kiện biến đổi ta khơng bước lặp tuỳ ý làm giảm x, lý đó, y chọn Nhưng ta x y giảm giá trị, giá trị lớn chúng (được biểu diễn hàm x.max(y)) lựa chọn tốt Ta có phiên có điều kiện bất biến điều kiện biến đổi vịng lặp cho hàm gcd: 76 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# from x := a; y := b invariant x > 0; y > Cặp có UCLN với cặp variant x.max (y) until x = y loop if x > y then x := x – y else y := y – x end end Chương 14: Sử dụng xác nhận Xem qua tất cấu trúc có liên quan đến xác nhận, ta thấy có loại ứng dụng liên quan đến xác nhận: − Trợ giúp cho việc viết phần mềm xác − Trợ giúp việc viết tài liệu − Hỗ trợ kiểm tra (testing), chạy bước (debugging) đảm bảo chất lượng − Hỗ trợ khả chịu lỗi phần mềm Chỉ có ứng dụng cuối có khả kiểm tra xác nhận lúc thực thi 14.1 Những xác nhận công cụ để viết phần mềm xác Ứng dụng hồn tồn mang tính phương pháp có vai trị quan trọng Điều làm rõ phần trước: giải thích rõ ràng yêu cầu xác thủ tục, thuộc tính tổng quát lớp đối 77 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# tượng vịng lặp, giúp cho người lập trình tạo phần mềm xác từ lần (khác với cách tiếp cận khác, cố gắng sửa lỗi đạt tính đắn) Từ khóa xuyên suốt Design By Contract Trong giới thực, hợp đồng tốt hợp đồng định rõ ràng quyền lợi nghĩa vụ bên tham gia, giới hạn quyền nghĩa vụ Trong thiết kế phần mềm, tính đắn tính vững vơ quan trọng, ta cần rõ điều khoản hợp đồng điều kiện tiên trước hợp đồng có hiệu lực Những xác nhận cung cấp phương tiện nhằm rõ điều mong đợi bảo đảm cho đối tác ký kết 14.2 Sử dụng xác nhận cho việc viết tài liệu: thể rút gọn lớp đối tượng Ứng dụng thứ hai cần thiết cho việc sản xuất thành phần phần mềm có tính tái sử dụng cao, tổng quát hơn, việc tổ chức interface môđun hệ thống lớn Tiền điều kiện, hậu điều kiện điều kiện bất biến lớp cung cấp cho khách hàng tiềm môđun thông tin dịch vụ cung cấp mơđun Những thơng tin biểu diễn hình thức ngắn gọn xác Khơng tài liệu dài dịng thay tập xác nhận dùng để biểu diễn xuất phần mềm Thể rút gọn sử dụng xác nhận thành phần quan trọng việc trích thơng tin thích hợp cho khách hàng tiềm từ lớp đối tượng Thể rút gọn bao gồm thơng tin có ích cho tác giả lớp client, khơng cho thấy đặc tính ẩn cài đặt lớp (mệnh đề do) Nhưng thể rút gọn giữ lại xác nhận, chúng cung cấp tài liệu cần thiết hợp đồng mà lớp quy định với client Thể rút gọn lớp STACK4 78 Tìm hiểu công nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# indexing description: " Stacks: Cấu trúc liệu với quy tắc truy xuất LIFO, có độ lớn cố định." class interface STACK4 [G] creation make feature Khởi tạo make (n: INTEGER) is Cấp phát cho stack độ lớn n phần tử require non_negative_capacity: n >= ensure capacity_set: capacity = n end feature -– Truy cập capacity: INTEGER Số phần tử tối đa stack count: INTEGER Số phần tử stack item: G is Phần tử require not_empty: not empty –- i.e: count > end feature -– Báo cáo tình trạng empty: BOOLEAN is Kiểm tra stack rỗng? ensure empty_definition: Result = (count = 0) end 79 Tìm hiểu công nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# full: BOOLEAN is Kiểm tra stack đầy? ensure full_definition: Result = (count = capacity) end feature –- Thay đổi thành phần put (x: G) is Thêm phần tử x vào stack require not_full: not full ensure not_empty: not empty added_to_top: item = x one_more_item: count = old count + end remove is Xóa phần tử stack require not_empty: not empty –- i.e: count > ensure not_full: not full one_fewer: count = old count – end invariant count_non_negative: Cặp