Tóm tắt Luận văn 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

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 những nhu cầu phức tạp, kết nối cài đặt với một mô hình đang phát triển của các khái niệm nghiệp vụ. DDD bao gồm một ngôn ngữ chung, các kỹ thuật và mô hình cũng như một kiến trúc; tập trung vào mô hình hóa các vấn đề cần giải quyết. Với DDD, các nhà phát triển có được những kỹ thuật giúp tối thiểu hóa sự phức tạp và thúc đẩy sự cộng tác với các chuyên gia miền. Với những ưu điểm vượt trội của mình, DDD thực sự là một phương pháp phát triển phần mềm hiện đại và 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 trên các nguyên tắc DDD, giúp tự động sinh ra phần mềm từ các mô hình lớp miền. Nhờ đó, mà người dùng chỉ cần tập trung vào miền vấn đề và mô hình miền, toàn bộ phần mềm (bao gồm giao diện và lữu trữ đối tượng) sẽ được sinh ra một cách tự động. Từ đó, nâng cao hiệu xuất sản xuất phần mềm. Mặc dù, chức năng các phần mềm được tạo ra bởi 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 hơn với các nhà phát triển phần mềm. Một trong những hạn chế của công cụ là không có giao diện trực quan, dẫn đến những khó khăn cho người dùng cũng như tốn nhiều thời gian trong quá trình sử dụng. Luận văn này đã giải quyết được hạn chế này bằng việc xây dựng một ứng dụng Eclipse plug-in. Về mặt lý thuyết, ứng dụng này được xây dựng từ ba thuật toán là 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 và cuối cùng là thuật toán sinh cấu hình phần mềm do tôi phát triển. Ứng dụng này là một phần của Eclipse và được tích hợp trực tiếp vào Eclipse. Qua đó, bất kì người dùng nào sử dụng công cụ có thể tải về và cài đặt vào Eclipse của mình để sử dụng. Điều này 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 hơn. Tuy nhiên, trong luận văn mới chỉ 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, làm sao biết được mô hình miền được sinh ra bởi công cụ là đúng. Vì vậy, hướng phát triển tiếp theo của luận văn là xây dựng phương pháp kiểm tra tính đúng đắn của mô hình miền. Hy vọng, trong thời gian tới, tôi có thể phát triển và hoàn thiện nội dung này.

