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,62 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 đƣợc 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 cơng bố cơng trình khác Những phân tích, đánh giá đƣợc 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 đƣợc 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ơ, nhƣ độ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 nhƣ 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 đề .3 1.2.2 Ngôn ngữ chung 1.2.3 Rằng buộc mơ hình cài đặt .5 1.2.4 Cô lập miền .7 1.2.5 Mơ hình đƣợc 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 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 ĐẶ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 tố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 dụng đƣợc 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 nhƣng khơng giải đƣợc u cầu nghiệp vụ đƣợc đề ứng dụng khơng thể đƣợc xem hữu ích Do đó, thiết kế hƣớng miền DDD đƣợc đƣ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, tuân 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ự nhƣ 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ƣới 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ông cụ Java hỗ trợ phát triển phần mềm hƣớng miền tên DomainAppTool, đƣợc 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à cịn đƣợc sử dụng nhƣ đầ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 đƣợc 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ữ đƣợc 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 đƣợ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 đƣợc sử dụng rộng rãi Trong luận văn, tơi 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 đƣợc Về phần bố cục, luận văn đƣợc chia thành ba chƣơng nhƣ sau: Chƣơng Kiến thức tảng : Trình bày sở lý thuyết cơng nghệ đƣợc 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 đƣợc giới thiệu nhƣng 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 u cầu mơi trƣờng cài đặt thực nghiệm, toán thực nghiệm cuối kết đạt đƣợc 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ệ đƣợc 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 đƣợc xây dựng dựa mơ hình miền Sự cộng tác chun 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 nhƣ 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 đƣợc 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 nhƣ đố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 đƣợc 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 đƣợc 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 đƣợc thiết kế chứa thông tin hƣớng miền đƣợc mơ hình hóa dƣới 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 đƣợc lƣu trữ khơng gian lƣu trữ có tên schema “courseman”; mutable = true : 53 đối tƣợng miền đƣợc hiển thị dƣới dạng xem nên ngƣời dùng không đƣợc phép thay đổi trạng thái chúng; singleton = false : có vài đối tƣợng miền đƣợc 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 đƣợ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 đƣợc 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 đƣợc hai lớp miền hoàn chỉnh Mã nguồn lớp Address thu đƣợc nhƣ 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ố đƣợc 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 đƣợc 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 đƣợc sinh nằm gói modules có tên đƣợc đặ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, đƣợc 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 đƣợc đị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 đƣợc sinh nằm gói software.config có tên đƣợc đặ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 đƣợc tạo nhƣ 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 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 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 đƣợc 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 đƣợc sinh nhƣ 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 đƣợc 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 cấu hình mặc định, ví dụ tiêu đề form để “title” hay tên thuộc tính giữ nguyên nhƣ 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ƣới dạng annotation, khơng đƣợc 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 đƣợc 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 đƣợc 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 đƣợc đóng gói dƣớ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ứ nhƣ thế, lần thay đổi lớp miền, công việc lại đƣợc 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à cịn 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 đƣợc 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 đƣợc 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 đƣợc 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ơ hình nhƣ 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ó đƣợ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 đƣợc 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) đƣợc 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 đƣợc tạo công cụ, cịn đơn giản nhƣng 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 nhƣ tốn nhiều thời gian trình sử dụng Luận văn giải đƣợc hạn chế việc xây dựng ứng dụng Eclipse plug-in Về mặt lý thuyết, ứng dụng đƣợc 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 đƣợc 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 đƣợc sử dụng rộng rãi Tuy nhiên, luận văn dừng lại việc xây dựng đƣợc ứ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 đƣợc mô hình miền đƣợc 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 đƣợc đị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 đƣợc 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 nhƣ 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 khơng thể tránh khỏi sai sót, khuyết điểm, tơi mong thầy nhận đƣợc đóng góp q thầy để luận văn đƣợc hồ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” đƣợc 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 ... 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 tơi đƣợc hƣớng dẫn TS Đặng Đức Hạnh Các nội dung nghiên cứu kết đề tài trung... 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... mở rộng Eclipse Plug-in Eclipse công cụ hỗ trợ lập trình, mã nguồn mở, đƣợc phát triển IBM Eclipse tảng đƣợc thiết kế để xây dựng công cụ phát triển ứng dụng vào web Theo thiết kế, thân tảng không