Bài giảng Đặc tả hình thức: Chương 9 cung cấp cho người học các kiến thức: Từ mô hình đến cài đặt, design by contract (DBC), ý tưởng cơ bản, ngôn ngữ đặc tả hay ngôn ngữ lập trình, công cụ hỗ trợ,...
Trang 1LOGO
Đặc tả hình thức
Nguyễn Thị Minh Tuyền
Design by contract
Trang 2Từ mô hình đến cài đặt
v Alloy là một phương tiện để thiết kế
hệ thống và diễn giải các thuộc tính
v Ta cần các thiết kế hệ thống này để
cải thiện chất lượng của việc cài đặt
tin thiết kế này thành mã nguồn?
§ Thông tin tĩnh ( multiplicity, invariant )
§ Thông tin về các thao tác (điều kiện trước, điều kiện sau, frame condition, )
Trang 3Design by contract (DBC)
việc mô tả chính xác về ngữ nghĩa
interface
§ không chỉ về cú pháp, ví dụ như signature
§ mà còn cả về các hành vi, ví dụ như hiệu ứng việc
triệu gọi một phương thức
v Được hỗ trợ bằng công cụ
§ cho phép các thuộc tính ngữ nghĩa của thiết kế (mô hình) được chuyển tải thành mã nguồn
§ hỗ trợ một số hình thức thẩm định các thuộc tính đó
Trang 4Ý tưởng cơ bản
§ một hệ thống của các component giao tiếp với nhau
§ tất cả các tương tác đều dựa vào ràng buộc
(contract)
v Ràng buộc có tính hai chiều
§ cả hai phần được ràng buộc lẫn nhau
Trang 6Air travel
Client(Hành khách)
§ Obligation
• Check in 30 phút trước khi máy bay cất cánh
§ Obligation
• Đưa hành khách đến đích
§ Benefit
• Không cần đợi các hành khách đi trễ
• Không cần thiết phải lưu trữ số lượng
hành lý
• Nhận tiền
Trang 8§ Điều kiện trước
§ Điều kiện sau
§ Frame condition
§ Bất biến
Trang 10Ngôn ngữ đặc tả hay ngôn ngữ lập trình
v Tại sao không phải là cả hai?
v Phương pháp tinh chỉnh
§ Thay vì chỉ phát triển các signature
§ Phát triển đặc tả ràng buộc
§ Phân tích tính nhất quán client-supplier
§ Thêm vào các chi tiết cài đặt
§ Kiểm tra rằng mã nguồn thỏa mãn ràng buộc
v Tiến trình tự nhiên từ thiết kế đến mã nguồn
Trang 11Ví dụ
Class Mystack {
private Object[] elems;
private int top, size;
public MyStack (int s) { … } public void push (Object obj) { … } public Object pop() { }
public boolean isEmpty() { } public boolean isFull() { }
}
Trang 12/*@ invariant top >= -1 && top < size; @*/
Class Mystack {
private Object[] elems;
private int top, size;
…
}
Trang 13Class Mystack {
private Object[] elems;
private int top, size;
/*@ requires s > 0;
ensures size == s &&
elems != null && top = -1; @*/
public MyStack (int s) { … }
…
Trang 14Class Mystack {
private Object[] elems;
private int top, size;
/*@ requires !isFull() && obj != null;
ensures top == \old(top) + 1 &&
Trang 15Class Mystack {
private Object[] elems;
private int top, size;
Trang 16Class Mystack {
private Object[] elems;
private int top, size;
…
/*@ ensures \result <==> top == -1; @*/
public boolean isEmpty() { } }
Trang 17Class Mystack {
private Object[] elems;
private int top, size;
…
/*@ ensures \result <==> top == size – 1; @*/
public boolean isFull() { } }
Trang 18Ví dụ 2
import java.util.Vector;
public interface Company {
public Vector getEmployees();
public Vector getRooms();
public void hire(Employee e);
public void move(Employee e, Room r);
public boolean roomsAvailable();
}
public interface Employee{
public boolean hasOffice();
}
Trang 19import java.util.Vector;
public interface Company {
public Vector getEmployees();
public Vector getRooms();
public boolean roomsAvailable();
/* Contract for hire(Employee e) */
/*@ requires e != null;
requires !getEmployees().contains(e); // do not employ twice
requires !e.hasOffice(); // does not own an office somewhere else requires roomsAvailable(); // there must be an office left
ensures getEmployees().contains(e); // added to list of employees
ensures getRooms().contains(e.getOffice()); // assign one of our offices ensures e.hasOffice(); // office assigned
@*/
public void hire(Employee e);
…
Trang 21Design by Contract trong môn học này
§ JML như là một đặc tả
§ ESC/Java 2 là công cụ kiểm tra chính
Trang 22LOGO