Tạo phần Model

Một phần của tài liệu (Luận án tiến sĩ) Các kỹ thuật chuyển đổi mô hình và sinh mã trong phát triển ứng dụng web hướng mô hình (Trang 108 - 113)

Trong phần này, luận án phát triển các quy tắc và giải thuật sinh mã nguồn tự động từ các mô hình theo phương pháp UWE (UML-based Web Engineering) để tạo ứng dụng web chẩn đoán bệnh thủy sản (benhthuysan.vn). Các quy tắc được thực nghiệm bằng ngôn ngữ chuyển đổi ATL, đảm bảo hiệu quả chuyển đổi mô hình cho phát triển ứng dụng Web hướng mô hình theo kiến trúc MVC. Luận án đưa phương pháp tiếp cận MDE để tạo ra các ứng dụng Web từ các mô hình theo phương pháp UWE. Luận án đã cải tiến xây dựng một số quy tắc, giải thuật sinh code tự động nhằm cải tiến, nâng cao hiệu quả chuyển đổi từ mô hình UWE sang code và xây dựng công cụ CODEGER-UWE để xây dựng các ứng dựng Web. Đây là một phương pháp với quy trình phát triển rõ ràng và tiện dụng.

Trong bài báo công bố năm 2018, tác giả đã đề xuất bổ sung một số quy tắc chuyển đổi sang mô hình xử lý và mô hình trình bày, nhằm cải tiến, nâng cao hiệu quả chuyển đổi mô hình UWE từ công cụ MagicUWE. Nghiên cứu đã phát triển 03 quy tắc sinh mã từ mô hình PSM: Quy tắc CM2M sinh mã thành phần Model từ mô hình nội dung; Quy tắc PRES2V sinh mã thành phần View từ mô hình trình bày và Quy tắc NPROM2C sinh mã thành phần Controller từ mô hình điều hướng và xử lý. Tương ứng với 03 quy tắc này, đã xây dựng 03 giải thuật sinh mã: CM2M, NPROM2C, PRES2V. Từ các quy tắc, giải thuật xây dựng, tác giả đã xây dựng công cụ CODEGER-UWE để hỗ trợ sinh mã nguồn cho ví dụ “Address Book”. Công cụ ODEGER-UWE đã cho phép sinh mã nguồn từ bốn mô hình UWE tương ứng với các thành phần trong mô hình Web MVC. Kết quả cho thấy, sinh mã tự động tốt hơn, đây là một vấn đề thiết thực, nhằm tăng năng suất, tiết kiệm thời gian, chi phí cho nhà phát triển.

Kế thừa các kết quả nghiên cứu đã được công bố và được trình bày tại mục 3.2 của luận án. Trong nội dung này, nghiên cứu tập trung hoàn thiện các quy tắc và giải thuật sinh code từ các mô hình UWE bằng ATL. Như thế, chúng ta sẽ có một tập các quy tắc sinh code đầy đủ. Cụ thể, các mô hình mức PIM trong UWE sẽ được chuyển đổi sang thành phần tương ứng trong kiến trúc MVC (hình 3.18):

- Mô hình nội dung và mô hình xử lý được chuyển đổi sang thành phần Model, Trong đó, mô hình nội dung dùng để định nghĩa cấu trúc cơ sở dữ liệu, mô hình xử lý định nghĩa các hàm, phương thức mà Model cần cung cấp cho Controller (các Service trong Spring).

- Mô hình điều hướng được chuyển đổi sang thành phần Controller. - Mô hình trình bày được chuyển đổi sang thành phần View.

Hình 3.18.Sơ đồ chuyển đổi mô hình và sinh code

Module sinh code gồm có 2 thành phần, phần model-to-model cho phép chuyển đổi từ các mô hình mức PIM sang các mô hình mức PSM (mô hình Java và mô hình JSP), phần model-to-code cho phép sinh code từ các mô hình mức PSM thu được thành các file mã nguồn .java và .jsp.

a. Chuyển đổi mô hình nội dung

Mô hình nội dung chứa biểu đồ lớp của ứng dụng web được mô hình hoá bằng các phần tử mô hình UML 2.0 tiêu chuẩn. Mỗi class trong mô hình nội dung được ánh xạ với một class trong phần model, các thuộc tính được để private và được truy cập thông qua các phương thức getter, setter.

Quy trình thực hiện gồm các bước như sau: Bước 1: Đọc mô hình nội dung, tìm gói Content

Bước 2: Với mỗi class trong gói Content, tạo class Java với tên tương ứng, sau đó

lấy ra danh sách các thuộc tính của class

Bước 3: Với mỗi thuộc tính của class, tạo thuộc tính tương ứng và các phương

thức getter, setter trong class đó.

Trong kiến trúc MVC thành phần Model chứa các lớp dùng để định nghĩa cấu trúc cơ sở dữ liệu (mỗi lớp tương ứng với một bảng, mỗi trường tương ứng với một cột của bảng trong cơ sở dữ liệu). Việc chuyển đổi từ mô hình nội dung sang mô hình Java được thực hiện dựa trên 08 quy tắc được thể hiện chi tiết tại bảng 3.3.

