Tìm hiểu công nghệ Design By Contract và Xây dựng công cụ hỗ trợ cho C# nhỏ hơn một giá trị cho trước Yêu cầu đối tượng nhập vào LessThanOrEqual hoặc trả về phải nhỏ hơn hoặc cho trước Yêu cầu số thành phần của đối tượng nhập MaxCount vào hoặc trả về phải nhỏ hơn hoặc bằng một giá trị cho trước Quy ước chiều dài tối đa của MaxLength một chuỗi là một giá trị cho trước Yêu cầu số thành phần của đối tượng nhập MinCount vào hoặc trả về phải lớn hơn hoặc bằng một giá trị...
Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# nhỏ giá trị cho trước Yêu cầu đối tượng nhập vào LessThanOrEqual Void trả phải SetData([LessThanOrEqual (5)] nhỏ int value) {} giá trị //value =0 (count khong am) public int capacity;// inv: count=0 // [Requires ("size >= 0")] [Ensures ("representation != null && capacity == size && IsEmpty()")] public MyStack([GreaterThanOrEqual (0)]int size) { 86 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# capacity = size; representation = new Object[capacity]; } [Requires ("!IsFull()")] [Ensures ("!IsEmpty() && (int)representation[count-1] == obj")] public void put(int obj) { representation[count++] = obj; } [Requires ("!IsEmpty()")] [Ensures ("!IsFull()")] public void remove() { count; } [Ensures ("result == (count == capacity)")] public bool IsFull() { return count == capacity; } [Ensures ("result == (count == 0)")] public bool IsEmpty() { return count == 0; } 87 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# [Requires ("position >= && position < count")] [Ensures ("current == position")] public void SetCurrentItem(int position) { current = position; } [Ensures ("current == count - 1")] public void ResetCurrentItem() { current = count - 1; } [Requires ("!IsEmpty()")] [Ensures ("result != null && current >= 0")] public Object nextItem() { return representation[current ]; } Chương 16: Kết thực nghiệm: công cụ DCS 16.1 Nguyên lý làm việc DCS Add-In môi trường Visual C#, nguyên lý làm việc DCS bắt kiện OnBuildBegin project, thực bước sau: Duyệt qua tất lớp project (mỗi lớp ứng với file *.cs, trừ file AssemblyInfo.cs) lưu thông tin lớp (tên lớp, tên file, tên lớp dẫn xuất) Trong lớp, chương trình thực bước sau: − Kiểm tra xem lớp có chứa xác nhận (Invariant, PreCondition, PostCondition) hay không Lưu thông tin Invariant (các mệnh đề thông báo 88 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# tương ứng Invariant) có, sau đó, duyệt qua hàm lớp, hàm, thực bước sau: + Kiểm tra hàm có PreCondition PostCondition hay khơng Nếu có, lưu lại thông tin hàm Thông tin lưu trữ gồm có: Tên hàm, PreCondition PostCondition (lưu mệnh đề thông báo) + Đổi tên hàm, lớp có Invariant, tất tên hàm đổi, khơng có Invariant, hàm có PreCondition PostCondition đổi tên Tên hàm đổi sau: Tên hàm = @origin_[Tên hàm cũ] − Dựa vào thông tin lưu trữ được, bổ sung thông tin xác nhận lớp dẫn xuất cho lớp Việc lưu trữ thực cách duyệt qua tất lớp Trong đó, lớp: + Duyệt qua tất tất lớp dẫn xuất lớp (đã lưu trữ), lưu thông tin Invariant lớp dẫn xuất + Duyệt qua hàm, hàm hàm cài đặt lại lưu trữ thông tin Assertion lớp dẫn xuất Phát sinh source code bổ sung để kiểm tra xác nhận cho lớp Trong lớp, source code thêm vào phía source code Mỗi hàm phát sinh source code tương ứng Với hàm, dựa vào thông tin lưu trữ, source code phát sinh sau: [Khai báo hàm theo tên hàm cũ] { Gọi hàm kiểm tra PreCondition Gọi hàm kiểm tra Invariant Gọi hàm gốc (hàm đổi tên @origin_*) Gọi hàm kiểm tra PostCondition Gọi hàm kiểm tra Invariant } 89 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# [Hàm kiểm tra PreCondition] { Các câu lệnh kiểm tra mệnh đề xuất thông báo tương ứng PreCondition } [Hàm kiểm tra Invariant] { Các câu lệnh kiểm tra mệnh đề xuất thông báo tương ứng Invariant } [Hàm kiểm tra PostCondition] { Các câu lệnh kiểm tra mệnh đề xuất thông báo tương ứng PostCondition } Ví dụ: Hàm PreCondition, PostCondition, Invariant: /* @#$Require: !IsFull() # Stack Full @#$Ensure: !IsEmpty() (int)representation[count-1] == obj count == OLD_count + $int # New count = Old count + */ public void put(int obj) 90 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# { representation[count++] = obj; } /* @#$Invariant: count >= count = */ 91 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# Code phát sinh: public void put(int obj) { int OLD_count = count; if(put_PreCondition(obj)!="") throw new Exception("PreCondition Violated at [MyStack - public void put(int obj)]:" +put_PreCondition(obj)); if(put_Invariant(obj)!="") throw new Exception("Invariant Violated at [MyStack]:" +put_Invariant(obj)); @origin_put(obj); if(put_PostCondition(obj,OLD_count)!="") throw new Exception("PostCondition Violated at [MyStack - public void put(int obj)]:" +put_PostCondition(obj,OLD_count)); if(put_Invariant(obj)!="") throw new Exception("Invariant Violated at [MyStack]:" +put_Invariant(obj)); } private string put_PreCondition(int obj) { if (!(!IsFull() )) return " Stack Full"; return ""; } 92 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# private string put_Invariant(int obj) { if (!(count >= 0)) return " "; if (!(count = 0)) return " "; return ""; } private string put_PostCondition(int obj,int OLD_count) { if (!(!IsEmpty())) return " "; if (!((int)representation[count-1] == obj)) return " "; if (!(count == OLD_count + )) return " New count = Old count + 1"; return ""; } Project biên dịch theo source code Bắt kiện OnBuildDone project, thực việc trả lại source code cũ cho project 93 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# 16.2 Thiết kế 16.2.1 Tổng thể Hình 16-1: Sơ đồ thiết kế tổng thể Danh sách lớp đối tượng: STT Tên Ý nghĩa Màn hình cho phép người dùng enable disable Configuration chức kiểm tra PreCondition, PostCondition, Invariant Connect Lớp chương trình, lớp quản lý thao tác Add-In với project 94 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# Lớp đối tượng để lưu trữ thông tin project ProjectInfo ClassInfo FunctionInfo Assertion Extra 16.2.2 16.2.2.1 hành Lớp đối tượng để lưu trữ thông tin lớp project Lớp đối tượng để lưu trữ thông tin phương thức class Lớp đối tượng để lưu trữ thông tin Assertion (precondition, postcondition, invariant) Lớp đối tượng chứa hàm riêng, không thuộc trách nhiệm lớp Chi tiết lớp đối tượng Màn hình Configuration Hình 16-2: Màn hình Configuration 95 Tìm hiểu cơng nghệ Design By Contract Xây dựng cơng cụ hỗ trợ cho C# Hình 16-3: Chi tiết hình Configuration Danh sách đối tượng thể hiện: STT Tên Loại / Kiểu chkPreCondition checkbox chkPostCondition checkbox chkInvariant checkbox chkBasePre checkbox chkBasePost checkbox chkBaseInv checkbox btnOK Button btnClose Button Ý nghĩa Xác định có sử dụng PreCondition hay khơng Xác định có sử dụng PostCondition hay khơng Xác định có sử dụng Invariant hay khơng Xác định có sử dụng PreCondition lớp dẫn xuất hay không Xác định có sử dụng PostCondition lớp dẫn xuất hay khơng Xác định có sử dụng Invariant lớp dẫn xuất hay không Đồng ý với thông số chọn khỏi hình Thốt khỏi hình 96 .. .Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# chuỗi //str.Length >= 10 giá trị cho trước Yêu cầu đối tượng nhập vào Void SetData([NotEqual (5)]... (count == 0)")] public bool IsEmpty() { return count == 0; } 87 Tìm hiểu công nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# [Requires ("position >= && position < count")] [Ensures ("current... PostCondition) hay khơng Lưu thông tin Invariant (các mệnh đề thông báo 88 Tìm hiểu cơng nghệ Design By Contract Xây dựng công cụ hỗ trợ cho C# tương ứng Invariant) có, sau đó, duyệt qua hàm lớp, hàm, thực