pdf32 trang | Chia sẻ: yenxoi77 | Lượt xem: 627 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Tóm tắt Luận văn 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, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
nắm bắt triệt để các yêu cầu miền và khả thi để cài đặt xét về mặt kỹ thuật [9]. Ý tưởng chính của DDD là mô hình hóa miền cho phát triển phần mềm [2]. Về lý thuyết, đội phát triển chỉ cần tập trung chủ yếu vào xây dựng mô hình miền, và tuân thủ các nguyên tắc DDD khi cài đặt. Khi bộ xương của hệ thống rắn chắc, mọi thứ trở nên dễ dàng hơn và việc triển khai các tính năng mới tương tự như việc lắp ghép các viên gạch xếp hình. Trên thực tế, việc xây dựng một phần mềm hướng miền không hề đơn giản, quá 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ất định, đảm bảo các nguyên tắc của DDD là gắn chặt cài đặt với mô hình, cô lập lớp miền và chứa các thành phần cơ bản cấu thành nên DDD. Để tăng hiệu suất tạo ra phần mềm, một công cụ Java hỗ trợ phát triển phần mềm hướng miền tên là DomainAppTool, đã được nhóm tác giả [7] đề xuất. Công cụ này sử dụng các nghiên cứu gần đây trong DDD là tập trung vào mở rộng các ngôn ngữ lập trình hướng đối tượng dựa trên annotation để xây dựng mô hình miền. Mô hình này không chỉ là cơ sở cho ngôn ngữ chung giữa các thành viên nhóm phát triển mà còn được sử dụng như đầu vào để sinh ra phần mềm [8]. DomainAppTool tự động hóa tạo ra phần mềm từ một tập các lớp miền được thiết kế với các tính năng thiết kế hướng miền. Lợi ích chính của công cụ là cho phép các nhà phát triển chỉ tập chung vào thiết kế mô hình miền để đưa ra một tập các lớp miền của phần mềm, toàn bộ phần mềm bao gồm giao diện đồ họa người dùng và đối tượng lưu trữ sẽ được tạo ra tự động vào thời gian chạy. Một trong những hạn chế của công cụ là chưa có giao diện người dùng, người sử dụng phải thực hiện thủ công một loạt các lệnh command line để tạo ra phần mềm. Phát triển phần mềm là một quá trình lặp đi lặp lại để sinh ra phần mềm cuối cùng. Trong mỗi vòng lặp phát triển, nếu sử dụng công cụ thì người dùng lại phải thực hiện các lệnh đó, gây ra không ít khó khăn và tốn nhiều thời gian. Vì vậy, tôi xin chọn đề tài “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” . Mục tiêu của luận văn là tạo ra một gói mở rộng plug-in cài trên công cụ hỗ trợ lập trình Eclipse cho DomainAppTool. Từ đó, các chức năng của nó sẽ được trực quan hóa, người dùng có thể sử dụng bất kỳ khi nào trong quá trình phát triển phần mềm. Điều này 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 hơn. Trong luận văn, tôi tập trung vào trình bày chi tiết hai đóng góp của mình là xây dựng thuật toán tạo ra cấu hình phần mềm và xây dựng gói Eclipse plug-in; cuối cùng, các bước thực hiện thực nghiệm và kết quả đạt được. Về phần bố cục, luận văn được chia thành 3 chương chính như sau: Chương 1. Kiến thức nền tảng : Trình bày cơ sở lý thuyết và các công nghệ chính được sử dụng trong 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 và thành phần mở rộng Eclipse Plug-in. Chương 2. 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 và cài đặt chi tiết của thiết kế. Các thuật toán tự động sinh phương thức cho lớp miền và cấu hình mô-đun phần mềm cũng đượ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 toán sinh cấu hình phần mềm. Chương 3. Cài đặt và thực nghiệm : Trình bày các yêu cầu về môi trường cài đặt thực nghiệm, bài toán thực nghiệm và cuối cùng là các kết quả đạt được. CHƯƠNG 1. KIẾN THỨC NỀN TẢNG 1.1. Giới thiệu chương Chương này sẽ trình bày cơ sở lý thuyết và các công nghệ chính được sử dụng trong 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 và 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, các pha trong phát triển các 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 các lớp miền và các bước xây dựng nguyên mẫu phần mềm từ các lớp miền.  Thành phần mở rộng Eclipse Plug-in: Kiến trúc mở của Eclipse và 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 là một cách tiếp cận để phát triển phần mềm có các yêu cầu phức tạp về việc liên kết cài đặt với mộ mô hình phát triển. Tiền đề của thiết kế hướng miền là:  Đặt trọng tâm chính của dự án tập trung vào miền lõi và logic miền.  Các thiết kế phức tạp được xây dựng dựa trên một mô hình miền.  Sự cộng tác giữa chuyên gia miền và chuyên gia phát triển để trau dồi lặp đi lặp lại một mô hình miền khái niệm giải quyết các vấn đề miền cụ thể. Thiết kế hướng miền phát triển từ tiền đề coi trái tim của phát triển phần mềm là kiến thức về vấn đề cần giải quyết và tìm các cách hữu ích nhất để hiểu vấn đề đó. Sự phức tạp cần giải quyết chính là sự phức tạp của miền chứ không phải là kiến thức kỹ thuật, không phải là giao diện người dùng hay thậm chí không phải chức năng cụ thể. Điều này có nghĩa là thiết kế mọi thứ xung quanh hiểu biết và quan niệm về hầu hết các khái niệm cần thiết của nghiệp vụ, chứng minh cho bất kỳ sự phát triển nào khác bằng cách nó hỗ trợ miền lõi đó như thế nào. 1.2.1. Xử lý kiến thức Phát triển phần mềm là quy trình xây dựng ra phần mềm để giải quyết các bài toán nghiệp vụ thực tế hay miền vấn đề. Phần mềm bắt nguồn và liên quan chặt chẽ với miền này. Mặt khác, phần mềm được làm từ mã nguồn. Nhà phát triển thường xa đà vào việc dành nhiều thời gian tạo ra mã nguồn và nhìn phần mềm như các đối tượng và phương thức đơn giản. Xem xét ví dụ sản xuất ô tô. 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ế về quy trình sản xuất một chiếc ô tô. Họ coi ô tô là một tập khổng lồ những linh kiện và cần lắp ráp chúng với nhau; thực ra quy trình tạo ra một chiếc ô tô phức tạp hơn thế nhiều. Một chiếc xe tốt bắt nguồn từ một tầm nhìn và nó được đặc tả một cách chi tiết, tiếp theo là thiết kế (rất, rất nhiều thiết kế). Sau nhiều tháng, thậm chí có thể vài năm; thiết kế đó lại được thay đổi, cải tiến cho tới khi thiết kế trở nên hoàn hảo nhất. Quá trình thiết kế có thể không làm luôn trên giấy, nhiều phần thiết kế bao gồm việc mô hình hóa và kiểm thử dưới điều kiện cụ thể để xem xe hoạt động hay không. Sau đó, thiết kế được thay đổi theo kết quả kiểm thử. Cuối cùng, chiếc xe được đưa vào sản xuất bao gồm sản xuất linh kiện và lắp ráp chúng vào nhau. Việc phát triển phần mềm cũng tương tự như vậy, không thể tạo ra phần mềm phức tạp mà chỉ ngồi viết mã nguồn. Để tạo ra phần mềm tốt, nhà phát triển cần hiểu về miền vấn đề mà phần mềm cần giải quyết thông qua việc trao đổi với chuyên gia miền. Những kiến thức thô về nghiệp vụ không dễ dàng chuyển hóa thành cấu trúc phần mềm trừ khi miền được “trừu tượng hóa”. “Trừu tượng hóa” miền vấn đề là việc xây dựng một mô hình miền. Theo Eric Evans, một mô hình miền không phải là một giản đồ cụ thể, quan trọng là ý tưởng mà giản đồ đó muốn truyền đạt; quan trọng không phải là kiến thức trong đầu của chuyên gia miền mà là sự trừu tượng hóa miền kết hợp chặt chẽ với kiến thức đó và cả nhóm phát triển có thể hiểu được. Mô hình là một sự thể hiện của miền cần xem xét và rất cần thiết trong suốt quá trình phát triển phần mềm. Mô hình hóa miền đòi hỏi kiến thức xử lý theo cách tương tự các nhà phân tích tài chính xử lý những con số để hiểu hiệu suất hàng quý của một công ty. Khi làm việc với chuyên gia miền, người mô hình hóa miền sẽ thử đưa ra một số ý tưởng tổ chức tập các khái niệm, sau đó, tạo các mô hình, dùng thử chúng, một số mô hình bị loại bỏ trong khi một số khác bị biến đổi. Phát triển là lặp đi lặp lại, xử lý kiến thức là liên tục trong suốt vòng đời của dự án. Các nỗ lực mô hình hóa được tạo ra trong các vòng lặp đầu tiên thường hời hợt. Sự trừu tượng hóa xuất hiện theo thời gian và phải được tái cấu trúc và sử dụng vào trong mô hình. Để đạt được điều này cần duy trì một mối quan hệ chặt chẽ, liên tục với các chuyên gia miền. 1.2.2. Ngôn ngữ chung Yêu cầu đầu tiên của cách tiếp cận DDD là ngôn ngữ chung cho phép chuyên gia miền và chuyên gia phần mềm có thể hiểu nhau và cộng tác với nhau. Thông thường, lập trình viên chỉ nghĩ tới lớp, phương thức, thuật toán và khuynh hướng diễn đạt mọi vấn đề dưới dạng mã nguồn. Khi nhìn vào các đối tượng nào đó và quan hệ mô hình giữa chúng, lập trình viên nghĩ đến kế thừa, đa hình, lập trình hướng đối tượng, Tuy nhiên, chuyên gia miền thường không hiểu những khái niệm đó. Để vượt qua rào cản giao tiếp này, DDD khuyến khích xây dựng mô hình, trao đổi ý tưởng về mô hình, về những thành phần liên quan đến mô hình. Giao tiếp tốt ở mức này rất quan trọng cho sự thành công của dự án. Khi trao đổi về mô hình, có nhiều khái niệm chuyên ngành rất dễ bị hiểu sai với người ngoài ngành. Vì vậy, cần có một từ điển thuật ngữ dự án giải thích chi tiết các khái niệm đó, đảm bảo tất cả các bên liên quan đến dự án đều hiểu đúng về mô hình. Nguyên tắc cốt lõi của thiết kế hướng miền là sử dụng ngôn ngữ dựa trên mô hình. Vì mô hình là xuất phát điểm chung, là đầu vào cho phần mềm giải quyết miền vấn đề. Ngôn ngữ chung kết nối mọi phần của thiết kế cũng như hoạt động của nhóm phát triển. 1.2.3. Rằng buộc mô hình và cài đặt Đối tượng điển hình trong mô hình có các liên kết phức tạp với các đối tượng khác và mạng lưới liên kết này có một vài đường biên tự nhiên. Khi nhà phát triển bắt đầu cài đặt ứng dụng, họ nhanh chóng phát hiện ra rằng mớ hỗn độn các liên kết không chuyển thành các đơn vị có thể lữu trữ, có thể phục hồi cùng nhờ tính toàn vẹn dữ liệu. Nếu dự án sử dụng cơ sở dữ liệu đối tượng thì nhà phát triển thậm chí phải đối mặt với những thách thức của việc ánh xạ các đối tượng vào các bảng quan hệ. Ở mức độ cơ bản, mô hình không cung cấp hướng dẫn để cài đặt. Mô hình là “chính xác” nếu là kết quả của sự cộng tác chặt chẽ giữa chuyên gia nghiệp vụ và nhà phân tích kỹ thuật. Tuy nhiên, các nhà phát triển đã đi đến kết luận rằng các đối tượng dựa trên khái niệm không thể là nền tảng thiết của họ. Vì vậy, họ tiến hành phát triển thiết kế sử dụng một vài tên lớp và thuộc tính giống nhau cho việc lưu trữ dữ liệu, nhưng nó không dựa trên bất kì mô hình đang tồn tại. Dự án có một mô hình miền nhưng mô hình chỉ tốt trên giấy trừ khi nó trực tiếp trợ giúp sự phát triển phần mềm. Mô hình đến từ nhiều nguồn và phục vụ nhiều vai trò, thậm chí những vai trò được giới hạn trong từng hoàn cảnh của một dự án phát triển phần mềm. Thiết kế hướng miền đề xuất một mô hình không chỉ hỗ trợ phân tích sớm mà còn là nền tảng của thiết kế. Việc liên kết chặt chẽ mã nguồn với một mô hình bên dưới mang lại ý nghĩa lớn cho mã nguồn, đồng thời làm cho mô hình trở nên thích hợp. Nhiều dự án phức tạp áp dụng một số mô hình miền nhưng không duy trì kết nối chặt chẽ giữa mô hình và mã nguồn. Mô hình được phát triển có thể hữu ích như một công cụ thăm dò ban đầu nhưng nó ngày càng trở nên không liên quan đến mã nguồn và thậm chí gây hiểu lầm khi mã nguồn ko gắn chặt với mô hình. Thiết kế hướng mô hình Nhiều phương pháp thiết kế ủng họ mô hình phân tích khá khác biệt so với thiết kế và thường được phát triển bởi những người khác nhau. Nó được gọi là một mô hình phân tích bởi vì nó là sản phẩm phân tích miền nghiệp vụ nhằm sắp xếp các khái niệm mà không quan tâm đến các phần khác trong hệ thống phần mềm. Một mô hình phân có ý nghĩa như là một công cụ để chỉ để hiểu miền vấn đề; việc kết hợp với cài đặt sẽ làm sao nhãng việc tập trung vào phân tích vấn đề. Do đo, thiết kế được tạo ra có thể chưa tương ứng với mô hình phân tích. Một số kiến thức được xem xét, nghiền ngẫm xảy ra trong mô hình phân tích nhưng hầu hết nó laị bị quên khi lập trình, khi nhà phát triển buộc phải đưa ra các trừu tượng hóa cho thiết kế. Sau đó, không có gì đảm bảo rằng các thông tin chi tiết thu được từ chuyên gia phân tích được nhúng vào mô hình, sẽ được lưu lại và tái sử dụng. Tại thời điểm này, việc duy trì bất kì sự ánh xạ nào giữa thiết kế và mô hình là không hiệu quả chi phí. Thậm chí, mô hình phân tích thuần túy còn thiếu mục tiêu chính của nó là hiểu miền vấn đề do những khám phá quan trọng luôn xuất hiện trong quá trình thiết kế/cài đặt. Kết quả là mô hình phân tích không được sử dụng ngay sau khi việc viết mã nguồn bắt đầu và kiến thức nền tảng phải được xem xét lại. Nếu thiết kế hoặc một số phần trung tâm của nó không ánh xạ lên mô hình miền thì mô hình đó không mang lại giá trị lớn và tính chính xác của phần mềm vẫn còn bị nghi ngờ. Đồng thời, các ánh xạ phức tạp giữa các mô hình và các chức năng thiết kế rất khó hiểu và trên thực tế không thể duy trì khi thay đổi thiết kế. Quá trình phân tích phải nắm bắt được các khái niệm cơ bản từ miền vấn đề theo một cách dễ hiểu. Thiết kế phải xác định một tập các thành phần có thể được xây dựng cùng với các công cụ lập trình được sử dụng trong dự án, các công cụ này sẽ thực hiện trong môi trường triển khai đích một cách hiệu quả và giải quyết chính xác các vấn đề đặt ra cho ứng dụng. Mô hình hướng mô hình loại bỏ sự phân tách giữa mô hình phân tích và mô hình thiết kế để tìm ra một mô hình duy nhất phục vụ cả hai mục đích. Đặt vấn đề kỹ thuật sang một bên, mỗi đối tượng trong thiết kế đóng vai trò một khái niệm được mô tả trong mô hình. Có nhiều cách trừu tượng hóa một miền và cũng có nhiều cách thiết kế có thể giải quyết vấn đề của ứng dụng. Đây chính là thứ làm cho việc liên kết chặt chẽ mô hình và thiết kế trở nên thực tế. Liên kết này không khiến cho mô hình phân tích bị suy yếu, tổn hại bởi việc xem xét các yêu tố kỹ thuật; hay phải chấp nhận các thiết kế phản ánh ý tưởng miền vụng về nhưng không sử dụng các nguyên tắc thiết kế phần mềm. Khi một mô hình dường như không phù hợp với thực tế cài đặt hoặc không thể hiện một cách trung thực các khái niệm thì một mô hình khác nên được tìm kiếm. Do đó, quy trình mô hình hóa và thiết kế trở thành một vòng lặp tiếp tục. Yêu cầu liên kết chặt chẽ giữa mô hình miền và thiết kế cung cấp thêm một tiêu chí cho việc lựa chọn các mô hình hữu ích trong vô số mô hình có thể có. Từ mô hình, thuật ngữ được sử dụng trong thiết kế và phân công công việc. Mã nguồn trở thành sự thể hiện của mô hình, vì vậy, một sự thay đổi mã nguồn có thể là một thay đổi mô hình. Ảnh hưởng của nó chắc chắn sẽ lan ra hoạt động còn lại của dự án. Việc gắn cài đặt với mô hình thường yêu cầu các công cụ và ngôn ngữ phát triển phần mềm hỗ trợ mô hình hóa như lập trình hướng đối tượng. Thiết kế hướng mô hình là trái tim của thiết kế hướng miền. Hình 1.1. mô tả các thành phần cơ bản cấu thành nên thiết kế hướng mô hình. Hình 1.1: Các thành phần cơ bản của thiết kế hướng mô hình 1.3. Phương pháp phát triển phần mềm hướng miền DDSDM DDSDM là một phương pháp phát triển lặp cho việc phát triển các nguyên mẫu phần mềm từ mô hình miền. Các nguyên mẫu này được sử dụng theo hai cách: Cách sử dụng đầu tiên và cũng là chủ yếu dành cho các chuyên gia miền và các nhóm phát triển để phát triển mô hình miền một cách tăng dần, hợp tác và tương tác. Cách sử dụng thứ hai là nguyên mẫu sẽ được tái sử dụng trong giai đoạn sau để phát triển ra phần mềm thương mại. Hình 1.4 mô tả DDSDM bao gồm các pha sau:  Pha 1: Phát triển mô hình miền khái niệm  Pha 2: Định nghĩa các vòng lặp phát triển  Pha 3: Thực hiện các vòng lặp để phát triển một tập các nguyên mẫu phần mềm  Pha 4: Tích hợp các nguyên mẫu phần mềm để tao ra nguyên mẫu cuối cùng. Hình 1.4: Tổng quan về phương pháp phát triển phần mềm hướng miền 1.3.1. Phát triển một mô hình miền khái niệm Đây là một mô hình miền ở mức cao, sẽ được sử dụng làm điểm khởi đầu cho quá trình phát triển. Mô hình này được sử dụng để định nghĩa ra các vòng lặp phát triển, hiệu suất phát triển và dần dần làm phóng phú thêm mô hình miền với tính năng chi tiết mới. Mô hình miền ở mức cao chỉ bảo gồm các lớp miền lõi (có cấu trúc không hoàn thiện) và các liên kết ban đầu giữa các lớp miền đó. Các lớp miền và liên kết này được xác định từ yêu cầu chức năng của phần mềm. Các yêu cầu đó thường được mô tả dưới dạng các ca sử dụng. Về nguyên tắc, mỗi chức năng được xác định từ một tập các lớp miền liên quan trong mô hình gọi là mô hình con. Hình 1.4 mô tả các yêu cầu chức năng sử dụng mô hình ca sử dụng. Mỗi ca sử dụng được kết nối tới một mô hình con của mô hình miền. Ranh giới của mỗi mô hình con được biểu diễn bởi một hình ô-van đây có chứa một hoặc nhiều lớp miền cùng với liên kiết giữa chúng (nếu có). Ví dụ, ca sử dụng F1 được kết nối đến mô hình con chứa hai lớp miền (tên là Cz và Cw) cùng với kết nối giữa chúng. Các mô hình con của hai chức năng chồng lên nhau ở một lớp miền được chia sẻ và/hoặc một liên kết giữa các hai lớp miền của hai mô hình con. Thông qua các điểm chồng lẫn này mà các mô hình con được kết hợp để tạo thành toàn bộ mô hình miền. Ví dụ, hình 1.4 cho thấy cách mô mình con F1 chồng lên một môt hình con khác chứa hai lớp là Cz và Cx thông qua lớp Cz, mô hình con này lại chồng lên một mô hình con khác chỉ chứa lớp Cy thông qua kết nối giữa Cx và Cy. 1.3.2. Định nghĩa các vòng lặp phát triển Khi mô hình miền ở mức cao đã được tạo, pha tiếp theo là định nghĩa ra các vòng lặp. Cùng với nhau, các vòng lặp này sẽ xây dựng kết hoặc phát triển cho phần mềm. Ý tưởng chính là định nghĩa ra mỗi vòng lặp theo ranh giới của một mô hình con. Đầu ra của mỗi vòng lặp là một nguyên mẫu phần mềm cho mô hình con đó. Một mô hình con có thể là mô hình con được định nghĩa cho mỗi chức năng trong pha trước hoặc là mô hình con nhỏ hơn trong mô hình con này. Kích thước chính xác của mô hình con phụ thuộc tài nguyên phát triển (quan trọng nhất là nguồn tài nguyên con người) sẵn có cho dự án. Mỗi vòng lặp liên quan đến việc thực hiện bốn hoạt động của một quy trình phát triển phần mềm điển hình là phân tích, thiết kế, lập trình và kiểm thử. Sự khác biệt duy nhất ở dây là thực hiện các hoạt động này để phát triển một nguyên mẫu phần mềm cho một mô hình con chứ không phải toàn bộ mô hình miền. Về mặt khái niệm, các vòng lặp phát triển hình thành một chu trình phát triển liên tục. Hình 1.4 minh họa chu trình phát triển này bằng một đường cong bên ngoài có mũi tên đi qua và kết nối bốn hoạt động phát triển phần mềm. 1.3.3. Thực hiện các vòng lặp phát triển Mỗi vòng lặp phát triển được thực hiện bởi việc phân tích, thiết kế, lập trình và kiểm thử để tạo ra một nguyên mẫu phần mềm của một mô hình con. Thông qua các vòng lặp này, các mô hình con trở nên phong phú hơn với các tính năng chi tiết hơn bao gồm các lớp miền mới, các thuộc tính và phương thức mới. Thực tế là các vòng lặp được thực hiện lặp đi lặp lại trên các mô hình phần mềm (mô hình chức năng và mô hình miền) bằng cách đóng gói chu trình phát triển bao hàm cả mô hình ca sử dụng và mô hình miền. Tính năng chính của chu trình phát triển DDSDM là ở chỗ các vòng lặp phát triển có thể được tổ chức để thực hiện song song do các mô hình con của chúng (mặc dù có chồng lên nhau) chủ yếu thực hiện các yêu cầu chức năng khác nhau. 1.3.4. Tích hợp các nguyên mẫu phần mềm Khi các vòng lặp phát triển được hoàn thành, tạo ra một tập các nguyên mẫu cho các mô hình con thì pha cuối cùng là tích hợp các nguyên mẫu này. Mục tiêu của việc tính hợp này: thứ nhất, tạo ra mô hình miền cuối cùng ;và thứ hai, tạo ra một nguyên mẫu hoàn chình. Tích hợp phần mềm thu được một cách dễ dàng trong DDSDM nhờ khả năng của công cụ hỗ trợ phát triển phần mềm DomainAppTool do cùng các tác giả của DDSDM xây dựng. Khi các mô hình con được làm phong phú thêm nhờ các vòng lặp, chúng sẽ hợp với nhau bằng cách sử dụng các lớp miền chia sẻ và/hoặc thông qua việc xác định các liên kết mới kết nối các lớp miền trong mô hình con. Bởi vì tất cả các chức năng phần mềm đã được tính toán bằng các vòng lặp nên không cần thiết thực hiện bất kỳ phân tích, thiết kế và lập trình nào nữa trong pha này. Hoạt động duy nhất phải thực hiện trong pha này là kiểm thử để đảm bảo toàn các chức năng của nguyên mẫu phần mềm là chính xác (nghĩa là tất cả các phần của nó hoạt động với nhau một cách chính xác). 1.4. Công cụ hỗ trợ phát triển phần mềm hướng miền DomainAppTool là một công cụ phát triển phần mềm Java thuần túy, được sử dụng để phát triển nhanh phần mềm phù hợp với các nguyên tắc thiết kế phần mềm hướng miền. 1.4.2. Tổng quan kiến trúc Công cụ được thiết kế dựa trên kiến trúc phần mềm MVC. Về mặt khái niệm, kiến trúc của công cụ được xây dựng từ thành phần chính: quản lý mô hình, quản lý hiển thị và quản lý đối tượng. Quản lý mô hình Thành phần này chịu trách nhiệm xử lý các lớp miền. Một lớp miền là một lớp Java được thiết kế với các tính năng thiết kế hướng miền. Mỗi lớp nắm giữ các yêu cầu miền của một khái niệm hoặc một thực thể quan tâm đến phần mềm. Các lớp miền được xác định như đầu vào khi chạy công cụ. Một tính năng chính của công cụ là nó chỉ yêu cầu nhà phát triển xác định tập các lớp miền của một phần mềm. Toàn bộ phần mềm bao gồm giao diện đồ họa GUI và lưu trữ đối tượng sẽ được tạo ra một cách tự động tại thời điểm chạy. Quản lý hiển thị Phần mềm do công cụ tạo ra có giao diện đồ họa GUI, giúp người dùng dễ dàng thực hiện các chức năng của phần mềm. Giao diện GUI này được tạo ra một cách tự động tại thời điểm chạy từ thông tin thiết kế được nhúng trong các lớp miền của phần mềm và quản lý hiển thị là thành phần chịu trách nhiệm cho nhiệm vụ này. Về nguyên tắc, quản lý hiển thị cung cấp một desktop manager cho việc quản lý các biểu mẫu đối tượng khác nhau, một thư viện các thành phần dựa trên Java Swing được sử dụng để tạo ra các biểu mẫu đó. Biểu mẫu đối tượng là thành phần then chốt trong việc cung cấp một giao diện cho phép người dùng xem và thao tác trên các đối tượng miền của một lớp miền. Quản lý đối tượng Thành phần này chịu trách nhiệm quản lý các đối tượng miền của phần mềm. Quản lý đối tượng quản lý hiệu quả các đối tượng trong bộ nhớ trong và cung cấp một cơ chế để lưu trữ các đối tượng trong bộ nhớ ngoài. Hiện tại, công cụ DomainAppTool đã hỗ trợ hệ thống quản trị cơ sở dữ liệu quan hệ Java DB, được cung cấp vởi nền tảng Java. Cơ sở dữ liệu được tạo một cách tự động cho phần mềm trong lần chạy đầu tiên. Schema của cơ sở dữ liệu được tạo từ các thông tin thiết kế nhúng trong các lớp miền của phần mềm. Tại thời điểm chạy, các đối tượng miền của phần mềm được chuyển đổi thành các bản ghi và được lưu trữ trong cơ sở dữ liệu này. 1.4.4. Phát triển các lớp miền Phần này sẽ giải thích cách phát triển các lớp miền sử dụng các tính năng thiết kế hướng miền. Tổng quan thiết kế Lớp miền là lớp được thiết kế với thông tin chuyên biệt miền. Các nền tảng ngôn ngữ hướng đối tượng hiện tại (ví dụ : .NET và Java) cung cấp hỗ trợ đặc tả các thông tin đó như một phần của thiết kế lớp. Ý tưởng là mô hình hóa thông tin chuyên biệt miền như một tập các meta-attribute, có thể được gắn vào lớp, vào các thành viên của lớp hoặc cả hai. Một meta- attribute là một tập các thuộc tính có giá trị cụ thể khi thuộc tính được đính kèm. Trong DomainAppTool, năm meta-attribute cơ bản được sử dụng để mô hình hóa một lớp miền là DClass, Dattr, DAssoc, DOpt, AttrRef. Trong đó, DClass được đính kèm vào lớp, còn các thuộc tính khác được đính kèm vào thành viên của lớp. Một meta-attribute được mô hình hóa như một lớp được gọi là lớp meta-attribute và tên bắt đầu bằng ký tự “@”. Sự đính kèm của lớp này vào lớp miền hoặc một trong các thành viên của lớp miền được mô hình hóa như một liên kết. Để phân biệt liên kết này với liên trên lớp thông thường, trong sơ đồ lớp sử dụng đường màu xám có chu trình tại phía đối diện với lớp meta-attribute. Đường liên kết tới một lớp được kết nối với một trong các cạnh của hình chữ nhật chứa lớp. Mặt khác, đường liên kết tới một thành viên của lớp sẽ vượt qua ranh giới và đi vào bên trong hình chữ nhật chứa lớp, cho đến vị trí ngoài cùng bên trái của thành viên đó. Mỗi thuộc tính của meta-attribute được định nghĩa với một giá trị mặc định. Khi cần tiết kiệm không gian, chỉ những thuộc tính có giá trị khác với giá trị mặc định được hiển thị trong mô hình thiết kế. Meta-attribute DClass Meta-attribute này có bốn thuộc tính cơ bản là schema, serialisable, singleton, mutable. Các thuộc tính khác có thể được thêm vào nếu cần thiết. Hình 1.5 biểu thị meta-attribute này được mô hình hóa trong sơ đồ lớp của phần mềm CourseMan. Các giá trị mặc định của bốn thuộc tính cơ bản được liệt kê trong đặc tả meta-attribute của lớp SClass. Meta-attribute DAttr Các thuộc tính của một lớp miền được xác định cùng với meta- atrribute DAttr. Meta-atrribute này có hai tập thuộc tính. Tập thứ nhất xác định các thông tin rằng buộc của một thuộc tính miền. Tập này có chính thuộc tính : name, type, mutable, optional, length, min, max, defaultValue, format. Tập thứ hai có bốn thuộc tính cơ bản: id, auto, serialisable, filter. Meta-attribute DAssoc Meta-atrribute này được sử dụng để xác định một đầu cuối của liên kết nhị phân giữa hai lớp miền. Về mặt khái niệm, một liên kết là một tập DAssoc được đặt tên, mỗi DAssoc xác định một đầu cuối của liên kết. Một DAssoc được gắn cho thuộc tính miền thực hiện đầu cuối liên kết. Thuộc tính này được gọi là thuộc tính kết hợp. DAssoc bao gồm các thuộc tính: ascName, role, acsType, endType, associate, dependOn. Hình 1.5 : Thiết kế cơ bản các lớp miền của phần mềm CourseMan Các phương thức Sau khi cấu trúc nền tảng của lớp miền được xây dựng sử dụng các meta-attribute, cần định nghĩa các phương thức của lớp đó. Ở đây, các thuộc tính miền cùng với các meta-attribute của chúng được sử dụng để xác định các phương thức cần thiết bao gồm phương thức khởi tạo, getter, setter và các phương mặc định khác. Các phương thức được sinh ra một cách tự động sử dụng thuật toán BspaceGen do các tác giả của DomainAppTool đề xuất. 1.4.5. Xây dựng nguyên mẫu phần mềm từ các lớp miền. Công cụ DomainAppTool sử dụng phương pháp phát triển phần mềm hướng miền DDSDM để xây dựng nguyên mẫu phần mềm từ các lớp miền. Trong mỗi vòng lặp phát triển, đầu vào là các lớp miền chứa các meta-attribute dưới dạng các annotation đặc tả dữ liệu cho một loại đối tượng, thông tin cơ bản mô tả về đối tượng. Các lớp miền đầu vào hiện tại chỉ chứa các thuộc tính mà chưa có phương thức. Ban đầu, công cụ cần tự động sinh ra một số phương thức mặc định cho lớp miền. Tiếp theo, để sinh ra được phần mềm thì công cụ cần một cấu hình phần mềm mô tả chi tiết hơn giao diện, thuộc tính (kiểu thuộc tính, các rằng buộc trên thuộc tính,), controller và lớp miền cần sử dụng. Tuy nhiên, mỗi lớp miền đầu vào lại có cấu hình riêng cho thuộc tính, phương thức, giao diện của mình được gọi là cấu hình mô-đun phần mềm. Nếu sinh trực tiếp cấu hình phần mềm từ lớp miền thì cấu hình này phải chứa tất cả các cấu hình mô-đun phần mềm. Trong mỗi vòng lặp phát triển, các lớp miền được sử dụng là khác nhau nên thao tác sinh cấu hình mô đun sẽ được thực hiện lại khi sinh cấu hình phần mềm cuối cùng. Một cách đơn giản hơn, để tăng tính mô-đun hóa cho quá trình xây dựng phần mềm hướng miền từ lớp miền: thay vì coi lớp miền là đầu vào cho các vòng lặp phát triển, hãy xây dựng cấu hình mô-đun phần mềm cho từng lớp miền và lấy cấu hình mô-đun đó là đầu vào cho các vòng lặp phát triển. Hình 1.7:Quá trình xây dựng nguyên mẫu phần mềm từ lớp miền Thuật toán Bspace được sử dụng để tự động sinh phương thức cho lớp miền đầu vào. Tuy nhiên, các phương thức được sinh ra còn đơn giản: getter/setter, tự động tăng id, thêm/xóa đối tượng trong danh sách. Thuật toán MCC được sử dụng để sinh cấu hình mô-đun phần mềm từ lớp miền hoàn chỉnh và cấu hình phần mềm được sinh ra từ cấu hình mô-đun phần mềm nhờ thuật toán SWC. Cuối cùng, công cụ DomainAppTool sẽ sử dụng cấu hình phần mềm để tạo ra nguyên mẫu phần mềm. Trong mỗi vòng phát triển, cấu hình mô-đun phần mềm được sử dụng đầu vào của quá trình tạo ra nguyên mẫu phần mềm. Tuy nhiên, khi mô hình lớp miền thay đổi thì cần cập nhật các thay đổi đó trên cấu hình mô-đun phần mềm. 1.5. Thành phần mở rộng Eclipse Plug-in Eclipse là một công cụ hỗ trợ lập trình, mã nguồn mở, được phát triển bởi IBM. Eclipse là nền 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ế, bản thân nền tảng này không cung cấp nhiều chức năng người dùng đầu cuối. Giá trị của nền tảng nằm ở chỗ nó khuyến khích phát triển nhanh các tính năng tích hợp dựa trên mô hình plug-in. Nền tảng Eclipse định nghĩa một kiến trúc mở để mỗi nhà phát triển plug-in có thể tập trung vào nhiệm vụ cụ thể của họ thay vì lo lắng về các vấn đề tích hợp. Nền tảng quản lý sự phức tạp của các môi trường chạy khác nhau như hệ điều hành hay các môi trường mày chủ làm việc nhóm. Nền tảng được thiết kế tốt, các tính năng mới quan trọng và mức độ tích hợp có thể được bổ xung mà không ảnh hưởng đến các công cụ khác. Nền tảng Eclipse được xây dựng từ khái niệm plug-in. Plug-in là các gói mã nguồn và/hoặc dữ liệu có cấu trúc đóng góp chức năng cho hệ thống. Chức năng có thể được đóng góp dưới dạng thư viện mã nguồn (các lớp Java với API công khai), các thành phần mở rộng của nền tảng hoặc thậm chí là tài liệu. Plug-in có thể định nghĩa các điểm mở rộng để các plug-in khác thêm chức năng nào. Hình 1.8: Kiến trúc mở của Eclipse Mỗi hệ thống con định nghĩa ra các điểm mở rộng cho việc bổ xung các chức năng vào nền tảng. 1.6. Tổng kết chương Chương này đã trình bày các kiến thức nền tảng được sử dụng trong luận văn. Đầu tiên, các khái niệm về thiết kế hướng miền DDD được giới thiệu. Mục tiêu của thiết kế hướng miền là . Tiếp theo, phương pháp phát triển phần mềm hướng miền DDSDM và công cụ hỗ trợ phát triển phần mềm hướng miền DomainAppTool được trình bày một cách chi tiết. DDSDM là một phương pháp phát triển lặp cho việc phát triển các nguyên mẫu phần mềm từ mô hình miền và nhờ có sự hỗ trợ của công cụ DomainAppTool mà nguyên mẫu phần mềm được sinh ra một cách nhanh chóng, phù hợp với các nguyên tắc thiết kế phần mềm hướng miền. Cuối cùng, thành phần mở rộng Eclipse Plug-in với kiến trúc mở cho phép mở rộng nền tảng Eclipse theo mục đích cụ thể thông qua việc xây dựng các plug-in. Hiện tại, việc sinh ra phần mềm từ mô hình đang được thực hiện một cách thủ công bằng các dòng lệnh command line. Điều này gây khó khăn cho người sử dụng khi muốn xem hoặc chỉnh lớp miền và các mô-đun phần mềm được sinh ra. Chương tiếp theo của luận văn sẽ trình bày quá trình xây dựng một Eclipse Plug-in cho phần mềm hướng miền. CHƯƠNG 2. XÂY DỰNG ELCIPSE PLUGIN CHO PHẦN MỀM HƯỚNG MIỀN 2.1. Giới thiệu chương Đầu tiên, các yêu cầu xây dựng Plug-in sẽ được mô tả, bao gồm yêu cầu đầu vào và yêu cầu đầu ra. Tiếp đến, mô hình thiết kế Eclipse Plug- in cho phần mềm hướng miền được trình bày: từ mô hình thiết kế UML đến các thuật toán được sử dụng cho plug-in. Có 3 thuật toán được sử dụng: thuật toán tự động sinh phương thức Bspace, thuật toán sinh cấu hình mô- đun phần mềm MCC và thuật toán sinh cấu hình phần mềm SWC. Cuối cùng là chi tiết các bước thực hiện cài đặt plug-in. 2.2. Mô tả yêu cầu cho Plug-in 2.3. Mô hình thiết kế Eclipse Plugin cho phần mềm hướng miền 2.3.1. Mô hình thiết kế UML cho Eclipse Plugin Class Diagram, Sequence Diagram, Statechart, Deployment Diagram, Component Diagram. 2.3.2. Thuật toán sinh phương thức, Thuật toán sinh mô-đun phần mềm 2.3.3 Thuật toán sinh cấu hình phần mềm SWC Input: c1,cN: Module Configuration Classes (MCCs), m: ModuleMain.class, p: project name, i: iterator number Output: s: Softwaare Configuration Class let ns= “SWC” + i let s = Class (visibility = “public”, name = ns ) let dm = modules(c1,c2,cN, m) let da = appName(p) let dlo = screenLogo(p + “logo.png” ) let dla =Language(Language.English) let do = OrgDesc(name = “”, address = “”, logo = “”, url = “”) let dd = DSDesc(type = “postgresql”, dsUrl = “”, user = “”, password = “”, dsmType = DSM.class, domType = DOM.class, omsType = postgreSQL.class, connType = ConnectionType.client let dsp = SysSetUpDesc( setUpConfigType = setUpConfig.class) let dsc = SecurityDesc( isEnable = false) let ds = SystemDesc(s) : appName = da , screenLogo = dlo , language = dla , orgDesc = do , dsDesc = dd , setUpDesc = dsp , securityDesc = dsc 2.4. Thiết kế chi tiết Plugin Các bước thực hiện xây dựng plug-in như sau: Hình 2.4: Các bước xây dựng Plug-in Bước 1: Tạo dự án plug-in mới Vào File > New > Other > Plug-in Development > Plug-in Project để tạo plug-in mới. Tên dự án “DomainAppEclipsePlugin” và nhấn Next. Cuối cùng, nhấn Finish, dự án mới được tạo ra sử dụng Template đã chọn. Đối với mẫu “Hello, World Command”, eclipse sẽ mặc định import bốn plug-in khác được yêu cầu cho Template và mặc định tạo package có tên theo cú pháp “ID + handlers”. Giao diện dự án mới như sau: Hình 2.7: Màn hình dự án Plug-in mới đã tạo Bước 2: Thêm vào các thư viện cần thiết cho plug-in  Tạo thư mục /lib và import các thư viện .jar : dcsl.jar, mccl.jar, swcl.jar domainapp.jar và javaparser-core-3.2.5.jar.  Khai báo các thư viện ngoài trong tệp META-INF/MANIFEST.MF: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: MCCsGenerator Bundle-SymbolicName: DomainAppEclipsePlugin;singleton:=true Bundle-Version: 1.0.0.qualifier Require-Bundle: org.eclipse.ui, org.eclipse.jdt.core;bundle-version="3.13.50", org.eclipse.core.runtime;bundle-version="3.13.0", org.eclipse.core.resources;bundle-version="3.12.0", org.eclipse.core.expressions;bundle-version="3.6.0", org.eclipse.e4.core.di.annotations;bundle-version="1.6.0", org.eclipse.e4.core.services;bundle-version="2.1.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ClassPath: ., lib/domainapp.jar, lib/javaparser-core-3.2.5.jar, lib/dcsl.jar, lib/mccl.jar, lib/swcl.jar Bước 3: Tạo ba lớp handlers tương ứng với ba item trên Context Menu “Source” Plug-in này sẽ bổ sung ba item mới cho Menu “Source” là:  Generate Bspace: Khi người dùng chọn các lớp miền > chuột phải nhấn Source > Generate Bspace. Handler “GenerateBspace” sẽ sinh ra các phương thức cho các lớp miền đã chọn.  Generate MCC: Khi người dùng chọn các lớp miền > chuột phải nhấn Source > Generate MCC. Handler “GenerateMCC” sẽ sinh ra các cấu hình mô-đun phần mềm chứa các lớp miền đã chọn.  Generate SWC: Khi người dùng chọn các mô đun cấu hình phần mềm > chuột phải nhấn Source > Generate SWC. Handler “GenerateSWC” sẽ sinh ra cấu hình phần mềm chứa các mô đun cấu hình phần mềm đã chọn. Ba lớp handers “GenerateBspace”, “GenerateMCC” và “GenerateSWC” có cấu tạo tương tự nhau, chỉ khác gọi đến các thư viện khác nhau khi sinh ra các tệp đâu ra. Mã nguồn handlers “GenerateBspace” như sau: public class GenerateBSpace extends AbstractHandler{ private String rootSrcPath=""; @Override public Object execute(ExecutionEvent event) { Shell shell = HandlerUtil.getActiveShell(event); IStructuredSelection selections = HandlerUtil.getCurrentStructuredSelection(event); ICompilationUnit firstCu = (ICompilationUnit) selections.getFirstElement(); Iterator selectedElements = selections.iterator(); Object selectedElement; while (selectedElements.hasNext()) { selectedElement= selectedElements.next(); generateBSpaces(shell, selectedElement); } try { firstCu.getJavaProject().getProject() .refreshLocal(IResource.FOLDER, null); } catch (CoreException e) { e.printStackTrace(); } MessageDialog.openInformation(shell, "Info", "Finish !!!"); return null; } private void generateBSpaces(Shell shell, Object firstElement) { ICompilationUnit cu = (ICompilationUnit) firstElement; String[] domainClsNameStr = new String[]{cu.getElementName().split("\\.")[0]}; try { String pkgName = cu.getPackageDeclarations()[0].getElementName(); BSpaceGenTool bSpaceGenTool = new BSpaceGenTool(rootSrcPath, pkgName, domainClsNameStr) ; bSpaceGenTool.exec(); } catch (JavaModelException e) { e.printStackTrace(); } } Khi người dùng nhấn vào “Generate Bspace”, phương thức execute của handler này được kích hoạt. Đầu tiên, lớp HandlerUtil sẽ xác định các lớp được lựa chọn (chính là các lớp miền) cho sự kiện nhấn chuột vừa xảy ra là gì. Sau đó, vòng lặp sinh phương thức gọi đến hàm generateBSpaces cho mỗi lớp miền được thực hiện. Hàm “generateBSpaces” sẽ đọc đường dẫn đến các lớp miền và sử dụng thư viện dcsl.jar để thực thi sinh ra các phương thức cho các lớp miền. Các handler còn lại được xây dựng một cách tương tự. Bước 4:Tạo các điểm mở rộng trong plug-in.xml Mở tệp plug-in.xml > chọn tab Extensions > hiện thị mặc định bốn điểm mở rộng cần được thiết lập : Hình 2.7: Màn hình Extensions  Tạo các command: Chọn org.eclipse.ui.commands > chuột phải chọn New > Generic > Sửa các thông tin: catagoryId, id, name. Hình 2.8: Màn hình tạo các command  Khai báo các lớp hander: Chọn org.eclipse.ui.handlers > chuột phải chọn New > Generic > Sửa các thông tin: class,commandId. Trong đó, thuốc tính class phải được trỏ đến lớp handler đã tạo ở bước 3 còn commandId thì trỏ đến command tương ứng trong org.eclipse.ui.commands.  Tạo các bindings: Chọn org.eclipse.ui.bindings > chuột phải chọn New > Generic > Sửa các thông tin: commandId, contextId và sequence. Trong đó, commandId được khai báo với command tương ứng trong org.eclipse.ui.commands; contextId thể hiện loại component nào được sử dụng (context menu, menu, button,), mỗi component có id mặc định khác nhau và được tra cứu trên các hướng dẫn của PDE; cuối cùng sequence hiển thị phím tắt cho component đã tạo. Hình 2.10: Màn hình khai báo các bindings  Thiết lập vị trí cho component mới: Chọn org.eclipse.ui.menu > chuột phải chọn New > Generic > Sửa các thông tin locationURI bằng “popup:org.eclipse.jdt.ui.source.menu?after=DPSeparator”: thêm thành phần mới này vào contextmenu “Source” sau một dòng ngăn cách. Tiếp tục, nhấn chuột vào “popup:org.eclipse.jdt.ui.source.menu?after=DPSeparator” vừa tạo > > chuột phải chọn New > Generic > Sửa các thông tin: commandId, id, label. Trong đó, commandId chỉ đến command tương ứng đã tạo trong org.eclipse.ui.commands và label sẽ hiển thị tên item mới. Hình 2.11: Màn hình khai báo vị trí của các item mới trên menu Bước 5: Chạy dự án Chọn dự án PDE đã tạo > chuột phải nhấn Run As > Eclipse Plugin 2.5. Tổng kết chương Chương này đã mô tả chi tiết các bước thực hiện xây dựng plug-in từ thuật toán sử dụng, mô hình thiết kế plug-in cho đến cài đặt mã nguồn. Plug-in được tạo ra đáp ứng các yêu cầu đầu vào, hứa hẹn sẽ giúp cho công cụ hỗ trợ phát triển phần mềm hướng miền của nhóm tác giả [7] được sử dụng rộng rãi. Ở chương tiếp theo, plug-in sẽ được cài đặt và chạy thử nghiệm trên một ví dụ thực nghiệm. Từ đó, đánh giá được những điểm hạn chế và đề xuất các hướng phát triển. CHƯƠNG 3. CÀI ĐẶT VÀ THỰC NGHIỆM 3.1. Giới thiệu chương Tính thực tiễn và hiệu quả của plug-in sẽ được đánh giá thông qua việc sử dụng một ví dụ phần mềm thực tế. Cụ thể, mội dung chính của chương bao gồm đưa ra một mô hình miền điển hình của một phần mềm thực tế để vận dụng plug-in vào việc sinh cấu hình phần mềm, kết quả thu được là phần mềm tự động được sinh ra theo cấu hình phần mềm đó. 3.2. Môi trường cài đặt Plug-in tương thích với Java phiên bản 1.8 và Eclipse phiên bản Oxygen.1a Release 4.7.1a . 3.3. Bài toán quản lý khóa học CourseMan là ví dụ điển hình được sử dụng xuyên suốt để minh họa phương pháp thiết kế phần mềm hướng miền DDSDM cũng như ứng dụng của công cụ DomainAppTool. Trước đây, phần mềm được tự động sinh ra nhờ việc thực hiện một loạt các dòng lệnh command-line, gây khó khăn cho người dùng trong việc sử dụng công cụ DomainAppTool để thiết kế mô hình miền hoàn chỉnh. Trong chương này, luận văn cũng xin sử dụng CourseMan làm ví dụ thực nghiệm nhưng nhờ có plug-in, việc tạo ra CourseMan trở nên dễ dàng hơn. Áp dụng phương pháp phát triển phần mềm hướng miền DDSDM để xây dựng phần mềm CourseMan: Phát triển một mô hình miền khái niệm Hình 3.2: Mô hình miền khái niệm và các mô hình con của CourseMan Bên phải hình 3.2 là mô hình miền khái niệm của CourseMan. Mô hình này được tạo nên bởi năm mô hình con. Các mô hình con được biểu diễn bởi hình ô-van điền đầy và được kết nối tới một ca sử dụng ở phía bên trái. Hai mô hình con đầu tiên chứa các lớp miền Student và Module tương ứng, mô hình con thứ ba chưa cả hai lớp miền Student, Module và liên kết giữa chúng. Liên kết này đại diện cho sự đăng ký của sinh viên vào các môn học. Định nghĩa các vòng lặp phát triển CourseMan có năm ca sử dụng tương ứng năm vòng lặp phát triển là: STT Ca sử dụng Các mô hình con 1 Manage students Student 2 Manage course modules CourseModule 3 Manage enrollments Student, CourseModule 4 Manage student classes SClass, Student 5 Manage student-by-name reports StudentByNameReport, Student Thực hiện các vòng lặp phát triển Các hoạt động được thực hiện trong vòng lặp thứ nhất : Hoạt động Mô tả Kết quả Phân tích Phân tích ca sử dụng “Manage students” để phát hiện ra một lớp mới tên là Address, đại diện cho địa chỉ của mỗi Student . Mô hình con với hai lớp miền Student và Address . Thiết kế Áp dụng các quy luật thiết kế để thiết kế lớp miền Student và Address. Một mô hình con thiết kế được thiết kế chi tiết. Lập trình  Tự động sinh các phương thức cho lớp  Mã nguồn hoàn chỉnh của lớp miền Student và miền Student và Address sử dụng BspaceGen.  Tự động sinh cấu hình mô-đun phần mềm từ lớp miền sử dụng MCC  Tự động sinh cấu hình phần mềm từ mô-đun ModuleMain và các mô-đun vừa sinh sử dụng SWC. Address: đầy đủ các thuộc tính và phương thức.  Mã nguồn cho cấu hình mô-đun phần mềm là ModuleStudent và ModuleAddress.  Mã nguồn cấu hình nguyên mẫu phần mềm cho vòng lặp thứ nhất bao gồm ModuleMain, ModuleStudent và ModuleAddress Kiểm thử  Sử dụng thư viện của công cụ DomainAppTool với cấu hình phần mềm đã sinh để tạo ra nguyên mẫu phần mềm  Kiểm tra bảng dữ liệu cho mỗi lớp bao gồm: test- case, kết quả mong đợi và kết quản thực tế. Thực hiện một cách tương tự cho các vòng lặp sau để thu được các nguyên mẫu phần mềm. Tích hợp các nguyên mẫu phần mềm Mặc dù các mô hình con của các vòng lặp có thể liên quan đến các tập con khác nhau của các lớp miền nhưng các lớp miền cùng với nhau tạo thành cây mã nguồn chung của mô hình miền CourseMan. Khi làm việc trên cùng một lớp miền trong các vòng lặp khác nhau thì lớp miền cần nhận ra yêu cầu của từng lần lặp. Giả các lần lặp không xung đột với nhau hoặc xung đột có thể giải quyết được thì một mô hình miền hoàn chỉnh của CourseMan sẽ được xây dựng. Tuy nhiên trong phạm vi của mình, luận văn chỉ tập trung vào việc xây dựng thuật toán tự động sinh cấu hình phần mềm cho các vòng lặp phát triển và cài đặt các thuật toán đó trên thành phần mở rộng EclipsePlugin. Phần sau sẽ mô tả chi tiết các bước thực hiện sinh nguyên mẫu phần mềm CourseMan sử dụng plug-in và đánh giá kết quả đạt được. 3.4. Kết quả thực nghiệm Bước 1: Chuẩn bị đầu vào Đầu vào của thực nghiệm là mô hình miền của CourseMan và lớp ModuleMain. Mô hình miền có thể là một mô hình miền chưa hoàn chỉnh, thông qua việc thực hiện các vòng lặp phát triển, mô hình miền sẽ được làm phong phú và hoàn thiện. Bước 2: Sinh phương thức cho lớp miền nhờ BspaceGen Các phương thức của lớp miền được sinh ra bằng cách thực hiện: Chọn các 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 Bước 3: Sinh tập cấu hình mô-đun phần mềm, được xây dựng từ mô hình lớp miền. Cách thực hiện: chọn các lớp miền sinh ra từ bước 2 > 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 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 và các cấu hình mô-đun phần mềm sinh ra từ bước 3 > chuột phải, chọn Source > chọn Generate SWC Hình 3.7: Giao diện menu sinh cấu hình phần mềm Bước 5: Sinh phần mềm từ tập cấu hình phần mềm Chạy chương trình: chuột phải CourseMan > Run As > Run Configurations. Màn hình Run Configurations hiện ra > chọn cấu hình CourseMan vừa tạo > cuối cùng chọn Run. Giao diện phần mềm CourseMan được sinh ra như sau: Hình 3.11: Giao diện phần mềm CourseMan 3.5. Tổng kết chương Kết quả 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 hơn. Các vòng lặp phát triển được thực hiện đơn giản thông qua nhấn chuột thay vì thực hiện một loạt các lệnh command line. Tuy nhiên, hệ thống vẫn còn ba hạn chế chính: một là phần mềm được thêm ra mới chỉ dừng lại ở các chức năng cơ bản là thêm, sửa, xóa; hai là việc thay đổi cấu hình mô-đun phần mềm hiện tại vẫn phải thực hiện thủ công bằng cách thay đổi trực tiếp mã nguồn mà số lượng thuộc tính nhiều, sẽ gây không ít khó khăn cho nhà phát triển; ba là chưa có phương pháp kiểm tra tính đúng đắn của lớp miền, cấu hinh mô-đun phần mềm và cấu hình phần mềm (hiện tại, chủ yếu thực hiện kiểm thử phần mềm sinh ra có lỗi không). 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 những nhu cầu phức tạp, kết nối cài đặt với một mô hình đang phát triển của các khái niệm nghiệp vụ. DDD bao gồm một ngôn ngữ chung, các kỹ thuật và mô hình cũng như một kiến trúc; tập trung vào mô hình hóa các vấn đề cần giải quyết. Với DDD, các nhà phát triển có được những kỹ thuật giúp tối thiểu hóa sự phức tạp và thúc đẩy sự cộng tác với các chuyên gia miền. Với những ưu điểm vượt trội của mình, DDD thực sự là một phương pháp phát triển phần mềm hiện đại và 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 trên các nguyên tắc DDD, giúp tự động sinh ra phần mềm từ các mô hình lớp miền. Nhờ đó, mà người dùng chỉ cần tập trung vào miền vấn đề và mô hình miền, toàn bộ phần mềm (bao gồm giao diện và lữu trữ đối tượng) sẽ được sinh ra một cách tự động. Từ đó, nâng cao hiệu xuất sản xuất phần mềm. Mặc dù, chức năng các phần mềm được tạo ra bởi 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 hơn với các nhà phát triển phần mềm. Một trong những hạn chế của công cụ là không có giao diện trực quan, dẫn đến những khó khăn cho người dùng cũng như tốn nhiều thời gian trong quá trình sử dụng. Luận văn này đã giải quyết được hạn chế này bằng việc xây dựng một ứng dụng Eclipse plug-in. Về mặt lý thuyết, ứng dụng này được xây dựng từ ba thuật toán là 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 và cuối cùng là thuật toán sinh cấu hình phần mềm do tôi phát triển. Ứng dụng này là một phần của Eclipse và được tích hợp trực tiếp vào Eclipse. Qua đó, bất kì người dùng nào sử dụng công cụ có thể tải về và cài đặt vào Eclipse của mình để sử dụng. Điều này 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 hơn. Tuy nhiên, trong luận văn mới chỉ 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, làm sao biết được mô hình miền được sinh ra bởi công cụ là đúng. Vì vậy, hướng phát triển tiếp theo của luận văn là xây dựng phương pháp kiểm tra tính đúng đắn của mô hình miền. Hy vọng, trong thời gian tới, tôi có thể phát triển và hoàn thiện nội dung này. TÀI LIỆU THAM KHẢO Tiếng Việt 1. 1. Septeni Technology, 2015, “Domain-Driven Design Quickly bản tiếng Việt” được dịch từ Abel Avram & Floyd Marinescu, (2006), “Domain-Driven Design Quickly”. Tiếng Anh 2. Eric Evans, (2013), “Domain-Driven Design: Tackling Complexity in the Heart of Software”, pp.4-99 3. Alex Blewitt, (2014), “Mastering Eclipse Plug-in Development”, pp. 7-77. 4. Eclipse, (2018), “https://help.eclipse.org/photon/index.jsp”, last visit was on 12/11/2018 5. K. Czarnecki, (2004),“Overview of Generative Software Development,” in Unconventional Programming Paradigms 2004, no. 3566, pp. 326–341. 6. M. Fowler et al., (2010), “Domain-specific languages”, pp.. 7. J. Gosling et al., (2014), “The Java Language Specification, Java SE 8 Edition”. 8. Duc Minh Le, Duc-Hanh Dang. (2017), “DomainAppTool: A Domain-Driven Software Development Tool”, Hanoi University. 9. Duc Minh Le, Duc-Hanh Dang, Viet-Ha Nguyen. (2018), “On Domain Driven Design Using Annotation-Based Domain Specific Language”, 10. 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. 11. B.Liskov and J.Guttag, 2000, “Program development in Java: abstraction, specification, and object-oriented design”, Pearson Education

Các file đính kèm theo tài liệu này:

  • pdftom_tat_luan_van_nghien_cuu_va_cai_dat_mot_cong_cu_tren_nen.pdf
Luận văn liên quan