Bảng 3.3.Các quy tắc chuyển đổi từ mô hình nội dung sang mô hình java

Tên quy tắc Phần tử mô hình nội dung

Phần tử Java tương ứng

Package2Package Package Package

Class2Class Class Class

Tên quy tắc Phần tử mô hình nội dung

Phần tử Java tương ứng

Property2GetterMethod Property Method (get) Property2SetterMethod Property Method (set)

CollectionProperty2Field Property (số nhiều) Field (Set hoặc List) CollectionProperty2

GetterMethod

Property (số nhiều) Method (get)

CollectionProperty2 SetterMethod

Property (số nhiều) Method (set)

Cụ thể, quy tắc Package2Package được thực hiện như sau: 1 rule Package2Package { 2 from 3 p: UWE!Package ( 4 p.name = 'Content' 5 ) 6 to 7 jp: JAVA!Package ( 8 name <- thisModule.getModelName().toLower() + '.model',

9 classes <- p.packagedElement -> select(e |

10 e.oclIsTypeOf(UWE!Class))

11 -> collect(e | thisModule.Class2Class(e))

12 )

13 }

b. Chuyển đổi mô hình xử lý

Mô hình xử lý thể hiện các hành vi trong ứng dụng web mà controller sẽ thực hiện. Model cần cung cấp phương thức tương ứng để controller gọi khi muốn thực hiện hành vi nào đó. Phần tử ProcessClass trong mô hình xử lý chứa thuộc tính contentClass tham chiếu đến class trong mô hình nội dung cho biết hành vi đó ứng với model nào, mỗi hành vi ứng với một phương thức của service trong kiến trúc MVC.

Quy trình thực hiện gồm các bước như sau: - Bước 1: Đọc mô hình, tìm gói Content.

- Bước 2: Với mỗi class trong gói Content, tạo class Service tương ứng trong Java,

- Bước 3: Với mỗi hành vi ứng với ProcessClass, tạo phương thức tương ứng

trong class Service.

Các quy tắc chuyển đổi được thực hiện bằng ngôn ngữ ATL cụ thể như sau:

1 module Process2Java;

2 create OUT: JAVA from IN: UWE; 3 helper def: getModelName(): String =

UWE!Model.allInstances().first().name; 4 rule Package2Package { 5 from 6 p: UWE!Package ( 7 p.name = 'Content' 8 ) 9 to 10 jp: JAVA!Package ( 11 name <- thisModule.getModelName().toLower() + '.service', 12 classes <- p.packagedElement 13 -> select(e | e.oclIsTypeOf(UWE!Class)) 14 -> select(e | UWE!ProcessClass.allInstances() 15 -> select(pc | pc.contentClass = e).size() > 0) 16 -> collect(e | thisModule.Class2Class(e))

17 )

18 }

19 lazy rule Class2Class {

20 from

21 c: UWE!Class

22 to

23 jc: JAVA!JavaClass (

24 annotation <- '@Service', 25 name <- c.name + 'Service', 26 isAbstract <- c.isAbstract, 27 isPublic <- true, 28 isInterface <- false, 29 members <- UWE!ProcessClass.allInstances() 30 -> select(pc | pc.contentClass = c) 31 -> collect(pc | pc.baseClass) 32 -> collect(bc | bc.ownedOperation 33 -> select(e | true)).flatten()

34 -> collect(o | thisModule.Operation2Method(o))

35 )

36 }

37 lazy rule Operation2Method {

38 from 39 o: UWE!Operation 40 to 41 m: JAVA!Method ( 42 name <- o.name, 43 isPublic <- true, 44 isStatic <- false, 45 parameters <- o.ownedParameter 46 -> collect(p | thisModule.Parameter2MethodParameter(p)), 47 body <- '' 48 ) 49 }

50 lazy rule Parameter2MethodParameter {

51 from 52 p: UWE!Parameter 53 to 54 mp: JAVA!MethodParameter ( 55 name <- p.name, 56 type <- p.type.name 57 ) 58 }

Gói service thuộc thành phần Model, chứa các phương thức liên quan đến dữ liệu mà ứng dụng cần gọi đến (truy xuất cơ sở dữ liệu, chuyển đổi, kiểm tra dữ liệu hợp lệ,…). Do đó, các hành vi trong mô hình xử lý được dùng để định nghĩa các phương thức cho các service. Tác giả đã phát triển 04 quy tắc để thực hiện việc chuyển đổi từ mô hình xử lý sang mô hình java (Bảng 3.4)

Bảng 3.4.Quy tắc và các thành phần của mô hình xử lý và Java

Tên quy tắc Phần tử mô hình xử lý Phần tử Java tương ứng

Package2Package Package Package

Class2Class Class (Content class được ProcessClass tham chiếu)

Tên quy tắc Phần tử mô hình xử lý Phần tử Java tương ứng

Operation2Method Operation (của ProcessClass)

Method (của Service class)

Parameter2MethodParameter Parameter (của các Operation)

MethodParameter

Một phần của tài liệu (Luận án tiến sĩ) Các kỹ thuật chuyển đổi mô hình và sinh mã trong phát triển ứng dụng web hướng mô hình (Trang 108 - 113)

Tải bản đầy đủ (PDF)

(145 trang)