Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 73 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
73
Dung lượng
2,84 MB
Nội dung
ĐẠI HỌC QUỐC GIA HÀ NỘI TRƯỜNG ĐẠI HỌC CÔNG NGHỆ VŨ THANH HÀ NGHIÊNCỨUVÀCÀIĐẶTMỘTCÔNGCỤTRÊNNỀNTẢNGECLIPSEĐỂHỖTRỢPHÁTTRIỂNCÁCỨNGDỤNGJAVA Ngành: Công nghệ Thông tin Chuyên ngành: Kỹ thuật phần mềm Mã số: 60480103 LUẬN VĂN THẠC SĨ CÔNG NGHỆ THÔNG TIN NGƯỜI HƯỚNG DẪN KHOA HỌC: TS ĐẶNG ĐỨC HẠNH Hà Nội – 2018 L LỜI CAM ĐOAN Tôi xin cam đoan luận văn thạc sĩ “Nghiên cứucàiđặtcôngcụtảngEclipseđểhỗtrợpháttriểnứngdụng Java” cơng trình nghiêncứu riêng hướng dẫn TS Đặng Đức Hạnh Các nội dungnghiêncứu kết đề tài trung thực chưa cơng bố cơng trình khác Những phân tích, đánh giá tác giả thu thập từ nguồn khác có ghi rõ tài liệu tham khảo Học viên thực Vũ Thanh Hà i LỜI CẢM ƠN Để hoàn thành luận văn thạc sĩ, bên cạnh nỗ lực thân có hướng dẫn nhiệt tình q Thầy Cơ, động viên ủnghộ gia đình bạn bè suốt trình nghiêncứu thực luận văn Tôi xin chân thành bày tỏ lòng biết ơn sâu sắc đến Thầy TS Đặng Đức Hạnh, người tận tình hướng dẫn tạo điều kiện tốt cho tơi hồn thành luận văn Xin chân thành cảm ơn thầy cô khoa Công nghệ thông tin, Trường đại học Công Nghệ truyền đạt kiến thức quý báu giúp đỡ tơi q trình học tập nghiêncứu trường Cuối cùng, xin gửi lời cảm ơn đến gia đình, bạn bè, đồng nghiệp, người hỗtrợ tơi suốt q trình học tập, nghiêncứu thực luận văn Học viên thực Vũ Thanh Hà ii MỤC LỤC Trang LỜI CAM ĐOAN i LỜI CẢM ƠN ii MỤC LỤC iii DANH SÁCH CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT v DANH SÁCH CÁC HÌNH VẼ vi MỞ ĐẦU CHƯƠNG KIẾN THỨC NỀNTẢNG 1.1 Giới thiệu chương 1.2 Thiết kế hướng miền 1.2.1 Kiến thức miền vấn đề 1.2.2 Ngôn ngữ chung 1.2.3 Rằng buộc mơ hình càiđặt 1.2.4 Cô lập miền 1.2.5 Mơ hình thể phần mềm 1.2.6 Vòng đời đối tượng miền 12 1.3 Phương pháp pháttriển phần mềm hướng miền DDSDM 13 1.3.1 Pháttriển mô hình miền khái niệm 14 1.3.2 Định nghĩa vòng lặp pháttriển 15 1.3.3 Thực vòng lặp pháttriển 15 1.3.4 Tích hợp nguyên mẫu phần mềm 15 1.4 Côngcụhỗtrợpháttriển phần mềm hướng miền 16 1.4.1 Lịch sử pháttriển 16 1.4.2 Tổng quan kiến trúc 16 1.4.3 Ví dụ điển hình: CourseMan 17 1.4.4 Pháttriển lớp miền 18 1.4.5 Xây dựng nguyên mẫu phần mềm từ lớp miền 24 iii 1.5 Thành phần mở rộng Eclipse Plug-in 25 1.5.1 Kiến trúc mở Eclipse 25 1.5.2 Môi trường pháttriển Plug-in 27 1.6 Tổng kết chương 30 CHƯƠNG XÂY DỰNG ELCIPSE PLUGIN CHO 31 2.1 Giới thiệu chương 31 2.2 Mô tả yêu cầu cho Plug-in 31 2.3 Mơ hình thiết kế Eclipse Plugin cho phần mềm hướng miền 34 2.3.1 Mơ hình thiết kế UML cho Eclipse Plugin 34 2.3.2 Thuật toán sinh phương thức Thuật toán sinh module phần mềm 36 2.3.3 Thuật tốn sinh cấu hình phần mềm SWC 40 2.4 Càiđặt chi tiết thiết kế plug-in 42 2.5 Tổng kết chương 48 CHƯƠNG CÀIĐẶTVÀ THỰC NGHIỆM 49 3.1 Giới thiệu chương 49 3.2 Môi trường càiđặt 49 3.3 Bài toán quản lý khóa học 49 3.4 Kết thực nghiệm 52 3.5 Tổng kết chương 64 KẾT LUẬN VÀ HƯỚNG PHÁTTRIỂN 65 TÀI LIỆU THAM KHẢO 66 iv DANH SÁCH CÁC KÝ HIỆU VÀ CHỮ VIẾT TẮT Từ viết tắt Thuật ngữ Ý nghĩa API Application Programming Interface Giao diện lập trình ứngdụng DDD Domain-Driven Design Thiết kế hướng miền DDSDM Domain-driven software development method Phương pháp pháttriển mềm hướng miền IDE Integrated Development Environment Mơi trường pháttriển tích hợp JDT Java Development Tools CáccôngcụpháttriểnJava JRE Java Runtime Environment Môi trường chạy Java MCC Module Configuration Class Lớp cấu hình mơ đun phần mềm MVC Model View Controller Mơ hình thiết kế phần mềm OSGi Open Service Gateway Initiative NềntảngJava cho việc triểntriển khai plug-in PDE Plug-in Development Environment Môi trường pháttriển plug-in RCP Rich Client Platform Nềntảng lập trình ứngdụng Desktop SWC Software Configuartion Cấu hình phần mềm SWT The Standard Widget Toolkit Bộ côngcụ đồ họa chuẩn User interface Giao diện người dùng eXtensible Markup Language Ngôn ngữ đánh dấu mở rộng UI XML v phần phát DANH SÁCH CÁC HÌNH VẼ Hình 1.1: Các thành phần thiết kế hướng miền Hình 1.2: Kiến trúc phân lớp Hình 1.3: Vòng đời đối tượng miền Hình 1.4: Tổng quan phương pháp pháttriển phần mềm hướng miền Hình 1.5: Thiết kế lớp miền phần mềm CourseMan Hình 1.6: Áp dụng meta-attribute DAssoc cho ba liên kết CourseMan Hình 1.7: Kiến trúc mở Eclipse Hình 1.8: Hoạt động plug-in Hình 2.1: Các thử thách cho DSL dựa annotation Hình 2.2: Biểu đồ cho plug-in Hình 2.3: Biểu đồ lớp cho plug-in Hình 2.4: Biểu đồ triển khai cho plug-in Hình 2.5: Mơ hình kiến trúc phần mềm COURSEMAN Hình 2.6: Các bước xây dựng Plug-in Hình 2.7: Màn hình nhập thơng tin ban đầu Plug-in Hình 2.8: Màn hình chọn Template cho Plug-in Hình 2.9: Màn hình dự án Plug-in tạo Hình 2.10: Màn hình Extensions Hình 2.11: Màn hình tạo command Hình 2.12: Màn hình khai báo handlers Hình 2.13: Màn hình khai báo bindings Hình 2.14: Màn hình khai báo vị trí item menu Hình 3.1: Mơ hình ca sử dụng CourseMan Hình 3.2: Mơ hình miền khái niệm mơ hình CourseMan Hình 3.3: Đầu vào thực nghiệm Hình 3.4: Giao diện menu sinh phương thức cho lớp miền Hình 3.5: Giao diện menu sinh cấu hình mơ-đun phần mềm Hình 3.6: Cấu hình mơ-đun phần mềm sinh Hình 3.7: Giao diện menu sinh cấu hình mơ-đun phần mềm Hình 3.8: Cấu hình phần mềm SWC1 sinh Hình 3.9: Cấu hình phần mềm SWC1 sinh Hình 3.10: Cấu hình Run Configurations để chạy mã nguồn Hình 3.11: Giao diện phần mềm CourseMan Hình 3.12: Giao diện form CourseMan vòng lặp Hình 3.13: Giao diện form CourseMan sau sửa cấu hình mơ-đun vi MỞ ĐẦU Mộtứngứngdụngpháttriển với kiến trúc tuyệt với, sử dụngcông nghệ có giao diện tốt khơng giải yêu cầu nghiệp vụ đềứngdụng khơng thể xem hữu ích Do đó, thiết kế hướng miền DDD đưa [2] Thiết kế hướng miền DDD nhằm pháttriển phần mềm cách lặp lặp lại xung quanh mơ hình miền thực tế Cả phần mềm mơ hình miền nắm bắt triệt để u cầu miền khả thi đểcàiđặt xét mặt kỹ thuật [6] Ý tưởng DDD mơ hình hóa miền cho pháttriển phần mềm Về lý thuyết, đội pháttriển cần tập trung chủ yếu vào xây dựng mơ hình miền, tn thủ nguyên tắc DDD càiđặt Khi xương hệ thống rắn chắc, thứ trởnêndễ dàng việc triển khai tính tương tự việc lắp ghép viên gạch xếp hình Trên thực tế, việc xây dựng phần mềm hướng miền không đơn giản, nhiều công việc cần phải thực hiện: từ phân tích miền, xây dựng mơ hình miền, càiđặt dạng mã nguồn sử dụng ngơn ngữ lập trình định, đảm bảo nguyên tắc DDD gắn chặt càiđặt với mơ hình, lập lớp miền chứa thành phần cấu thành nên DDD [2] Đểtăng hiệu suất tạo phần mềm, côngcụJavahỗtrợpháttriển phần mềm hướng miền tên DomainAppTool, nhóm tác giả [5] đề xuất Cơngcụ sử dụngnghiêncứu gần DDD tập trung vào mở rộng ngôn ngữ lập trình hướng đối tượng dựa annotation để xây dựng mơ hình miền Mơ hình khơng sở cho ngôn ngữ chung thành viên nhóm pháttriển mà sử dụng đầu vào để sinh phần mềm [6] DomainAppTool tự động tạo phần mềm từ tập lớp miền thiết kế với tính thiết kế hướng miền Lợi ích cơngcụ cho phép nhà pháttriển tập chung vào thiết kế mơ hình miền để đưa tập lớp miền phần mềm, toàn phần mềm bao gồm giao diện đồ họa người dùng đối tượng lưu trữ tạo tự động vào thời gian chạy Tuy nhiên, hạn chế côngcụ chưa có giao diện người dùng, người sử dụng phải thực thủ công loạt lệnh command line để tạo phần mềm Pháttriển phần mềm trình lặp lặp lại để sinh phần mềm cuối Trong vòng lặp phát triển, sử dụngcơngcụ người dùng lại phải thực lệnh đó, gây khơng khó khăn tốn nhiều thời gian Vì vậy, xin chọn đề tài “Nghiên cứucàiđặtcôngcụtảngEclipseđểhỗtrợpháttriểnứngdụng Java” Mục tiêu luận văn tạo gói mở rộng plug-in càicơngcụhỗtrợ lập trình Eclipse cho DomainAppTool Từ đó, chức trực quan hóa, người dùng sử dụng trình pháttriển phần mềm Điều có ý nghĩa quan trọng giúp cho cơngcụhỗtrợpháttriển phần mềm hướng miền sử dụng rộng rãi Trong luận văn, tập trung vào trình bày chi tiết hai đóng góp xây dựng thuật tốn tạo cấu hình phần mềm xây dựng gói Eclipse plug-in; cuối bước thực thực nghiệm kết đạt Về phần bố cục, luận văn chia thành ba chương sau: Chương Kiến thức tảng : Trình bày sở lý thuyết cơng nghệ sử dụng luận văn Bao gồm: Thiết kế hướng miền, phương pháp pháttriển phần mềm hướng miền, côngcụhỗtrợpháttriển phần mềm hướng miền thành phần mở rộng Eclipse Plug-in Chương Xây dựngEclipse Plug-in cho phần mềm hướng miền : Trình bày mơ hình thiết kế Plugin càiđặt chi tiết thiết kế Các thuật toán tự động sinh phương thức cho lớp miền cấu hình mơ-đun phần mềm giới thiệu trọng tâm tập trung vào trình bày chi tiết thuật tốn sinh cấu hình phần mềm Chương Càiđặt thực nghiệm : Trình bày yêu cầu mơi trường càiđặt thực nghiệm, tốn thực nghiệm cuối kết đạt CHƯƠNG KIẾN THỨC NỀNTẢNG 1.1 Giới thiệu chương Chương trình bày sở lý thuyết cơng nghệ sử dụng luận văn Bao gồm ba nội dung chính: Thiết kế hướng miền DDD: khái niệm, ngôn ngữ chung, thiết kế hướng mơ hình kiến trúc ứngdụng sử dụng DDD Phương pháp pháttriển phần mềm hướng miền DDSDM: khái niệm, pha pháttriển nguyên mẫu phần mềm từ mơ hình miền Cơngcụhỗtrợpháttriển phần mềm hướng miền: lịch sử phát triển, tổng quan kiến trúc, pháttriển lớp miền bước xây dựng nguyên mẫu phần mềm từ lớp miền Thành phần mở rộng Eclipse Plug-in: Kiến trúc mở Eclipse môi trường pháttriển Plug-in 1.2 Thiết kế hướng miền Thiết kế hướng miền cách tiếp cận đểpháttriển phần mềm có yêu cầu phức tạp việc liên kết càiđặt với mơ hình pháttriển Tiền đề thiết kế hướng miền [2] là: Đặt trọng tâm dự án tập trung vào miền lõi logic miền Các thiết kế phức tạp xây dựng dựa mơ hình miền Sự cộng tác chuyên gia miền chuyên gia pháttriểnđể trau dồi lặp lặp lại mơ hình miền khái niệm giải vấn đề miền cụ thể Thiết kế hướng miền pháttriển từ tiền đề coi trái tim pháttriển phần mềm kiến thức vấn đề cần giải tìm cách hữu ích để hiểu vấn đề Sự phức tạp cần giải phức tạp miền kiến thức kỹ thuật, giao diện người dùng hay chí khơng phải chức cụ thể Điều có nghĩa thiết kế thứ xung quanh hiểu biết quan niệm hầu hết khái niệm cần thiết nghiệp vụ, chứng minh cho pháttriển khác cách hỗtrợ miền lõi 1.2.1 Kiến thức miền vấn đềPháttriển phần mềm quy trình xây dựng phần mềm để giải toán nghiệp vụ thực tế hay miền vấn đề Phần mềm bắt nguồn liên quan chặt chẽ với miền Mặt khác, phần mềm làm từ mã nguồn Nhà pháttriển thường sa đà vào việc dành nhiều thời gian tạo mã nguồn nhìn phần mềm đối tượng phương thức đơn giản [2] Xem xét ví dụ sản xuất tơ [1] Cơng nhân liên quan trực tiếp đến việc lắp ráp linh kiện ơ-tơ có góc nhìn hạn chế quy trình sản xuất ô tô Họ coi ô tô tập khổng lồ linh kiện cần lắp ráp chúng với nhau; thực quy trình tạo 3.4 Kết thực nghiệm Bước 1: Chuẩn bị đầu vào Đầu vào thực nghiệm mơ hình miền CourseMan lớp ModuleMain Mơ hình miền mơ hình miền chưa hồn chỉnh, thơng qua việc thực vòng lặp phát triển, mơ hình miền làm phong phú hồn thiện Hình 3.3 Đầu vào thực nghiệm Lớp ModuleMain lớp cấu hình mơ-đun, chứa cấu hình chung lớp điều khiển, giao diện hiển thị, môi trường cài đặt,… phần mềm khởi tạo @ModuleDescriptor( name = "ModuleMain", viewDesc = @ViewDesc( formTitle = "Course Management App: CourseMan", imageIcon = "courseman.jpg", view = View.class, viewType = Type.Main, topX = 0.5, topY = 0.0, widthRatio = 0.75f, heightRatio = 1f, children = { RegionName.Desktop, RegionName.MenuBar, RegionName.ToolBar, RegionName.StatusBar }, excludeComponents = { Add }, props = { @PropertyDesc(name = PropertyName.view_toolBar_buttonIconDisplay, valueAsString = "true", valueType = Boolean.class), @PropertyDesc(name = PropertyName.view_toolBar_buttonTextDisplay, valueAsString = "false", valueType = Boolean.class), @PropertyDesc(name=PropertyName.view_searchToolBar_buttonIconDispl ay, valueAsString = "true", valueType = Boolean.class), @PropertyDesc(name=PropertyName.view_searchToolBar_buttonTextDispl ay, valueAsString = "false", valueType = Boolean.class), @PropertyDesc(name = PropertyName.view_lang_international, valueAsString = "true", valueType = Boolean.class), } ), controllerDesc = @ControllerDesc(controller = Controller.class), type = ModuleType.DomainMain, setUpDesc = @SetUpDesc(postSetUp = CopyResourceFilesCommand.class) ) public class ModuleMain { } 52 Mơ hình miền của CourseMain chứa bốn lớp miền Mã nguồn lớp miền Student : @DClass(schema=”courseman”) public class Student{ /*** STATE SPACE **/ @DAttr(name = “id”, type = Type.Integer, id = true, auto = true, mutable = false, optional = false, = 1.0) private int id; @DAttr(name = “name”, type = Type.String, length =30 , optional = false) private String name; @DAttr(name = “address”, type = Type.Domain, length = 20, optional = true) @DAssoc(ascName = “student-has-address”, role = “student”, ascType = AssocType.One2One, endType = AssocEndType.One, associate = @Associate(type= Address.class, cardMin = 1, cardMax= 1)) private Address address; @DAttr(name = “enrolments”, type = Type.Collection, optional = false, serialisable = false, filter = @Select(clazz = Enrolment.class)) @DAssoc(ascName = “std-has-enrols”, role = “student”, ascType = AssocType.One2Many, endType = AssocEndType.One, associate= @Associate(type= Enrolment.class, cardMin=0, cardMax= 30)) private Collection enrolments; /*** BEHAVIOUR SPACE **/ } Và mã nguồn lớp Address : @DClass(schema = "courseman") public class Address { /*** STATE SPACE **/ @DAttr(name= "id", id= true, auto= true, length= 3, mutable = false, optional = false, type = Type.Integer) private int id; @DAttr(name = "cityName", type = Type.String, length = 20, optional = false) private String cityName; @DAttr(name="student", type=Type.Domain, optional=true, serialisable=false) @DAssoc(ascName = "student-has-address", role = "address", ascType = AssocType.One2One, endType = AssocEndType.One, associate = @Associate(type= Student.class, cardMin = 1, cardMax = 1, determinant = true)) private Student student; /*** BEHAVIOUR SPACE **/ } Các lớp miền thiết kế chứa thơng tin hướng miền mơ hình hóa dạng tập meta-attribute gắn vào lớp thành viên lớp Ví dụ lớp Address, DClass xác định schema lưu trữ đối tượng miền “courseman”, thuộc tính khác có giá trị mặc định: serialisable = true : đối tượng miền lưu trữ khơng gian lưu trữ có tên schema “courseman”; mutable = true : 53 đối tượng miền hiển thị dạng xem nên người dùng không phép thay đổi trạng thái chúng; singleton = false : có vài đối tượng miền tạo thời gian chạy phần mềm… Các lớp miền đầu vào có cấu trúc chưa hoàn thiện, thiếu phương thức hoạt động Các phương thức tự động sinh bước Bước 2: Sinh phương thức cho lớp miền nhờ BspaceGen Các phương thức lớp miền sinh cách thực hiện: Chọn lớp miền > chuột phải, chọn Source > chọn Generate BSpace Hình 3.4: Giao diện menu sinh phương thức cho lớp miền Kết thu hai lớp miền hoàn chỉnh Mã nguồn lớp Address thu sau: @DClass(schema = “courseman”) public class Address { /*** STATE SPACE **/ @DAttr(name = "id", id = true, auto = true, length = 3, mutable = false, optional = false, type = Type.Integer) private int id; @DAttr(name = "cityName", type = Type.String, length = 20, optional = false) private String cityName; @DAttr(name= "student", type= Type.Domain, optional=true, serialisable= false) @DAssoc(ascName = "student-has-address", role = "address", ascType = AssocType.One2One, endType = AssocEndType.One, associate = @Associate(type = Student.class, cardMin = 1, cardMax = 1, determinant = true)) private Student student; 54 /*** BEHAVIOUR SPACE **/ private static int idCounter; @DOpt(type = DOpt.Type.Getter) @AttrRef(value = "id") public int getId() {} @DOpt(type = DOpt.Type.AutoAttributeValueGen) @AttrRef(value = "id") private static int genId(Integer id) { } @DOpt(type = DOpt.Type.Getter) @AttrRef(value = "cityName") public String getCityName() { } @DOpt(type = DOpt.Type.Setter) @AttrRef(value = "cityName") public void setCityName(String cityName) { } @DOpt(type = DOpt.Type.Getter) @AttrRef(value = "student") public Student getStudent() { } @DOpt(type = DOpt.Type.Setter) @AttrRef(value = "student") public void setStudent(Student student) { } @DOpt(type = DOpt.Type.LinkAdderNew) @AttrRef(value = "student") public boolean setNewStudent(Student obj) { setStudent(obj); return false; } @DOpt(type = DOpt.Type.DataSourceConstructor) public Address(Integer id, String cityName) throws ConstraintViolationException { this.id = genId(id); this.cityName = cityName; this.student = null; } @DOpt(type = DOpt.Type.ObjectFormConstructor) public Address(String cityName, Student student) throws ConstraintViolationException { this.id = genId(null); this.cityName = cityName; this.student = student; } } @DOpt(type = DOpt.Type.RequiredConstructor) public Address(String cityName) throws ConstraintViolationException { this.id = genId(null); this.cityName = cityName; this.student = null; } Lớp miền Address có ba hàm khởi tạo, hàm getter hàm tự động sinh giá trị cho thuộc tính id; hàm getter setter cho thuộc tính cityName; ba phương thức liên quan đến thuộc tính student Trong ba phương thức này, hai phương 55 thức đầu hàm getter setter, phương thức cuối liên quan đến việc thêm đối tượng Student kết hợp với Address Các phương thức tạo có chứa meta-attribute tên Dopt xác định loại phương thức Loại tham số sử dụng hàm khởi tạo phải kiểu đối tượng Hàm khởi tạo sử dụng hàm gentID, tự động tạo giá trị cho thuộc tính id Hàm genID sử dụng thuộc tính tĩnh khác idCounter để giữ giá trị lớn đến thời điểm id Thuộc tính id, khơng có hàm setter có DAttr.mutable = false nghĩa giá trị khơng thay đổi người dùng Phương thức setNewStudent thuộc loại Dopt.Type.LinkAdderNew đặc tả cho liên kết 1:1 Student Address nghĩa thêm liên kết từ đối tượng Student tới đối tượng Address tồn vừa tạo Bước 3: Sinh tập cấu hình mơ-đun phần mềm, xây dựng từ mơ hình lớp miền Cách thực hiện: chọn lớp miền sinh từ bước > chuột phải, chọn Source > chọn Generate MCC : Hình 3.5: Giao diện menu sinh cấu hình mơ-đun phần mềm Các cấu hình mơ-đun phần mềm sinh nằm gói modules có tên đặt theo nguyên tắc Module + Tên miền : 56 Hình 3.6: Cấu hình mơ-đun phần mềm sinh Mã nguồn cấu hình mơ-đun phần mềm ModuleAddress, xây dựng từ lớp miền Address ModuleAddress lớp có kiến trúc dựa mơ hình MVC bao gồm ba thành phần: mơ hình (lớp miền), khung nhìn hiển thị giao diện người dùng lớp điều khiển Mỗi lớp mơ-đun có phạm vi trạng thái tập thuộc tính lớp miền định nghĩa đặc tả mô-đun, lớp Address @ModuleDescriptor( name = "ModuleAddress", modelDesc = @ModelDesc(model = Address.class), viewDesc = @ViewDesc( formTitle = "Form: Address", imageIcon = "Address.png", domainClassLabel = "Address", parent=RegionName.Tools, view = View.class, viewType=Region.Type.Data), controllerDesc = @ControllerDesc()) public class ModuleAddress { @AttributeDesc(label = "title") private String title; @AttributeDesc(label = "id") private int id; @AttributeDesc(label = "cityName") private String cityName; @AttributeDesc(label = "student") private Student student; } Bước 4: Sinh tập cấu hình phần mềm từ tập cấu hình mơ-đun phần mềm Cách thực hiện: chọn ModuleMain cấu hình mơ-đun phần mềm sinh từ bước > chuột phải, chọn Source > chọn Generate SWC Đối với vòng lặp thứ 57 sử dụng cấu hình mơ-đun: ModuleAddress, ModuleEnrollment, ModuleStudent Hình 3.7: Giao diện menu sinh cấu hình phần mềm Cấu hình phần mềm sinh nằm gói software.config có tên đặt theo nguyên tắc SWC + Số thứ tự Mỗi vòng lặp pháttriển sử dụng lớp cấu hình mơ-đun phần mềm khác để tạo cấu hình riêng cho nguyên mẫu phần mềm Một biến tự động tăng sinh số thứ tự cho cấu hình phần mềm Ví du, vòng lặp thứ nhất, cấu hình phần mềm có tên SWC1, vòng lặp thứ hai SWC2 Hình 3.8: Cấu hình phần mềm SWC1 sinh 58 Mã nguồn cấu hình phần mềm SWC1 lớp rỗng, có chứa meta-attriubute mô tả chi tiết thông tin nguyên mẫu phần mềm tạo tên ứng dụng, ngôn ngữ sử dụng, thông tin tổ chức, …Lớp cấu hình phần mềm SWC1 có kiến trúc dựa mơ hình MVC với ba thành phần mơ hình (các lớp mơ-đun chứa lớp miền), khung nhìn mơ tả giao diện người dùng lớp điều khiển Phần mơ hình chứa lớp mơ-đun sử dụng: ModuleMain, ModuleAddress, ModuleStudent, ModuleEnrollment @SystemDesc( appName = "Courseman", splashScreenLogo = "coursemanapplogo.jpg", language = Language.English, orgDesc = @OrgDesc(name = "Faculty of IT", address = "K1m9 Nguyen Trai Street, Thanh Xuan District", logo = "hanu.gif", url = "http://localhost:5432/domains"), dsDesc = @DSDesc(type = "postgresql", dsUrl = "//localhost:5432/domainds", user = "admin", password = "password", dsmType = DSM.class, domType = DOM.class, osmType = PostgreSQLOSM.class, connType = ConnectionType.Client), modules = { ModuleMain.class, ModuleAddress.class, ModuleStudent.class, ModuleEnrollment.class }, sysModules = {}, setUpDesc = @SysSetUpDesc(setUpConfigType = SetUpConfig.class), securityDesc = @SecurityDesc(isEnabled = false)) public class SWC1 {} Làm tương tự vòng lặp pháttriển thứ hai, sử dụng cấu hình mơ-đun phần mềm ModuleAddress, thu cấu hình phần mềm SWC2: Hình 3.9: Cấu hình phần mềm SWC2 sinh Cấu hình phần mềm SWC2 có mã nguồn sử dụng cấu hình mơ-đun ModuleMain ModuleAddress : 59 @SystemDesc( appName = "Courseman", splashScreenLogo = "coursemanapplogo.jpg", language = Language.English, orgDesc = @OrgDesc( name = "Faculty of IT", address = "K1m9 Nguyen Trai Street, Thanh Xuan District", logo = "hanu.gif", url = "http://localhost:5432/domains"), dsDesc = @DSDesc( type = "postgresql", dsUrl = "//localhost:5432/domains", user = "admin", password = "password", dsmType = DSM.class, domType = DOM.class, osmType = PostgreSQLOSM.class, connType = ConnectionType.Client), modules = { ModuleMain.class, ModuleAddress.class }, sysModules = {}, setUpDesc = @SysSetUpDesc(setUpConfigType = SetUpConfig.class), securityDesc = @SecurityDesc(isEnabled = false)) public class SWC2 { } Thực cách tương tự cho vòng lặp pháttriển khác, thu cấu hình phần mềm riêng cho nguyên mẫu phần mềm Bước sử dụngcôngcụ DomainAppTool để sinh nguyên mẫu phần mềm Bước 5: Sinh phần mềm từ tập cấu hình phần mềm Tạo lớp CourseMan có hàm main khai báo lớp cấu hình phần mềm SWC1.class sinh lớp thiết lập môi trường càiđặt mặc định SetupGen.class public class CourseMan { public static void main(String[] args) { final Class SwCfgCls = SWC1.class; final Class SetUpCls = SetUpGen.class; SoftwareAio sw = new SoftwareStandardAio(SetUpCls, SwCfgCls); try { sw.exec(args); } catch (NotPossibleException e) { e.printStackTrace(); System.exit(1); } } } Tạo cấu hình JVM mặc định chạy mã nguồn: chuột phải CourseMan > RunAs > Run Configurations Màn hình Run Configurations Trong panel bên trái, nhấn chuột vào Java Application > chọn biểu tượng thêm cấu hình 60 : Hình 3.10: Cấu hình Run Configurations để chạy mã nguồn Trong Arguments panel chính, khai báo hai tham số: -Dlogging=true kích hoạt chức log hệ thống, tham số thứ hai thiết lập đối tượng miền sinh lưu nhớ chạy thay lưu sở liệu Chạy chương trình: chuột phải CourseMan > Run As > Run Configurations Màn hình Run Configurations > chọn cấu hình CourseMan vừa tạo > cuối chọn Run Giao diện phần mềm CourseMan sinh sau: Hình 3.11: Giao diện phần mềm CourseMan 61 Vòng lặp pháttriển sử dụng ba mơ-đun cấu hình phần mềm, tương ứng với ba form giao diện sinh Ba form nằm menu Tools Nhấn chuột vào form, giao diện hiển thị thông tin lớp miền tương ứng Trong form, thuộc tính cấu hình mặc định, ví dụ tiêu đề form để “title” hay tên thuộc tính giữ nguyên lớp miền Nguyên nhân cấu hình mơ-đun chứa meta-attribute đính kèm với lớp thành viên lớp dạng annotation, không thay đổi thủ cơng tay phần mềm lấy giá trị mặc định cấu hình mơ-đun Hình 3.12: Giao diện form CourseMan vòng lặp Thay đổi cấu hình mơ-đun lớp Address cách sửa giá thuộc tính label mã nguồn ModuleAddress : @ModuleDescriptor( name = "ModuleAddress", modelDesc = @ModelDesc(model = Address.class), viewDesc = @ViewDesc( formTitle = "Form: Address", imageIcon = "Address.png", domainClassLabel = "Address", parent=RegionName.Tools, view = View.class, viewType=Region.Type.Data), controllerDesc = @ControllerDesc()) public class ModuleAddress { @AttributeDesc(label = "Địa chỉ") private String title; 62 @AttributeDesc(label = "Mã thành phố") private int id; @AttributeDesc(label = "Tên thành phố") private String cityName; @AttributeDesc(label = "Sinh viên") private Student student; } Chạy lại phần mềm, giao diện CourseMan chứa form Address có nhãn thuộc tính tiếng Việt: Hình 3.13: Giao diện form CourseMan sau sửa cấu hình mơ-đun Làm tương tự vòng lặp pháttriển tiếp theo, nguyên mẫu phần mềm CourseMan sinh Kiểm thử nguyên mẫu phần mềm, nhà pháttriểnphát lỗi xảy ra, thuộc tính thiếu quay trở lại thay đổi lớp miền Thơng qua vòng lặp, kết cuối thu lớp miền tối ưu cho phần mềm Trước đây, sau chỉnh sửa, lớp miền phải đóng gói dạng jar phải sử dụng lệnh command line terminal để thực sinh nguyên mẫu phần mềm Cứ thế, lần thay đổi lớp miền, công việc lại lặp lại gây khó khăn cho nhà pháttriển phần mềm Như vậy, nhờ có plug-in việc thực vòng lặp khơng đơn giản mà hữu ích việc xem thay đổi cấu hình mơ-đun phần mềm 63 3.5 Tổng kết chương Kết thực nghiệm chứng minh côngcụ plug-in giúp cho việc pháttriển phần mềm hướng miền trởnêndễ dàng Các vòng lặp pháttriển thực đơn giản thơng qua nhấn chuột thay thực loạt lệnh command line Tuy nhiên, hệ thống ba hạn chế chính: phần mềm thêm dừng lại chức thêm, sửa, xóa; hai việc thay đổi cấu hình mơđun phần mềm phải thực thủ công cách thay đổi trực tiếp mã nguồn mà số lượng thuộc tính nhiều, gây khơng khó khăn cho nhà phát triển; ba chưa kiểm tra tính đắn lớp miền, cấu hình mơ-đun phần mềm cấu hình phần mềm (hiện tại, chủ yếu thực kiểm thử phần mềm sinh có lỗi khơng) 64 KẾT LUẬN VÀ HƯỚNG PHÁTTRIỂN Trong pháttriển phần mềm, phương phát tiếp cận pháttriển hướng miền sử dụng cho nhu cầu phức tạp, kết nối càiđặt với mơ hình pháttriển khái niệm nghiệp vụ DDD bao gồm ngôn ngữ chung, kỹ thuật mơ kiến trúc; tập trung vào mơ hình hóa vấn đề cần giải Với DDD, nhà pháttriển có kỹ thuật giúp tối thiểu hóa phức tạp thúc đẩy cộng tác với chuyên gia miền Với ưu điểm vượt trội mình, DDD thực phương pháp pháttriển phần mềm đại hữu ích Cơngcụhỗtrợpháttriển phần mềm hướng miền thiết kế dựa nguyên tắc DDD, giúp tự động sinh phần mềm từ mơ hình lớp miền Nhờ đó, mà người dùng cần tập trung vào miền vấn đề mơ hình miền, tồn phần mềm (bao gồm giao diện lưu trữ đối tượng) sinh cách tự động nâng cao hiệu xuất sản xuất phần mềm Mặc dù, chức phần mềm tạo cơng cụ, đơn giản côngcụ giúp cho thiết kế hướng miền DDD lại gần với nhà pháttriển phần mềm Một hạn chế côngcụ khơng có giao diện trực quan, dẫn đến khó khăn cho người dùng tốn nhiều thời gian trình sử dụng Luận văn giải hạn chế việc xây dựngứngdụngEclipse plug-in Về mặt lý thuyết, ứngdụng xây dựng từ ba thuật toán thuật toán sinh phương thức cho phần mềm, thuật toán sinh cấu hình mơ-đun phần mềm cuối thuật tốn sinh cấu hình phần mềm Ứngdụng phần Eclipse tích hợp trực tiếp vào Eclipse Qua đó, người dùng sử dụngcơngcụ tải càiđặt vào Eclipseđể sử dụng Điều có ý nghĩa quan trọng giúp cho cơngcụhỗtrợpháttriển phần mềm hướng miền sử dụng rộng rãi Tuy nhiên, luận văn dừng lại việc xây dựngứngdụngEclipse plug-in giúp trực quan hóa việc sử dụngcơngcụhỗtrợpháttriển phần mềm hướng miền Khi miền vấn đề lớn lên, mơ hình miền trởnên phức tạp hơn, biết mơ hình miền sinh cơngcụ Vì vậy, hướng pháttriển luận văn xây dựng phương pháp kiểm tra tính đắn mơ hình miền sử dụng ánh xạ cấu trúc lớp miền định nghĩa cho DCSL Hy vọng, thời gian tới, tơi pháttriển hồn thiện nội dung Qua việc thực luận văn, thu nhiều kiến thức bổ ích kiến thức pháttriển phần mềm đại thiết kế hướng miền kiến thức xây dựngứngdụngứngdụngEclipse plug-in Tuy nhiên, kiến thức có hạn nên luận văn khơng thể tránh khỏi sai sót, khuyết điểm, tơi mong thầy nhận đóng góp q thầy để luận văn hoàn thiện 65 TÀI LIỆU THAM KHẢO Tiếng Việt Septeni Technology, 2015, “Domain-Driven Design Quickly tiếng Việt” dịch từ Abel Avram & Floyd Marinescu, (2006), “Domain-Driven Design Quickly” Tiếng Anh Eric Evans, (2013), “Domain-Driven Design: Tackling Complexity in the Heart of Software”, pp.4-99 Alex Blewitt, (2014), “Mastering Eclipse Plug-in Development”, pp 7-77 Eclipse, (2018), “https://help.eclipse.org/photon/index.jsp”, last visit was on 12/11/2018 Duc Minh Le, Duc-Hanh Dang (2017), “DomainAppTool: A Domain-Driven Software Development Tool”, Hanoi University Duc Minh Le, Duc-Hanh Dang, Viet-Ha Nguyen (2016), “Domain-Driven Design Using Meta-Attributes: A DSL-Based Approach”, in KSE 2016, pp.67-72 Duc Minh Le, Duc-Hanh Dang, Viet-Ha Nguyen (2018), “On Domain Driven Design Using Annotation-Based Domain Specific Language”, K Czarnecki, (2004),“Overview of Generative Software Development,” in Unconventional Programming Paradigms 2004, no 3566, pp 326–341 Duc Minh Le, Duc-Hanh Dang, Viet-Ha Nguyen (2017), “Generative Software Module Development: A Domain-Driven Design Perspective”, in KSE 2017, pp.85-90 10 B.Liskov and J.Guttag, 2000, “Program development in Java: abstraction, specification, and object-oriented design”, Pearson Education 66 ... sĩ Nghiên cứu cài đặt công cụ tảng Eclipse để hỗ trợ phát triển ứng dụng Java cơng trình nghiên cứu riêng tơi hướng dẫn TS Đặng Đức Hạnh Các nội dung nghiên cứu kết đề tài trung thực chưa công. .. tơi xin chọn đề tài Nghiên cứu cài đặt công cụ tảng Eclipse để hỗ trợ phát triển ứng dụng Java Mục tiêu luận văn tạo gói mở rộng plug-in cài cơng cụ hỗ trợ lập trình Eclipse cho DomainAppTool... sử 13 dụng theo hai cách: Cách sử dụng chủ yếu dành cho chuyên gia miền nhóm phát triển để phát triển mơ hình miền cách tăng dần, hợp tác tương tác Cách sử dụng thứ hai nguyên mẫu tái sử dụng