1-10 Một chương trình đơn giản, không có nhiều rủi ro. 11-20 Phức tạp hơn, nguy cơở mức trung bình
21-50 Phức tạp hơn, rủi ro cao
CHƯƠNG 4: BÀI TOÁN ỨNG DỤNG TRONG GIẢNG DẠY
Trong chương này tôi sẽ tập chung mô tả bài toán ứng dụng trong giảng dạy. Đồng thời tôi trình bày cách thức mà tôi sẽ giải quyết bài toán này. Bài toán này được tôi tham khảo trong tài liệu số [4].
4.1. Mô tả bài toán
Bài toán mà tôi ứng dụng là xây dựng một hệ thống (ởđây tôi gọi tắt là hệ thống phân tích) hỗ trợ sinh viên học lập trình, nó giúp các sinh viên viết thành công các chương trình java trong giai đoạn học tập đầu tiên của mình. Trong hình 4.1 thể hiện cách vận hành của hệ thống này.
Hình 4.1 Cách vận hành của hệ thống phân tích chương trình java của sinh viên
Sinh viên thực hiện các bài tập lấy từ Cơ sở dữ liệu. Họ hoàn thành các bài tập và biên dịch bằng trình biên dịch java. Nếu có lỗi cú pháp thì trình biên dịch sẽ trả về thông báo lỗi cho sinh viên. Ngược lại nếu không có lỗi thì bài làm của sinh viên (tệp tin *.java) sẽ được đưa qua hệ thống phân tích, hệ thống sẽ đưa ra phản hồi cho sinh viên về giải pháp của sinh viên.
Theo [4], các phân tích đểđưa ra phản hồi cho sinh viên có hai mức độđược thể hiện như hình 4.2:
Phân tích dựa trên các đơn vị đo phần mềm: phân tích này đo sự phức tạp của chương trình. Dựa vào các số liệu tính toán được hệ thống sẽ trả về phản hồi cho sinh viên về chất lượng chương trình của mình.
Hình 4.2 Kiến trúc tổng thể của hệ thống phân tích
Phân tích sự tương tự về cấu trúc: mục đích của phân tích này là để tinh chỉnh kết quả của quá trình phân tích dựa trên các đơn vịđo phần mềm và kiểm tra cấu trúc của giải pháp sinh viên so sánh với các giải pháp mẫu. Trong việc phân tích, giải pháp sinh viên và giải pháp mô hình đều được chuyển sang một hình thức giả mã trừu tượng đại diện cho cấu trúc thuật toán trừu tượng của các chương trình (cây cú pháp trừu tượng). Thể hiện trừu tượng của giải pháp sinh viên và giải pháp mô hình được so sánh để xác định sự khác biệt. Phản hồi cho cả sinh viên chỉ ra sự giống nhau của các giải pháp sinh viên và giải pháp mẫu.
Bằng cách so sánh các giải pháp sinh viên với các giải pháp mẫu, hệ thống này có thể xác định khu vực có độ phức tạp cao trong mã lệnh của sinh viên, chẳng hạn như các phương thức dài. Khu vực chưa từng có giữa các giải pháp sinh viên và các giải pháp mẫu có thể được sử dụng để dự báo và cung cấp thông tin phản hồi tốt hơn cho sinh viên nếu giải pháp của họ cho kết quảđầu ra không chính xác trong phân tích động. Chương trình của SV Chương trình mẫu Hệ thống phân tích Phân tích dựa trên các đơn vịđo phần mềm Phân tích cấu trúc chương trình của sinh viên So sánh Hệ thống phân tích Phân tích cấu trúc chương trình mẫu Phản hồi cho sinh viên AST lưu dưới dạng XML AST lưu dưới dạng XML Phản hồi cho sinh viên
Khi hệ thống không thể tìm thấy một sự phù hợp giữa các giải pháp sinh viên và tất cả các giải pháp mẫu, các giải pháp sinh viên được gửi đến giáo viên để xem xét. Nếu giáo viên nhận ra rằng nó là một giải pháp đúng với bài tập, nó có thểđược thêm vào danh sách giải pháp mẫu.
4.2. Cách giải quyết bài toán
Để giải quyết bài toán này, tôi tiếp cận theo hai cách là: các đơn vịđo phần mềm (software metrics), phân tích sự tương tự về cấu trúc giữa chương trình sinh viên và chương trình mẫu.
4.2.1. Phân tích các đơn vị đo phần mềm
Các đơn vịđo phần mềm là một cách tiếp cận định lượng nổi tiếng được sử dụng đểđo chất lượng phần mềm. Trong phần này tôi sẽ trình bày giải pháp để tích hợp một đơn vị đo phần mềm là Cyclomatic complexity. Sau này tôi có thể thêm các đơn vịđo phần mềm khác nếu muốn.
Cyclomatic complexity có thể đo số lượng đường tuyến tính độc lập thông qua một mô-đun chương trình, nó cung cấp thông tin hữu ích về cấu trúc của một chương trình.
Ở đây tôi cài đặt thuật toán tính Cyclomatic complexity (CC) dựa vào công thức đơn giản hóa như sau:
CC = sốđiểm quyết định + 1 Thuật toán tính CC được mô tả như sau:
Input: Tệp tin chương trình của sinh viên Output: CC
Bước 1: Xác định tệp tin chương trình của sinh viên Bước 2: Gán CC=1
Bước 3: Lần lượt duyệt từng dòng lệnh trong tệp tin chương trình của sinh viên, nếu gặp lệnh (toán tử) quyết định nào thì tăng CC lên 1: CC=CC+1.
Chú ý: Các lệnh (toán tử) quyết định gồm có: if, else, while, case, for, switch, do, continue, break, &&, ||, ?, : , catch, finally, throw, throws, default, return, foreach, elseif, or, and, xor.
Bước 4: Trả về Cyclomatic complexity (CC)
Sau khi tính được số Cyclomatic complexity (CC) thì ta sẽ phản hồi lại cho sinh viên xem với sự phức tạp Cyclomatic complexity (CC) ấy thì nó ảnh hưởng như thế nào đến khả năng bảo trì và kiểm thử với các tiêu chí được đưa ra trong bảng 3.2.
4.2.2. Phân tích sự tương tự về cấu trúc
Đầu tiên chương trình của sinh viên sẽ được chạy bằng trình biên dịch java với tập đầu vào xác định. Đầu ra của chương trình sẽ được so sánh với tập đầu ra mong đợi. Nếu đúng ta chuyển sang phân tích cấu trúc để đưa ra phản hồi về chương trình của sinh viên. Nếu đầu ra sai sẽ thông báo cho sinh viên là giải pháp của họ cho kết quả sai cần kiểm tra lại sau đó sẽ đưa ra một vài cấu trúc chương trình gợi ý cho sinh viên.
Việc phân tích cấu trúc được thực hiện như sau:
Trước tiên, chương trình của sinh viên và các chương trình mẫu được chuyển sang một dạng đơn giản mô tả cấu trúc của chương trình (Dạng cây cú pháp trừu tượng được lưu dưới dạng tệp tin XML).
Ví dụ đoạn mã lệnh đầu vào như sau:
public class bai01 { int s,i;
s=0;
for(i=1;i<=10;i++) S=S+i;
}
Cây AST sinh ra từđoạn mã lệnh trên có dạng
n0 -> n1 // "PROGRAM" -> "CLASS" n1 -> n2 // "CLASS" -> "public" n1 -> n3 // "CLASS" -> "class" n1 -> n4 // "CLASS" -> "bai01" n1 -> n5 // "CLASS" -> "{" n1 -> n6 // "CLASS" -> "VARDECLARATION" n6 -> n7 // "VARDECLARATION" -> "int" n6 -> n8 // "VARDECLARATION" -> "s" n6 -> n9 // "VARDECLARATION" -> "," n6 -> n10 // "VARDECLARATION" -> "i" n6 -> n11 // "VARDECLARATION" -> ";" n1 -> n12 // "CLASS" -> "ASIGMENT" n12 -> n13 // "ASIGMENT" -> "s" n12 -> n14 // "ASIGMENT" -> "=" n12 -> n15 // "ASIGMENT" -> "0" n12 -> n16 // "ASIGMENT" -> ";" n1 -> n17 // "CLASS" -> "LOOP" n17 -> n18 // "LOOP" -> "for" n17 -> n19 // "LOOP" -> "(" n17 -> n20 // "LOOP" -> "i" n17 -> n21 // "LOOP" -> "=" n17 -> n22 // "LOOP" -> "1" n17 -> n23 // "LOOP" -> ";" n17 -> n24 // "LOOP" -> "i"
n17 -> n25 // "LOOP" -> "<=" n17 -> n26 // "LOOP" -> "10" n17 -> n27 // "LOOP" -> ";" n17 -> n28 // "LOOP" -> "i" n17 -> n29 // "LOOP" -> "++" n17 -> n30 // "LOOP" -> ")" n17 -> n31 // "LOOP" -> "ASIGMENT" n31 -> n32 // "ASIGMENT" -> "S" n31 -> n33 // "ASIGMENT" -> "=" n31 -> n34 // "ASIGMENT" -> "S" n31 -> n35 // "ASIGMENT" -> "+" n31 -> n36 // "ASIGMENT" -> "i" n31 -> n37 // "ASIGMENT" -> ";" n1 -> n38 // "CLASS" -> "}"
Cây cú pháp trừu tượng này có thểđược trực quan hóa như sau:
Hình 4.3 Ví dụ một cây AST được sinh ra
Để thuận tiện ta sẽ lưu lại cấu trúc của cây AST này vào một tệp tin XML. Tệp tin XML của ví dụ trên có dạng:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <program> <CLASS> <ASIGMENT>1</ASIGMENT> <LOOP> 1 <ASIGMENT>1</ASIGMENT> </LOOP> </CLASS> </program>
Khi lưu vào tệp tin XML, đểđơn giản tôi giản lược bớt các loại lệnh không quan trọng (không ảnh hưởng đến cấu trúc của chương trình) và chỉđể lại các loại lệnh sau: Khai báo hàm (METHOD), lệnh gán (ASIGMENT), lệnh lặp (LOOP), lệnh điều kiện
if (CONDITION), lời gọi hàm (METHODCALL), nhánh đúng, sai của điều kiện (TRUEBANK), FALSEBANK).
Sau đó, tệp tin XML lưu cấu trúc chương trình của sinh viên sẽ được đọc để so sánh với từng tệp tin XML lưu cấu trúc chương trình mẫu. Chương trình sẽ so sánh từng nút nếu kết thúc sự so sánh mà không tìm thấy sự khác nhau thì kết luận là chương trình sinh viên giống với giải pháp mẫu nào và đánh giá mức độ giải pháp đó. Nếu không tìm thấy giải pháp mẫu nào giống với giải pháp sinh viên thì giáo viên sẽ xem xét giải pháp của sinh viên. Nếu giải pháp này hợp lý có thể bổ sung vào làm một giải pháp mẫu cho bài tập đó.
Để có thể đưa ra được đánh giá cho từng giải pháp của sinh viên thì ta cần thiết kế một cơ sở dữ liệu để lưu lại các bài tập và các giải pháp cho bài tập ấy. Đồng thời ở mỗi giải pháp cũng phải lưu lại mức độđánh giá cho từng bài tập.
Cơ sở dữ liệu lưu các giải pháp mẫu có thểđược thiết kế như sau:
Hình 4.4 Cấu trúc cơ sở dữ liệu của hệ thống 1. Bảng BaiTap 1. Bảng BaiTap
Đây là bảng lưu lại các bài tập của hệ thống đưa ra cho sinh viên làm. Bảng gồm các cột được nêu trong bảng 4.1: