Hình 16: Giao diện khi kết nối thành công các cổng

Một phần của tài liệu NGHIÊN CỨU THIẾT KẾ THEO HỢP ĐỒNG VÀ XÂY DỰNG CÔNG CỤ HỖ TRỢ (Trang 45 - 59)

các cổng của các thành phần

Hình 8: Lớp Contract

Bảng 8: Chi tiết lớp Contract

STT Thuộc tính Kiểu dữ liệu Phạm vi Mô tả

01 namePort1 String private Tên cổng thứ 1 02 namePort2 String private Tên cổng thứ 2

4.4.Triển khai

Ứng dụng được phát triển bằng ngôn ngữ Java nên cần phải cài đặt JDK trước khi chạy chương trình.

- Tải jdk tại địa chỉ: http://java.sun.com/javase/downloads/widget/jdk6.jsp - Chọn hệ điều hành tương ứng rồi click vào nút download.

- Bắt đầu chạy ứng dụng.

4.5.Thử nghiệm 4.5.1. Bài toán

Giả sử chúng ta có một hệ thống Stock Quoter (Hình 9) [5] Đây là một hệ thống phức tạp với nhiều thành phần kết nối với nhau.

Hình 9: Kiến trúc CCM của hệ thống Stock Quoter.

Để có thể giới thiệu công cụ một cách dễ hiểu với người đọc, chúng ta sẽ tiếp cận với hệ thống đơn giản trước. Hệ thống Stock Quoter đơn giản gồm 2 thành phần với các cổng notifier_out, notifier_in, quoter_info_out, quoter_info_in (Hình 10) [12]

Hình 10: Giao diện thành phần CORBA và các cổng.

Hình vẽ minh họa hệ thống Stock Quoter bằng cách sử dụng mô hình thành phần CORBA. Thành phần Stock Distributor biểu diễn hệ cơ sở dữ liệu chứng khoán thời gian thực. Khi các giá trị của cổ phiếu thay đổi, nó đẩy một eventype có chứa tên cổ phiếu thông qua một cổng event source (notifier_out) đến cổng event sink (notifier_in) tương ứng của một hoặc nhiều thành phần Stock Broker khác. Nếu các thành phần StockBroker này cần những thông tin khác của cổ phiếu, chúng có thể yêu cầu một hành động thông qua cổng receptacle (quoter_info_in) của thành phần StockBroker đến cổng facets (quoter_info_out) của thành phần StockDistributor.

Dưới đây là sự thực thi của thành phần StockBroker và StockDistributor. Các cổng được định nghĩa như sau:

component StockBroker {

consumesStockName notifier_in;

usesStockQuoter quoter_info_in; };

component StockDistributor supports Trigger {

publishesStockName notifier_out;

providesStockQuoter quoter_info_out;

attributelong notification_rate; };

Thành phần StockBroker chứa hai cổng tương ứng với hai chức năng mà nó thực hiện. Một eventtype gọi là notifier_in sẽ tiếp nhận thông tin từ thành phần StockDistributor khi giá trị cổ phiếu thay đổi. Ở hình trên, cổng notifier_in được kết nối với cổng notifier_out của thành phần StockDistributor khi kiến trúc CCM được triển khai và cấu hình công cụ khi ứng dụng được thực hiện. Nó sử dụng giao diện StockQuoter được cung cấp bởi thành phần StockDistributor mà báo cáo thông tin về cổ phiếu như giá cổ phiếu tăng hay giảm hay giá trị giao dịch của cổ phiếu trong ngày.

Thành phần StockDistributor xuất một eventtype được gọi là notifier_out để đẩy thông tin về thành phần StockBroker khi mà giá trị cổ phiếu thay đổi. Ngoài ra, nó còng định nghĩa một cổng facet được gọi là quoter_info_out trong đó chứa các thông tin thêm về một cổ phiếu cụ thể. Tiếp theo, thành phần này còn định nghĩa một thuộc tính attribute có tên là notification_rate mà quản trị hệ thống có thể sử dụng để kiểm soát tốc độ của thành phần StockDistributor, cơ sở dữ liệu bảng giá cổ phiếu và đẩy những thay đổi cho thành phần StockBroker để người dùng có thể theo dõi trực tiếp.

Sau quá trình phân tích, thiết kế, lập trình và kiểm thử chúng tôi đã xây dựng (mặc dù chưa hoàn thiện) ứng dụng đặc tả và kiểm chứng. Dưới đây là một số giao diện của ứng dụng

4.5.2. Giao diện khởi động chương trình

Hình 11: Giao diện khởi động ứng dụng

Giao diện khởi động chương trình bao gồm thanh menu File, Edit, View… Thanh công cụ dùng để thêm các thành phần và các cổng ở bên trái chương trình. Bên phải là panel thể hiện những hình vẽ mà người dùng vẽ ra. Ở dưới là khung hiển thị các bước làm của người dùng. Thông báo kết quả các cổng của thành phần có kết nối được hay không.

4.5.3. Giao diện khi làm việc với các thành phần

