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,74 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ÊN CỨU VÀ CÀI ĐẶT MỘT CÔNG CỤ TRÊN NỀN TẢNG ECLIPSE ĐỂ HỖ TRỢ PHÁT TRIỂN CÁC ỨNG DỤNG JAVA 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ứ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 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 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 ủng hộ gia đình bạn bè suốt trình nghiên cứ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ên cứ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ên cứ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ỀN TẢ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át triển phần mềm hướng miền DDSDM 13 1.3.1 Phát triển mơ hình miền khái niệm 14 1.3.2 Định nghĩa vòng lặp phát triển 15 1.3.3 Thực vòng lặp phát triển 15 1.3.4 Tích hợp nguyên mẫu phần mềm 15 1.4 Công cụ hỗ trợ phát triển phần mềm hướng miền 16 1.4.1 Lịch sử phát triể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át triể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át triể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 toá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 ĐẶT VÀ 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ÁT TRIỂ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 Ý nghĩa Thuật ngữ API Application Programming Interface Giao diện lập trình ứng dụng DDD Domain-Driven Design Thiết kế hướng miền IDE Domain-driven software development Phương pháp phát triển phần method mềm hướng miền Integrated Development Environment Môi trường phát triển tích hợp JDT Java Development Tools Các công cụ phát triển Java 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 PDE Plug-in Development Environment RCP Rich Client Platform SWC Software Configuartion Nền tảng lập trình ứng dụng Desktop Cấu hình phần mềm SWT The Standard Widget Toolkit Bộ công cụ đồ 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 DDSDM UI XML v Nền tảng Java cho việc phát triển triển khai plug-in Môi trường phát triển plug-in 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át triể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 ứng dụng phát triển với kiến trúc tuyệt với, sử dụng công nghệ có giao diện tốt khơng giải yêu cầu nghiệp vụ đề ứng dụ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át triể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 để yê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át triển phần mềm Về lý thuyết, đội phát triể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ên dễ 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 ngun 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ông cụ Java hỗ trợ phát triển phần mềm hướng miền tên DomainAppTool, nhóm tác giả [5] đề xuất Cơng cụ sử dụng nghiên cứ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át triể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ơng cụ cho phép nhà phát triể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ông cụ 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át triể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ụng cơng cụ 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, 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 Từ đó, chức trực quan hóa, người dùng sử dụng trình phát triển phần mềm Điều có ý nghĩa quan trọng giúp cho cơng cụ hỗ trợ phát triể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át triển phần mềm hướng miền, công cụ hỗ trợ phát triển phần mềm hướng miền thành phần mở rộng Eclipse Plug-in Chương Xây dựng Eclipse 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ỀN TẢ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 ứng dụng sử dụng DDD Phương pháp phát triển phần mềm hướng miền DDSDM: khái niệm, pha phát triển nguyên mẫu phần mềm từ mơ hình miền Cơng cụ hỗ trợ phát triển phần mềm hướng miền: lịch sử phát triển, tổng quan kiến trúc, phát triể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át triể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át triể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át triể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át triể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át triển từ tiền đề coi trái tim phát triể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át triển khác cách hỗ trợ miền lõi 1.2.1 Kiến thức miền vấn đề Phát triể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át triể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_buttonIconDisplay, valueAsString = "true", valueType = Boolean.class), @PropertyDesc(name=PropertyName.view_searchToolBar_buttonTextDisplay, 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 hồ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át triể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át triể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át triể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ụng công cụ 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át triể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át triể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át triển phá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át triể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ông cụ plug-in giúp cho việc phát triển phần mềm hướng miền trở nên dễ dàng Các vòng lặp phát triể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ÁT TRIỂN Trong phát triển phần mềm, phương phát tiếp cận phát triể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át triể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át triể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át triển phần mềm đại hữu ích Cơng cụ hỗ trợ phát triể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ơng cụ giúp cho thiết kế hướng miền DDD lại gần với nhà phát triển phần mềm Một hạn chế cơng cụ 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 ứng dụng Eclipse plug-in Về mặt lý thuyết, ứng dụ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 tố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 Ứng dụng phần Eclipse tích hợp trực tiếp vào Eclipse Qua đó, người dùng sử dụng cơng cụ tải cài đặt vào Eclipse để sử dụng Điều có ý nghĩa quan trọng giúp cho công cụ hỗ trợ phát triể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 ứng dụng Eclipse plug-in giúp trực quan hóa việc sử dụng cơng cụ hỗ trợ phát triể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ơng cụ Vì vậy, hướng phát triể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át triển hoà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át triển phần mềm đại thiết kế hướng miền kiến thức xây dựng ứng dụng ứng dụng Eclipse plug-in Tuy nhiên, kiến thức có hạn nên luận văn 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