Kiểm tra bất biến trong phương thức main

Một phần của tài liệu Nghiên cứu về kiểm chứng bất biến của đối tượng sử dụng lập trình hướng khía cạnh (Trang 80)

Một giải pháp thay thế giải pháp trên là để khẳng định trong phương thức main ngay sau các lệnh chạy các tiến trình. Có hai cách thực hiện giải pháp này được mô tả ngay sau đây:

Đoạn mã dưới đây minh họa làm thế nào khẳng định được chèn tại vị trí cuối phương thức main, sau tất cả các lệnh tạo đối tượng và các lệnh chạy các tiến trình. Khẳng định tham chiếu đến thuộc tính c.withdrawalAmountPerDay, vì thế, nó tham chiếu đến thuộc tính thông qua đối tượng c.

Cách làm việc của nó như sau. Phương thức main sẽ khởi chạy tất cả các tiến trình và bản thân nó tiếp tục chạy như là một tiến trình chạy song song với các tiến trình khác. Đặc biệt, nó sẽ sẵn sàng để thực thi câu lệnh assert bất cứ lúc nào. Công cụ kiểm chứng mô hình vì thế sẽ thực thi nó trong bất kỳ trạng thái nào. Sau đó khẳng định sẽ thực hiện chức năng như một bất biến phải đảm bảo tại bất kỳ thời điểm nào.

public static void main(String args[]) {

ATMcard c=new ATMcard (0, 3000); c.withdrawMoney(1000);

c.withdrawMoney(1500);

assert(c.withdrawalAmountPerDay<=2000) : "ATMcard.WithdrawAmountPerDay>2000"; }

Một nhược điểm của kỹ thuật này là các nội dung của lớp ATMcard bị để lộ trong chương trình chính, ví dụ nó chỉ làm việc chỉ nếu thuộc tính withdrawalAmountPerDay truy cập được từ bên ngoài lớp. Nếu thuộc tính của lớp là bảo vệ (protected) thì phương thức main phải nằm trong cùng gói (package) với lớp. Nếu thuộc tính của lớp là riêng tư (private) thì chúng ta không thể sử dụng kỹ thuật này. Giải pháp tiếp theo giải quyết được vấn đề này.

Chèn khẳng định gián tiếp bằng việc gọi một phương thức bất biến

Để cho một bất biến là cục bộ đối với một lớp, chúng ta có thể đặt khẳng định trong một phương thức được định nghĩa trong một lớp và sau đó gọi phương thức này trong phương thức main. Điều này được minh họa trong đoạn mã dưới đây. Chú ý rằng chúng ta có thể đặt tên phương thức bất biến (invariant method) với tên tùy thích và nó có thể chứa bao nhiêu khẳng định cũng được. Chúng ta thậm chí có thể định nghĩa vài phương thức bất biến và gọi một số trong chúng tại những chỗ thích hợp.

class ATMcard {

public long withdrawalAmountPerDay; public long balanceAmount;

ATMcard(long w_amount, long b_amount) {

withdrawalAmountPerDay=w_amount;

}

public void withdrawMoney(long amount) {

withdrawalAmountPerDay+=amount;

}

public void invariant(){

assert(withdrawalAmountPerDay<=2000) : "ATMcard.WithdrawAmountPerDay>2000"; }

... }

public class Test {

public static void main(String args[]) {

ATMcard c=new ATMcard (0, 3000);

c.withdrawMoney(1000);

c.withdrawMoney(1500);

c.invariant();

} }

Ưu điểm của phương pháp này là bất biến thực sự cục bộ đối với một lớp. Nhược điểm của phương pháp này là chúng ta vẫn cần phải gọi phương thức bất biến trong chương trình chính, điều này có nghĩa là đối tượng c của lớp ATMcard phải thấy được trong chương trình chính. Giải pháp cuối cùng giải quyết được vấn đề này được trình bày trong mục dưới đây.

Một phần của tài liệu Nghiên cứu về kiểm chứng bất biến của đối tượng sử dụng lập trình hướng khía cạnh (Trang 80)