Hình 12: Giao diện điền thông tin khi thêm mới 1 thành phần (adsbygoogle = window.adsbygoogle || []).push({});

Khi chọn nút vẽ thành phần, giao diện để điền thông tin cho component được khởi tạo. Người dùng điền tên thành phần vào khung Name, sau đó chọn OK để hoàn thành. Nếu không cần tạo thành phần nữa thì click vào nút Cancel để bỏ qua.

Sau khi tạo thành công, mô hình thành phần sẽ được thể hiện như hình vẽ 13. Dưới đây là 3 thành phần được đặt tên là Stock Distributor, Stock Broker.

Hình 13: Giao diện kết quả sau khi thêm một thành phần thành công 4.5.4. Giao diện làm việc với các cổng

Sau khi tạo thành công các thành phần, người dùng có thể tạo các cổng cho từng thành phần bằng cách click vào nút khởi tạo cổng ở thanh công cụ bên tay trái cửa sổ. Sau khi chọn vị trí cho cổng trên thành phần, giao diện điền thông tin cho cổng hiện lên, bao gồm tên cổng, tên kiểu, tên kiểu cha nếu có kế thừa. (Hình 14)

Hình 15: Giao diện kết quả khi thêm mới cổng thành công

Sau khi tạo cổng thành công, màn hình sẽ hiện lên như sau (Hình 15).

Ở đây, cổng có tên là: notifier_out, quoter_info_out… được tạo trên Stock Distributor.

4.5.5. Giao diện sau khi kiểm chứng kết nối giữa các thành phần

Hình 16: Giao diện khi kết nối thành công các cổng

Sau khi tạo các thành phần và các cổng thành công. Người dùng có thể kết nối các cổng của các thành phần với nhau để kiểm tra bằng cách click vào biểu tượng kết nối trên thanh công cụ, click chuột vào cổng thứ nhất và di đến cổng thứ hai là cổng cần kết nối.

Sau khi kết nối, chương trình sẽ kiểm tra đặc tả của các cổng mà người dùng đã điền ở trên và kiểm tra với các điều kiện kết nối. Nếu thỏa mãn, kết nối thành công và được thể hiện ở hình 16. Trái lại, nếu không thành công, chương trình sẽ hiện lên bảng thông báo như hình 17 (Xem lại các điều kiện kết nối phần 3.3.3 trang 30).

Kết luận

Qua quá trình nghiên cứu và thực hiện khoá luận, chúng tôi nhận thấy đã đạt được một số kết quả chính sau:

- Nắm bắt được khá rõ các nền tảng cần thiết để có thể nhìn gần hơn về một hệ thống phần mềm đúng đắn và bền vững. Nói một cách dễ hiểu, phần mềm đúng đắn là phần mềm có ít lỗi và xử lý được những lỗi bất thường xảy ra trong phần mềm trong lúc làm việc. Như thế, phần mềm mới có khả năng tồn tại lâu dài với thời gian và được người dùng ưa chuộng.

- Hiểu khá rõ về công nghệ Design ByContract và khả năng ứng dụng của nó trong lập trình hướng đối tượng. Một hệ thống phần mềm được xem như là tập hợp các thành phần có các giao tiếp tương tác với nhau dựa trên định nghĩa chính xác của các giao ước trong hợp đồng. Phải thỏa mãn những giao ước đó thì các thành phần mới có thể liên kết với nhau để tạo nên sự chính xác, tính đúng đắn cho phần mềm. Ngoài ra, công nghê này còn cung cấp một công cụ rất tốt cho việc viết tài liệu phát triển cho phần mềm, dễ dàng phát hiện và gỡ lỗi. - Xây dựng một công cụ đặc tả và kiếm chứng cho sự liên kết của các thành phần

bằng ngôn ngữ Java. Khi sử dụng ứng dụng này, một cách trực quan, người dùng nhanh chóng vẽ ra các thành phần cùng với các cổng.

- Ngoài ra chúng tôi đã trình bày một số khía cạnh của đặc tả thành phần, vạch ra phương pháp tiếp cận với cách giao tiếp của thành phần dựa trên các loại cổng được kết nối. Chúng tôi đã xác định các ràng buộc về cổng, nhờ đó, chúng ta có thể biết được các thành phần có thể kết nối được với nhau nếu chúng đáp ứng được những yêu cầu mà chúng tôi đã nêu ở trên. Ở mức độ này, chúng tôi mới chỉ nghiên cứu đến các loại cổng (facet, receptacle, event source, event sink) và các ràng buộc về loại cổng. Chúng tôi đã xác minh điều kiện kết nối của các loại cổng và tích hợp chúng với nhau để hỗ trợ cho phương pháp tiếp cận của chúng tôi. Điều này sẽ ủng hộ chúng tôi trong việc xác minh tính tương thích giữa các thành phần bởi các đặc tả hành vi ở mức độ ngữ nghĩa.

Hướng phát triển

Trong thời gian tới, chúng tôi sẽ tiến hành kiểm tra thành phần cấu tạo giữa các hành vi của các cổng khi kết nối thành công giữa các loại cổng.

