4.1 Tổng quan về Acceleo
4.1.4 Template trong AcceleoM2T
Nhƣ đã trình bày ở trên việc sinh mã trong Acceleo phụ thuộc vào hai thành phần chính là Metamodel và Modules. Một Module làm nhiệm vụ sinh mã trên các nên tảng công nghệ đã đƣợc xác định, nó là một chuỗi các templates đƣợc xây dựng trên ngôn ngữ MOFM2T (xem mục 3.4.3.3). Các templates trong các modules sinh mã là do ngƣời phát triển tự xây dựng tuỳ vào nhu cầu sinh mã.
Trong module, các file template có đuôi mở rộng là .mtl chứa các đoạn mã, các truy vấn để trích lọc các thông tin biểu diễn trên mô hình nguồn và chuyển đổi sang mã nguồn đích. Để hiểu rõ ràng hơn về cấu trúc một project acceleo và các template sinh mã trong Acceleo, Luận văn sử dụng ví dụ dƣới đây để minh hoạ.
Hình 4.3 Các bƣớc sinh mã trong Acceleo M2T
Ví dụ về sinh mã trên Acceleo sử dụng mô hình UML:
Nhằm minh hoạ chi tiết hơn về nguyên lý sinh mã của Acceleo M2T đã trình bày ở mục 4.1.3, luận văn lấy một ví dụ cụ thể nhƣ sau: Từ một biểu đồ lớp biểu diễn bởi mô hình UML, sau khi chuyển đổi mô hình bằng công cụ Acceleo M2T sẽ đƣợc kết quả là các tệp mã nguồn biểu diễn từng lớp trên ngôn ngữ Java (dạng tệp là TenLop.Java).
Ba thành phần theo nguyên lý sinh mã của Acceleo M2T gồm: mô hình nguồn là một biểu đồ lớp Uml - biểu diễn lớp NhanVien. (xem Hình 4.4). Modules sinh mã là là template generate.mtl (xem Hình 4.6) và đầu ra là mã nguồn NhanVien.Java biểu diễn lớp NhanVien ( xem Hình 4.7)
Hình 4.4 là một biểu đồ lớp dạng mô hình UML biểu diễn lớp NhanVien có các thuộc tính (attribute) là Ho, Ten, NgaySinh, TrinhDo, QueQuan… và các phƣơng thức là getTuoi(), getHoTenDayDu()… Một biểu đồ lớp đƣợc biểu diễn bởi Metamodel của nó. Trong ví dụ này, metamodel của biểu đồ lớp tại Hình 4.4 đƣợc biểu diễn nhƣ Hình 4.5, gồm các thành phần: Class biểu diễn các lớp. Một Class gồm các thuộc tính
Attribute và các phƣơng thức Operator. Mỗi thuộc tính Attribute hay phƣơng thức
Operator có tên (name) và kiểu (type).
Nói một cách tƣờng minh, lớp NhanVien là một thể hiện của Class, các thuộc tính Ho, Ten… là một thể hiện của Attribute và các phƣơng thức getTuoi, getHoTen là một thể hiện của Operator.
-Name Class -name -type Attribute 1 * -name -type Operator 1 *
Hình 4.5 Metamodel của biểu đồ lớp UML
Các Module sinh mã trong AcceleoM2T gồm nhiều template, mỗi template có tên và đuôi mở rộng là .mtl đƣợc lập trình tuân theo chuẩn cú pháp của MOFM2T. Các template này thực hiện duyệt (visitor) các thành phần trong Metamodel của mô hình nguồn và thực hiện sinh mã. Trong ví dụ này, Hình 4.6 biểu diễn nội dung của template generate.mtl làm nhiệm vụ sinh mã Java từ mô hình nguồn. Với khai báo trong thẻ [module generate(…)] cho biết dạng metamodel sử dụng trong template là UML2 phiên bản 4.0.0. Template generate sẽ duyệt các Class để sinh ra file và khai báo một lớp trong Java. Tiếp theo, template thực hiện duyệt các Attribute trong mỗi Class để sinh mã nguồn khai báo các thuộc tính trong lớp Java. Tƣơng tự, thực hiện duyệt các Operator trong mỗi Class để sinh mã nguồn khai báo các phƣơng thức trong lớp Java. Sau khi thực thi việc chuyển đổi mô hình của template generate.mtl đối với mô hình nguồn biểu diễn lớp NhanVien, kết quả mã nguồn là tệp NhanVien.Java nhƣ Hình 4.7.
Hình 4.7 Ví dụ: Mã nguồn NhanVien.Java đƣợc sinh ra
Cú pháp cơ bản sử dụng trong xây dựng template:
Nhƣ minh hoạ tại Hình 4.6 ta thấy: Cú pháp của template là cú pháp của ngôn ngữ MOFM2T, các từ khoá và câu lệnh đặt trong dấu “[]”.
Một file template bắt buộc phải bắt đầu với một khai báo dƣới dạng:
[module <module_name>('metamodel_URI_1')/]
Thể hiện rõ module sinh mã sử dụng các meta-model nào thông qua đối số
'metamodel_URI_1'. Các URI trong Acceleo thƣờng là:
Với Ecore meta-model: http://www.eclipse.org/emf/2002/Ecore
http://www.eclipse.org/uml2/1.0.0/UML, http://www.eclipse.org/uml2/2.0.0/UML; http://www.eclipse.org/uml2/3.0.0/UML; http://www.eclipse.org/uml2/4.0.0/UML;
UML 1.3 meta-model: http://www.obeo.fr/uml13
UML 1.4 meta-model: http://www.obeo.fr/acceleo/uml14
DSL meta-model: http://www.obeonetwork.org/dsl/cinematic/3.0.0
Một số từ khoá cơ bản sử dụng trong xây dựng template:
[Import../]: sử dụng để gọi các module template liên quan
[template] …[/template]: Chứa tập hợp các câu lệnh acceleo để sinh mã nguồn. Nó tƣơng đƣơng nhƣ một hàm/phƣơng thức trong Java/C#...
[file] [/file]: sử dụng để tạo file mã nguồn, nội dung mã nguồn sẽ đặt ở trong đoạn thẻ này.
For/If: Cấu trúc vòng lặp, ngắt
Query: Các truy vấn để trích lọc thông tin từ mô hình nguồn.
…