Hiện nay, đã có một vải phường pháp khác nhau được đề xuất nhằm kiểm tra tính đứng dắn của kịch bản tại các giai doạn thiết kế và m8 nguồn chương trình như các phương pháp kiểm chứng |1
Trang 1
ĐẠI HỌC QUOC GIA HANOI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Lê Ngục Minh
KIEM CHUNG MOT SO RANG BUOC TRONG
CHƯƠNG TRÌNH JAVA SỬ DUNG AOP
LUAN VAN TIIAC SI
HANOI - 2015
Trang 2BALHOC QUOC GIA HA NOL
TRƯỜNG ĐẠI HỌC CÔNG NGHỊ:
1ê Ngọc Minh
KIEM CHỨNG MỘT SỐ RÀNG BUỘC TRONG
CHƯƠNG TRÌNH JAVA SỬ DỤNG AOP
Trang 3LOI CAM DOAN
Tôi xin cam doan dây lả công trình nghiên cửu của riêng tôi Các kết quá trinh bảy trong luân văn là hoàn toàn trung thực, chưa được công bố trong bắt kỷ công trình
Trang 4LOI CAM ON
Trong quá trình thực hiện để tải, tôi đã gặp rất nhiều khỏ khăn và bỡ ngỡ Nếu không có sự piúp đỡ, động viên chân thành của các thầy cô và bạn bè dỗng nghiệp
có lẽ tôi khó có thể hoàn thành tốt luận văn nảy
Trước hết tôi xin tỏ lỏng biết ơn sâu sic dén TS Trịnh Thanh Bình đã tận tình hướng dẫn trong suốt quá trình viết luận văn
Tôi xin trân trọng cảm ơn quý Ihầy, Cô và bạn bè trong khoa Công nghệ thông tin, rường Đại học Công nghệ, Đại học Quốc Gia Hà Nội đã tận tình truyền
đạt kiến thức, sắt cảnh và trấi nghiệm củng tôi trong suốt những năm học lập tại
đây Với vẫn kiến thức được tiếp thu trong quả trình học là nền Ling cho quá trình nghiễn cứu luận văn
Tôi xin trân trọng cảm ơn Đảng ủy, Ban Giám hiệu, Ban chủ nhiệm khoa Công nghệ thông tin trường Đại học Hải Phỏng dã tạo diễu kiện cho tôi trong suốt quả trình học tập và lâm luận văn này
Cuối cùng tôi gửi lời cảm ơn đến vợ con, gia đình đã động viên giúp đỡ tôi trong những lùc khó khăn trong công Tác và học tập
Xin trân trọng câm ơnl
Trang 5DANH MUC CAC BANG
21 Ảnh xạ giữa các loại foin point va pointcut tuong ing 8
2.2 Vidu vé một khía cạnh với mã hành vì trước vả sau 9
3.1 Đặc tả kịch bản mô tả chức năng rút tiền tự động của máy 14
ATM
41 Cài đặt chương trình cho kịch bân kiểm tra các assertion 23
42 Cài đặt kịch bản mô tá chức năng rút tiền từ tài khoắn 24
4.3 | Cai dat kich ban mé ta chite nang chuyén khoản 28
Trang 6
11 Kịch bán biểu diễn phép chia hai số nguyên 1
21 Điểm nối thực thị va triệu pọi phương thức 7
2.2 | Ví dụ minh họa về đặc tả JMI "
3.1 |Phương pháp kiểm chứng ràng buộc của kịch bán trong | 15
chương trình Java sử dụng ADP
43 Kết quả kiểm chứng kịch bản 1 vi pham đặc tả 22
4.4 | Kết quả kiếm chứng kịch bản 1 không vi phạm 22
45 là kết quá kiểm tra các assertion cho kịch bản được cải đặt sai 24
46 Kết quả kiếm tra các assertion cho kịch bản cải đặt đúng 24
47 M6 tA tao Aspect vai bai toán rút tiền đơn giản 27
tỉ
Trang 7
IDK {Java I3evelonment Kit
J]PE Java Path kinder
Trang 8
4.2 Công cụ và môi trường xây dựng dương trình thực —- Xeeereerev T7
4.2.1 JDK he lái N — ú i eee LT
vi
Trang 10CHƯƠNG 1 GIỚI THIỆU
1.1 Đặt vấn đề
Phân tích va dặc tả yêu cầu đóng vai trỏ quan trọng trong quá trình xây dựng và phát triển phần mềm Các yêu cầu phần mồm thưởng được đặc tả dưới đạng cae
ca sử dụng {use case LIC) m6 14 loan b6 sur tương tác giữa người dùng và hệ
thống Trong mỗi tài liệu đặc tả, mô hình UC biểu diễn kịch bản mô tả các bướu
mà hệ thống cần tuân thủ để thực hiện mệt nhiệm vụ Một kịch bản thường, sâm
các thành phần như : sự kiện, sự tương tác giữa các sự kiện, các biểu thức tiền
điêu kiện (precondition) vả hậu điều kiện (postcondition), xác nhận (assertion)
Trong đé, tiên điều kiện và hậu điều kiện định nghĩa các ràng buộc mà kịch bản buộc phải thỏa mãn khi bắt đầu và kết thúc thực thi một nhiệm vụ assertion đặc
tả một thuộc tính mả kịch bản phải thoả mãn tại một thời điểm nào đó Cuối
củng, kịch bản sẽ được được cài dặt bởi các doạn mã nguồn chương trình Hình
1.1 biểu diễn một kịch bản ở mức mã nguẫn thực hiện phép cha hai số nguyễn dương, với biểu thức tiền diều kiện là y khác không va hậu điều kiện là kết quá
của phép chia x cho y
return (x / yy;
Hink 1.1 phép chia hai sb nguyén
Việc kiểm tra tính đúng đắn của một kịch bản bao gồm kiểm tra các biểu thức tiền-hậu điều kiện và cdc assertion có thể thực hiện ở các giai đoạn đặc tả hoặc
mã nguồn chương trinh Hiện nay, đã có một vải phường pháp khác nhau được
đề xuất nhằm kiểm tra tính đứng dắn của kịch bản tại các giai doạn thiết kế và m8 nguồn chương trình như các phương pháp kiểm chứng |1 J, kiểm thử|4| Mẫ: phương pháp đều có những ưu và nhược điểm nhất dịnh Các phương pháp kiểm
thử yêu cầu phải có mã nguồn và các ca kiểm thứ (test case) thường chỉ phát
hiện được các lỗi về giá trị đầu ra (output) nhung khéng phat hiện được các lỗi
vị pham rảng buộc thiết kế 'Irong khi đỏ một vi pham ràng buộc thiết kế có thể gây ra lỗi hệ thẳng, đặc biệt khi tích hợp nhiều médun thì việc xác định chính xác vị trí gây lỗi sẽ rất khó khăn làm cho chỉ phí phát triển tăng cao [1] Các phương pháp kiếm chứng như chứng mình định lý (theorem proving)[5] va kiém
1
Trang 11chứng mô hình (model checking) |3| đã được ứng dụng thánh công để kiểm chứng bản thiết kế phần mềm nhằm phát hiện sớm những lỗi tiềm Ấn, giảm thời
gian vả chỉ phí phát triển Ngược lại, các phương pháp kiểm chứng tại mức mã
nguồn nhằm kiểm tra sự tuân thủ giữa bản thiết kế và cải dặt của phần mềm
1.2 Mục tiêu
14 mụơ liêu la nghiên cứu về một sẽ kĩ thuật kiểm hứng phần
Luận văn đã
mềm từ dó dễ xuất cách tiếp cân kiểm chứng các biểu thức tiễn-hậu điều kiện và
các xác nhận của kịch bản lại mức mã nguồn sử dụng phương pháp lập trình
hướng khía canh (Aspect oriented nroprammine-AOP) Các mục tiêu cụ thể cần
đạt được là:
© Khảo cứu một số phương pháp kiếm chứng chương trình; mô hình ca sử
dụng trung phân tích thiết kế và đặc tã yêu câu phần mềm; phương pháp
lập trình hưởng khía cạnh, ngôn ngữ mô hình hoá IML (lava modchng language)
® Dễ xuất một cách tiếp cân để kiểm chứng các biểu thức tiền-hậu điều kiện
và xác nhận của kịch bản sử dụng phương pháp lập trình hưởng khía
cạnh;
® Xây dựng và thử nghiệm thảnh công công cụ kiểm chứng một số rằng
buộc của kịch bản tại mức mã nguồn chương trình
1.3 Đóng góp của luận văn
Đông góp chính của luận văn lá đề xuất và xây dựng thành công một công cụ kiểm chứng một số ràng buộc uửa một kịch bản tại thời điểm thực thi (mức mã nguồn) Các kết quả chính như sau
«Tìm hiểu vả trình bày một số phương pháp kiểm chứng, kiểm thử phần
mềm, phương pháp lập trình hướng khía cạnh vii Java (Aspect!) ngôn
ngữ mô hình hóa TMI.,
© Đề xuất va xây dựng thành công một công cụ để kiểm tra một số Tảng
buộc kịch bản tại thời điểm thực thi, ap dung cho các kịch bản được cải
dất trên ngôn ngữ lập trình Java
1.4 Cấu trúc luận văn
Luận văn gồm 4 chương chính được câu trúc như sau:
* Chương 1: Giới thiệu bài toán kiếm chứng một số ràng buộc của kịch bản,
mục tiêu và các đóng góp của luận văn,
© Chuong 2: Trình bảy một số kiến thức cơ sở cho mục tiêu nghiền cứu và
các đóng góp của luận văn;
2
Trang 12Chuong 3: Dé xuat phuong phap kiém chimg mét số rằng buộc của kịch bản trong chương trinh Java,
Chương 4: Giới thiệu chương trình thực nghiệm và các đóng gúp,
Chương 5: Kết luận và hướng phát triển của luận văn
Trang 13CHƯƠNG 2 KIEN THỨC CƠ SỞ
Trong chương này luận văn trình bảy một số kiến thức nền về kiểm chứng phần
mềm tại thời điểm thực thị, phương pháp lập trình hướng khía cạnh, ngôn ngữ
mô hình hóa IML Đây là các kiến thức cơ sở được sử dụng cho các đóng góp của luận văn trong chương 3 và chương 4
2.1 Kiếm chứng phần mềm
Kiểm chimg phan mém (software verification) la tap các nguyên lý phương
pháp vả công cụ nhằm báo dấm tính đúng đấn của phần mềm, trong mục này luận văn trình bày hai phương pháp kiểm chứng phần mềm là kiếm chứng hình
thức và kiểm chứng tại thời điểm thực thị chương trình
2.1.1 Kiểm chứng hình thức
Thương pháp kiếm chứng mô hình (model checking)|3| dược sử dụng dé xac
định tính hợp lệ của một hay nhiều tính chất mà người dùng quan tâm trong một
mô hình phần mềm cho trước Cho mô hình M và thuộc tính p cho trước, nó
+kiểm tra liệu thuộc tỉnh p có thỏa mãn trong mô hỉnh M hay không, kỷ hiệu M =
p Về mặt thực thị, kiểm chứng mô hình sẽ duyệt qua oác trạng thái, các đường,
thực thi có thể có trong mô hình M để xác định tính khả thỏa của p Trong đó,
các thuộc tính được đặc tả bằng logic thời gian LTL hoặc CTL Mồ hình XI là
một cấu trúc Kripke gồm bến thành phần M = (8, So, L,R) với § là một tập hữu han cdc trang thai, Sy € S 1a trang thai du, R C SxS 1a quan hệ chuyển trang thái, 1: 8 > 247 a ham gan nhãn với AP là tập hữu hạn các mệnh dé nguyén tit được xây dựng từ hệ thông
Một bộ kiếm chứng mô hình (model checker ) sẽ kiếm tra tắt cả các trang thái có
thể có của mô hình để tìm ra tất cá các đường thực thi có thé gây ra lỗi Do đó
không gian trạng thái thường là vô củng lớn nếu không muôn nói là vô hạn Vì
vậy việc phải duyệt qua tất sả các trạng thái là bất khả thi Để đối phó với bài
toán bùng nỗ không gian trạng thái đã có một vải nghiên cứu liên quan đến các
kỹ thuật làm giám khéng gian trang thai nhy Abstraction, Slicing
2.12 Chứng minh định lý
Phương pháp chứng minh định lý (theorem proving) [5] sử đựng các kĩ thuật suy
luận để chứng mình tính đúng đắn của một công thức hay tính khả thỏa của một
công thức F với tất cả các mô hình, ký hiểu |= F Một hệ chứng mình bao gồm các luật suy điễn bao gồm các Liên đề, Một hệ thông được gọi là đúng
(sound) C la nó đều được chimg minh
2.1.3 Kiểm chứng tại thời diễm thực thí
Kiểm chứng Lại thời điểm thực thi (runtirme verilication)[1 | là kĩ thuật kết hợp
giữa kiểm chứng hình thức và thực thi chương trình nhằm phát hiện oáu lỗi của
hệ thống dựa trên quá trình quan sát đầu vao (input), dau ra (outpul) trong khi
thực thi chương trình, các Biát trị đầu ra được quan sát để kiểm tra tỉnh thỏa được
so với đặc tả yêu cầu phần mềm So với phương pháp kiểm chứng tĩnh thi kiểm
4
Trang 14chứng tại thời điểm thực thi được thực hiện trong khi chạy chương trình
Phương pháp này thường được sử dụng để kiểm tra sự tuân thủ giữa bản thiết kế
sự cải đặt của nó áp dụng cho các ngôn ngữ lập trình cụ thể, điển hinh là lava
với các công cụ kiểm chứng như IPF [8,15], JLO, ESC/1ava, Một số tru điểm
của phương pháp kiểm chứng tại thời điểm thực thi[ 14] như sau:
2.2 Phương pháp lập trình hướng khia cạnh
Phương pháp lập trinh hung khia canh (Aspeet-Oriented Programming) [8,12]
là phương pháp lập trình phát triển trên tự đuy tách biệt các mỗi quan tấm khá
nhau thành các môđun khác nhau Ở đề một mỗi quan tâm thường không phải
là một chức năng nghiệp vụ eụ thể và e d ú a
(thuộc tinh) chung mà nhiều môđun phần mềm trong cùng hệ thống nên có, ví
đụ như lưu vết thao tác va Ii (error logging) Với AOP, chúng ta có thể cài dat các mối quan tâm chung, cắt ngang hệ thống bằng các môđun đặc biệt gọi lá khía canh (aspect) thay vì đàn trải chúng trên các môđun nghiệp vụ liên quan Các khía cạnh sau đó được kết hợp tự động với các môđun nghiệp vụ khác bằng quá trinh gọi là dan (weaving) bằng bộ biên dịch đặc biệt Các wu điểm của phương
pháp AOP được tóm tắt như sau[8,12]
-_ Mô-đun hóa những vấn đề đan xen nhau: AOP xác định vẫn đề một cách
biệt, cho phép mô-đun hóa những vẫn đề liên quan đến nhiễu lứn
-_ Cho phép mở rộng hệ thống đễ đảng hơn: Một thiết kể tốt phải tính đến
cả những yêu cầu hiện tại và tương lai, việc xác định các yêu cầu trong
tương lai là một công việc khó khăn Nhưng nếu bỏ qua các yêu cầu trong tương lai, có thể bạn sẽ phải thay đổi hay thực hiện lại nhiều phần của hệ
thống Với AOP, người thiết kế hệ thống có thể để lại quyết định thiết kế
cho những yêu cầu trong tương lai nhờ thực hiên các aspcct riêng biết
AspectJ [12] là một phương pháp lập trình AOP áp dụng cho ngôn ngữ Java
Trinh bién dich AspectJ sé dan xen chuong trinh Java chính với các khía canh
thành các tệp mã byiecode chạy trên chỉnh máy ảo Java Trong các mục tiếp theo của luận văn, tôi trình bảy một số khái niệm liên quan trong AspectJ được
3
Trang 15„ Ậ 5 Lad án với cáp rẻ ấn về biến thức Đến và
sứ dụng để sinh mã kiểm chứng kịch bản với các rằng buộc về biểu thức tiễn và
Am điền kiên và cá ñ
hậu điều kiện và các assertion
2.2.1 Thực thí cắt ngang
Trong AspectJ, quả trình trình biên dich thực thi các quy tắc dan dễ dan kết ác
môdun cất ngang vào môdun nghiệp vụ chính dược gọi là thực thi cắt ngang (erosscutting) AspccUT định nghĩa hai loại thực thì cắt ngàng là thực thí cất
ngang động và thực thị cắt ngang tĩnh:
© Thực thi cắt ngang động (đynamie crosscutting) la việc đan các hành vi
mới vào quá trình thực thí một chương trính Trình biên dich sé dua vau
tập các quy tắc dan dé xac dinh điểm dan và chèn thêm hoặc thay thể
luồng thực thi chương trình chính bằng môđun cắt ngang, từ đó làm thay đổi hành vi của hệ thống Hầu hết việc thực thi cắt ngang trong ÀspectT
đều là thực thi cắt ngang đông
«_ Thực thi cắt ngang tĩnh (sLatic crosscutting) là quá trình đan một sửa đổi vào cấu trúc tĩnh của lớp, piao diễn hay các khía cạnh hệ thống Chức
năng chính của thực thi cắt ngang tĩnh là hỗ trợ cho thực thi cắt ngang
động Vỉ dụ như thêm đữ liệu và phương thức mới vào lớp dã có nhằm
định nghĩa trang thái và hành vi của lớp đó để sử dụng trong các hành vi cắt ngang động Thực thi cắt ngang tĩnh còn được sử dụng nhằm khai báo
các cảnh báo và lỗi tại thời điểm biên dịch cho nhiều môđun
rong AOP, mỗi khía canh được coi lả biểu diễn của một quy tắc đan, né chỉ ra
môdun cần được dan, vị trí dan trong, médun do, hành vị sẽ dược đan vào thông,
qua các định nghĩa của điểm nỗi, hướng cắt va mã hành vì
2.2.2.Diém néi
Điểm nối Goinpoint) 1a mét điểm có thể xác định trong quá trình thực thi một
chương trình, điểm này chỉnh là vị trí mà các hành động thực thị cắt ngang được
dan vảo Trong Aspect] cỏ môt số loại điểm nối được chia thành hai loại thực
thi và triệu hồi phương thức sau
« Điểm nối thực thi phương thức (method execution joinpoinÐ: diễm này
nằm trên chỉnh phần thân của phương thức thực thi, nó gồm toản bộ các lệnh nằm trong thân phương thức,
©_ Điểm nối triệu gọi phương thức (method oall jompoinl): điểm này nằm
trên phần chương trình pợi phương thức dang xét, nẻ chỉnh lả diễm mà
phương thức đang xét dược gợi
Trang 162 : pe class Datakccess { 2 public aspect LogbateAccessAspect {
3 //private Log log = new Log(); 3 prate Log log = new Log();
public void creatData(){ pointcut dataAccessExecution() : (execution(public * DataAccess.*( )));
5 {Mog Legh call create data’); a before() : datakccessExecution(}{
6 Systen.out.println("Create Data Record "); ý Jog loghessage("call "+ thisloinPointStaticPart.getSignature());
public void updatedata(){ after() : dataàccessfxecutien(){
ÍIlog.1ogfessage("caÌ1 update date");
systen.out.printin("Update Data Record, ");
}
S145 pubic void deleteata(){
System.out.println("After execution call”);
iệu gọi phương thức
Trong Aspect], điểm nối thường được sử dụng trong một hướng, cắt (pointcut), mỗi hướng cắt chứa một nhóm các điểm nối cùng với ngữ cảnh của nó Ta có thể khai báo hướng cắt trong một khía cạnh, một lớp hoặc một giao diện Giống như phương thức, có thể sử dụng định danh truy cập (public, private) dé gidi han quyền truy cập đến hướng cắt Các hướng cắt có thể có tên hoặc không tên Các
hướng cắt khong tên, giông như các lớp không tên, được đính nghĩa tại nơi sử
dụng Các hướng cắt được đặt tên thì có thể được tham chiều từ nhiều nơi khác
Cú pháp khai báo hướng cắt như trong sau [12] [15]
[access specifier] pointcut pointcut-name([args]):
pointcut-definition
Vidu: pointcut callSayHello(): call(* *.sayHello());
Trong do [access specifier] khai bao định danh truy cập có thé 1a public hoặc private, [pointcut name] khai báo tên của hưởng cắt, [args] khai báo các tham sô, cuôi củng [pointcut-definition]là định nghĩa hướng cắt
Bang 2.1 Ánh xạ giữa cac loai join point va pointcut tương ứng
Cu phap pointcut Loai join point
execution (MethodSignature) “Thực hiện phương thức
call (MethodSignature) Gọi phương thức execution (ConstructorSignature) | Thực hiện hàm dựng
Trang 17call (Conscructorsi mature} Goi ham dung
execazion handier(Typesignature} Thực hiện điều khiển ngoại lệ
‡aitializatien (Constzuetor3izaat+ Khởi tạo đối tượng
fEeisiLiaLizaL ten (EonsL casLorEig=- Tiền khởi lạo đối tượng
advi seexecution (] ‘Vhue hién advice
2.2.4 Ma hanh vi
Mũ hành vị (advicc) là doan mã định nghĩa hành vi được dan vào mã nguồn tại
điểm điểm nối [12][15] Mã hành vị được thực thi trước (before advice), sau (aller advioe}), hoặc xung quanh (around advice) một điểm nổi Mã hành vi có
thể được St dụng để đưa ra thông báo trước khi đoạn mã tại điểm nôi được thực thi lưu vết hoặc kiểm tra lỗi Trong Aspect] định nghĩa ba loại mã hành vi sau
© Mã hành vi trước lả loại mã được thực thi trước các điểm nối,
© Ma hanh vi sau là loại mã được thực thì ngay sau các điểm nối,
© Mã hành vi xung quanh lá loại mã mạnh nhất, nó bao gầm cả mã hành vi trước và sau Mã hành vi xung quanh có thể chỉnh stra doan mã Lại điểm
nối, nó có thể thay thế, thậm chỉ bó qua sự thực thì của điểm nổi dó Mã
hành vị xung quanh phái khai báo giá trị trả về cùng kiểu với kiểu trả về
của diễm nối Trong mã hảnh vi xung quanh, sự thực thi cia diém nối được thể hiện thông qua proceed(Q) Nếu trong mã hành vi không gợi
proceed(Q) thì sự thực thi của điểm nếi sẽ bị bỏ qua
Bảng 22 biểu điển một khía cạnh với mã hành vị trước vả sau Như vậy diễm
nổi và mã hảnh vi kết hợp với nhau tạo nên quy tắc thực thì cắt ngàng, động
hưởng cắt xác định các điểm cắt cần thiết còn mã hành vi cung cấp cá hành
động sẽ xây ra tại điểm nói đó
Bang 2.2 Ví dụ về một khía cạnh với mã hành vi trước và sau
Trang 18
Ta cỏ thể xây dựng các ađvice như sau:
-_ Before advice thực hiện lưu vẽt
đặc điểm sau, Bang 2.3
© Cd thé sit dung cdc dinh danh pham vi truy cap ({public, private, proteoL})
cho nó Ngoài ra khía cạnh còn có thể có định danh phạm vi truy cập
“privileged”, dinh danh nay cho phép khía cạnh có thể truy cập đến các
thành viên riêng của các lớp mà chúng cắt ngang,
©_ Có thể khai báo khía cạnh trừu tượng bằng từ khóa ahstract,
® Khia cạnh không thé được thé hiện hỏa trực tiếp,
© Khia cạnh có thể kế thừa các lớp và các khía cạnh trừu tượng khác, có thể
thực thí các giao điện nhưng không thể kế thừa từ các khía cạnh cụ thể
(không trừu tượng),
© Khia cạnh có thể nằm trong các lớp và các giao diện
Bảng 2.3 Cầu trúc cơ bản của một khía cạnh
Trang 192.3 Ngôn ngữ mô hình hóa JML {Java modeling language)
TML (Iava Modeling Language)[7][10] là ngôn ngữ đặc tả hành vị, được sử dung dé đặc tả hành vi của các mô đun trong ngôn ngữ lava TML là sự kết hợp phương pháp thỏa thuận với phương pháp đặc tả dựa trên mô hình của ngôn ngữ Larch [13] JML str dung logic Hoare [14] kết "hợp với việc đặc tả các tiển/
hậu điền kiện (pre-4post-condition) và các bất biến (imvariant) của các thuộc
tính, các cầu trúc
Các đặc tả TML được thêm vàu mã Java dưới đạng các chú giải (annotalion}
bên trong các chú thích (comment) Các chú thích trong ngôn ngữ lava được hiểu như là các chú giải TML khi nó bắt đầu bằng ký tự “@” Vị dụ trong Tinh
2 mỉnh họa việc sử dụng JML đặc tá cho lớp Purse Trong đó, trường balance được đặc tả với bất biến (mvariant) là balance luôn trong đoạn từ 0 đến MAX BALAMNCL Trường pm là một mảng thuộc kiểu byte với bất biến là pin
có đúng 4 phần tử và các phần tử chỉ có giá tri tir 0 dén 9
public class Purse { final int MAX_BALANCE; int balance;
/{@ invariant 0 <= balance &&
balance <= MAX_BALANCE;
byte[] pin;
/*@ invariant pin [= null &&
pin.length == 4 && (\forall int i; 0<=i&&i<4;
int debit(int amount} thraws PurseException {
if (amount <= balance) { balance -= amount; return balance; }
else { throw new PurseException{""overdrawn by " + amount); }
10
Trang 20Hình 2.2: Ví dụ minh họa về đặc tả JML
Thương thức debit nhận vào đối số amount là đầu vào Phương thửc nảy số trừ
amount vào balance và trả về giá trị của balance sau khi trừ trong trường hợp
balanoe lớn hơn hoặc bằng amounL 'Trong trường hợp balance nhỏ hơn arount,
một ngoại lệ PurseException sẽ được trả về Tiền điều kiện (requires) của phương thức này là amount phải lớn hơn hoặc bằng 0; hậu điều kiện (ensures) là balance bị trừ đi một lượng amount và trả về kết quả sau khi trừ
Phương thức này còn có một hậu điêu kiện nữa cho trường hợp phương thức trả
về ngoại lệ (signals)
2.4 Kết luận
Trong chương này luận văn đã trình bây một số kiến thức cơ sở được sử dụng
cho phương pháp kiếm chứng một số ràng buộc của kịch bản tại thời điểm thực thi được trình bảy trong chương 3 và chương 4
il