Sau đó chúng tôi sẽ nâng cấp ứng dụng hiện tại để có thể hỗ trợ tốt hơn việc đặc tả và kiểm chứng cho công đoạn kết nối các thành phần của phần mềm hướng thành phần này.

Tài liệu tham khảo Tài liệu tham khảo tiếng Việt

[1] Nguyễn Thanh Bình - Đặng Thị Lệ Thu. Giải pháp nâng cao chất lượng phần mềm hướng đối tượng. Tạp chí khoa học và công nghệ, Đại học Đà Nẵng. Số 5(28).2008.

Tài liệu tham khảo tiếng Anh

[2] A. M. Zaremski and J. M. Wing. Specification matching of software components. 333–369, 1997.

[3] B. Meyer. Design By Contract, in Advances in Object-Oriented Software Engineering. Prentice Hall. 1991.

[4] B. Meyer. Eiffel: The Language. Prentice Hall. 1992.

[5] Bala Natarajan, Douglas C. Schmidt, and Steve Vinoski. The CORBA Component Model. http://www.drdobbs.com/cpp/184403888. September 01, 2004

[6] Boodhoo, Jean-Paul. Design Patterns: Model View Controller. Retrieved 2009-07- 07.

[7] C.A.R Hoare. An axiomatic basis for computer programming. Communications of the ACM. 1969.

[8] Ivica Crnkovic - Magnus Larsson. Building Reliable Component-Based Software Systems. Artech house, Inc. 2002. tr.3-18 và tr.73-76. (adsbygoogle = window.adsbygoogle || []).push({});

[9] Frank Pilhofer. Writing and Using CORBA Components. Technology report, FPX. 04/2002.

[10] Jeremy Rosenberger. Teach Yourself CORBA In 14 Days

[11] Jonas Bergström. Design By Contract for Java. http://c4j.sourceforge.net/.

[12] Tran Thi Mai Thuong - Vo Van Thanh - Truong Ninh Thuan. Checking the conformability in CORBA component model specifications. Journal of Science, Natural Sciences and Technology. 2008.

[13] Yi Liu - H. Conrad Cunningham. Software Component Specification Using Design by Contract. National Defense Industry Association. 04/2002.

Phụ lục

(Hướng dẫn sử dụng chương trình)

Sau khi cài đặt môi trường jre cho java. Người dùng có thể click vào file chạy chương trình để chạy công cụ (Hình 11)

Đầu tiên để vẽ một thành phần, người dùng có thể click vào nút có biểu tượng sau đó di chuột sang màn hình bên phải để vẽ. Chương trình sẽ hiện lên bảng đòi người dùng phải điền đầy đủ thông tin cho thành phần. Sau khi hoàn thành thao tác, click vào nút ok để vẽ hoặc click vào nút cancel để bỏ qua không vẽ nữa.

Để có thể vẽ các cổng cho thành phần, người dùng click vào nút có các biểu tượng , , , , tương ứng với các cổng attribute, facet, receptacle, event source, event sinks. Chú ý, các cổng nằm trên thành phần nên khi vẽ, người dùng phải click vào phạm vi bên trong thành phần, nếu không sẽ có thông báo lỗi hiện ra ngăn cấm việc vẽ các cổng. Chương trình sẽ hiện lên khung bắt buộc người dùng điền thông tin cho các cổng đó. Khung thông tin bao gồm ô điển tên cổng, kiểu của cổng, và tủy chọn xem kiểu của cổng đó có kế thừa kiểu nào khác của một cổng nào đó khác hay không. Sau khi hoàn thành thao tác, người dùng click vào ok để vẽ cổng hoặc click vào cancel để bỏ qua không vẽ cổng nữa.

Sau khi vẽ xong các thành phần và các cổng, người dùng có thể click vào nút có biểu tượng để tiến hành kết nối các cổng của các thành phần. Người dùng click chuột vào 1 cổng bất kỳ và giữ lỳ chuột, di đến cổng thứ 2 cần kết nối, sau đó thả chuột ra. Chương trình sẽ kiểm tra các điều kiện kết nối (xem lại mục 3.3.3). Nếu không thỏa mãi một trong 5 điều kiện đã nên ở trên, sẽ có một bảng thông báo kết nối không thành công kèm theo lỗi xảy ra ở điều kiện nào. Sau khi người dùng xác nhận, phần kết nối sẽ tự động được xóa đi.

Ngoài ra người dùng có thể dùng thêm một số chức năng phụ như tạo mới một bản đặc tả mới bằng cách vào menu File → New.

Nếu người dùng kết nối sai cổng (nhưng vẫn thỏa mãn điều kiện) thì có thể sử dụng chức năng undo hoặc redo bằng cách vào menu Edit → Undo hoặc Edit → Redo.

Một phần của tài liệu NGHIÊN CỨU THIẾT KẾ THEO HỢP ĐỒNG VÀ XÂY DỰNG CÔNG CỤ HỖ TRỢ (Trang 45 - 59)