Thành phần phần mềm - hướng phát triển  
 

(Post 02/02/2007) Công nghệ phần mềm phát triển qua nhiều giai đoạn và từng giai đoạn luôn có những công nghệ mới xuất hiện, giúp phát triển phần mềm thuận lợi và bền vững. Bài viết này muốn giới thiệu một khía cạnh đang được đầu tư nghiên cứu, đó là Component-Based Development (CBD – tạm dịch là phát triển trên các thành phần).

Ví dụ về thành phần với các kiểu đầu vào – ra

Ưu điểm của CBD là khả năng sử dụng lại và thời gian phát triển ngắn. Tuy nhiên có những trở ngại mà CBD phải vượt qua. Trở ngại cơ bản là cho đến nay chưa có một định nghĩa thống nhất cho “thành phần“ (component). Thành phần là gì? Cấu trúc ra sao? Được tạo ra và gắn kết, triển khai như thế nào? Những thành phần chuẩn hiện nay như JavaBean, EJB và COM có những điểm khác biệt nhau. Do đó cần làm rõ và thống nhất những thuật ngữ và định nghĩa.

MÔ HÌNH TRỪU TƯỢNG

Mô hình trừu tượng được dùng để mô tả các thành phần. Mô hình này đưa ra một vài định nghĩa chung và tổng quát gồm: cú pháp (syntax), ngữ nghĩa (semantics) và kết hợp (composition).

Cú pháp

Ngôn ngữ lập trình cấu tạo nên thành phần sẽ quyết định cấu trúc. Trong các thành phần hiện có, ngôn ngữ của thành phần là ngôn ngữ lập trình. Ví dụ: EJB tạo bằng ngôn ngữ lập trình Java và là một Java class.

Ngữ nghĩa

Thành phần là một đơn vị phần mềm gồm có tên (name), giao tiếp (interface) và mã (code). Code cài đặt các dịch vụ của thành phần và được giấu kín bên trong thành phần. Interface là phần giao tiếp ra ngoài, cung cấp những thông tin để sử dụng thành phần bao gồm những dịch vụ đầu vào thành phần cần để cung cấp dịch vụ đầu ra. Nếu có nhiều đầu vào và nhiều đầu ra, thành phần phải xác định quan hệ giữa các đầu vào và đầu ra. Mô hình trong bài viết này chỉ rõ quan hệ bằng nét đứt bên trong thành phần.

Thành phần là một đơn vị chức năng chưa hoàn chỉnh. Một hệ thống sẽ bao gồm nhiều thành phần nối ghép lại. Đầu vào của thành phần sẽ là đầu vào của hệ thống hoặc là đầu ra của một thành phần khác. Tương tự, đầu ra của thành phần cũng có thể là đầu ra của hệ thống hoặc là đầu vào của một thành phần khác (hình 2).

Hiện nay, thành phần có xu hướng chính là các đối tượng trong kiểu lập trình hướng đối tượng. Các dịch vụ đầu ra là các phương thức (method). Các dịch vụ đầu vào được quản lý và cung cấp bằng các bộ chứa (container) nơi chứa các đối tượng cũng như quản lý sự tiếp cận và tương tác đến chúng.

Ví dụ: JavaBean được quản lý bởi bộ chứa như BeanBox và nó kết nối các JavaBean thông qua sự kiện (event). Trong khi đó, EJB được quản lý bởi chương trình máy chủ J2EE và EJB được tiếp cận thông qua 2 interface là “home” và “remote” hoặc được gọi trực tiếp bởi máy chủ J2EE.

Kết hợp (composition)

Trong phát triển phần mềm trên thành phần, sự kết hợp các thành phần với nhau tạo thành hệ thống hoàn chỉnh là vấn đề cốt lõi (các thành phần có thể kết hợp với nhau để tạo thành thành phần phức hợp). Vấn đề nảy sinh là hiện nay chưa có một ngôn ngữ kết hợp đảm bảo tương thích về ngữ nghĩa và cú pháp cho các thành phần EJB, COM...

Sự kết hợp thành phần có thể xảy ra ở hai giai đoạn chính trong vòng đời của thành phần là thiết kế (design) và triển khai (deployment).

Ví dụ về sự kết hợp thành phần

MÔ HÌNH TRỪU TƯỢNG VÀ JAVABEAN, EJB, COM, KOALA

Ở đây chúng ta sẽ tập trung phân tích một số thành phần phổ biến hiện nay là: JavaBean, EJB, COM, Koala theo mô hình trừu tượng đã được giới thiệu ở phần trên.

Ví dụ sự kết hợp của hai JavaBean

JavaBean

JavaBean là một lớp của Java (gồm phương thức, thuộc tính và sự kiện). Thuộc tính của JavaBean chỉ có ảnh hưởng cục bộ trong các lớp JavaBean. Các sự kiện có thể là sự kiện nguồn (gọi phương thức của JavaBean khác) và sự kiện đích (được gọi bởi một JavaBean khác). Trong JavaBean, sự kiện và phương thức được xem là dịch vụ mà nó cung cấp. JavaBean có thể là một phần của hệ thống (đầu vào hoặc ra) hoặc chính là hệ thống.

JavaBean sau khi được thiết kế sẽ được lưu trữ vào kho chứa riêng (ví dụ: ToolBox của BDK – Bean Development Kit). Khi có nhu cầu thực thi hoặc kết hợp một JavaBean, bean đó phải được kéo trong một kho chứa (container) (ví dụ: BeanBox). Tuy nhiên, kho chứa không lưu trữ sự kết hợp của các JavaBean, sự kết hợp chỉ có thể được thực hiện trên các phiên bản của JavaBean trong khi triển khai.

Thành phần EJB với dịch vụ đầu vào và ra thông qua các interface

EJB (Enterprise JavaBean)

EJB được quản lý bởi máy chủ J2EE trên các khía cạnh: thi hành (execution), giao dịch (transaction), kết nối từ xa (remote connectivity)... EJB cần có tối thiểu một trong hai interface là home hoặc remote. Các interface bộc lộ những khả năng của EJB đó. Có ba loại EJB là entity, session và message-driven với những vai trò khác nhau. Nói chung, EJB sẽ được truy cập thông qua các interface khi cung cấp dịch vụ đầu ra hoặc yêu cầu dịch vụ đầu vào.

Nguyên tắc của EJB là khi thiết kế xong, EJB sẽ được lưu trữ trong kho chứa. Sau giai đoạn thiết kế, các EJB có thể tạo thành một thành phần phức hợp hay bản mẫu hệ thống hoàn chỉnh. Tuy nhiên, kho chứa không lưu trữ được thành phần phức hợp nên sự kết hợp không mang tính sử dụng lại (tạo ra các thành phần phức tạp hơn) và không có thuộc tính riêng. Trong giai đoạn triển khai, không có khả năng để điều chỉnh sự kết hợp và cũng không thể tạo ra cách kết hợp mới. Máy chủ J2EE chỉ là môi trường thực thi cho EJB.

Ví dụ một thành phần COM

COM (Component Object Model)

Là một chuẩn của Microsoft, thành phần COM là một đơn vị phần mềm đã biên dịch và chạy trên máy chủ COM. Thành phần COM phải được tạo ra bằng các ngôn ngữ lập trình có hỗ trợ gọi các phương thức bằng con trỏ như C, C++, Ada. Thành phần COM cài đặt (implement) mỗi interface cho từng dịch vụ nó cung cấp và chỉ có thể được sử dụng thông qua những interface này (những vòng tròn biểu thị interface).

Các thành phần COM không tương tác trực tiếp được và phải thông qua các interface. Trong giai đoạn thiết kế, COM được tạo ra trong môi trường phát triển rồi được lưu trữ vào kho chứa (repository). Sự kết hợp thực hiện thông qua các lệnh gọi phương thức của interface.

Tuy nhiên, giống như máy chủ J2EE, máy chủ COM cũng không lưu trữ được thành phần phức hợp như một thành phần riêng biệt. Hơn nữa, thành phần COM cũng không thể được kết hợp vào giai đoạn triển khai. Những đối tượng như DCOM, ActiveX, OLE hay COM+ đều xuất phát từ cơ sở COM nên có tính chất tương tự.

Ví dụ kết hợp các thành phần của Koala

KOALA (C[K]omponent Organizer and Linking Assistant)

Koala là một đơn vị thiết kế được định nghĩa thông qua IDL (Interface Definition Language) mô tả các interface của thành phần, CDL (Component Description Language) xác định thành phần và DDL (Data Desctription Language) xác định dữ liệu. Về cú pháp, thành phần trong Koala được định nghĩa như trong ngôn ngữ ADL. Về ngữ nghĩa, những thành phần trong Koala là những đơn vị tính toán và điều khiển bao gồm các dữ liệu liên kết với nhau trong một kiến trúc. Những định nghĩa được biên dịch bởi trình biên dịch Koala sang ngôn ngữ lập trình sẽ được dùng để cài đặt thành phần. Một thành phần Koala được biểu diễn dưới dạng hình chữ nhật có các tam giác và đỉnh tam giác chỉ hướng của dịch vụ (vào hay ra).

Nhìn chung, thành phần Koala cũng giống như hai thành phần EJB và COM. Các interface là những đầu vào và ra từng thành phần và cũng có thể là của hệ thống.

Trong Koala, thành phần là những tập tin chứa định nghĩa thể hiện những đơn vị thiết kế và được lưu trữ vào kho chứa (hệ thống tập tin). Quản lí lưu trữ là KoalaModel Workspace. Trong giai đoạn thiết kế, thành phần kết hợp thông qua các kết nối đặc biệt gồm 3 loại là binding (nối 2 interface cùng loại), glue-code (nối 2 interface khác loại) và switch (glue-code đặc biệt chuyển mạch kết nối binding).

Sự kết hợp tạo thành một thành phần phức hợp và được lưu trữ như một thành phần riêng biệt. Thành phần này lại có thể được lấy ra và kết hợp thêm tạo ra một thành phần phức hợp khác. Trong giai đoạn triển khai, thành phần được biên dịch sử dụng một ngôn ngữ lập trình nào đó và thực thi trong môi trường thích hợp. Tuy nhiên, thành phần không thể được kết hợp vào giai đoạn triển khai.

Có 3 thành phần kết nối với nhau, kết nối binding là đường thẳng, kết nối glue-code kí hiệu là m (module) và switch.

Qua những phân tích trên, các thành phần có thể được so sánh, phân loại theo 3 hướng: cú pháp, ngữ nghĩa và kết hợp.

Theo cú pháp

Cú pháp
Thành phần
Hướng đối tượng
JavaBean, EJB
Một ngôn ngữ lập trình kết hợp IDL
COM
Ngôn ngữ ADL
Koala

Theo ngữ nghĩa

Ngữ nghĩa
Thành phần
Lớp
JavaBean, EJB
Đối tượng
COM
Đơn vị thuộc cấu trúc
Koala

Theo sự kết hợp

Ví dụ về thành phần với các kiểu đầu vào – ra

Xét một vòng đời hoàn hảo của một thành phần, giai đoạn thiết kế sẽ có kho chứa và sự kết hợp có thể diễn ra trong cả giai đoạn triển khai và thiết kế. Mọi thành phần hiện có đều có điểm chung với mô hình này. Giai đoạn thiết kế là nơi thành phần được kiến tạo thông qua các công cụ xây dựng (builder) và được lưu trữ vào kho chứa (repository). Thành phần có thể được lấy ra trở lại, kết hợp thêm thành phần khác và lưu vào kho chứa. Giai đoạn triển khai là lúc các phiên bản của thành phần sinh ra, thông qua công cụ gắn kết (assembler) và trở thành một hệ thống hoàn chỉnh.

Các thành phần có thể được phân theo 3 nhóm. Nhóm 1 không cho phép 1 thành phần được tạo ra có thể lấy lại khi đã lưu vào kho chứa và kho chứa cũng không lưu được thành phần phức hợp; sự kết hợp diễn ra khi triển khai. Ở nhóm 2, thành phần được lưu trữ và lấy lại dễ dàng, sự kết hợp chỉ diễn ra khi thiết kế. Nhóm 3 tương tự nhóm 2 nhưng lại hỗ trợ tương tác với thành phần phức hợp.

Theo các phân loại kể trên, việc cố gắng giao thoa để tổng hợp gặp khó khăn vì các thành phần đều thiếu tính nhất quán đáng kể. Hơn nữa, trên quan điểm sự kết hợp giữa các thành phần là trung tâm của CBD thì cách phân loại theo sự kết hợp có ý nghĩa hơn cả. Sự phân loại theo chu trình phát triển cho khả năng tổng hợp tốt hơn.

Nhóm
Thành phần
Các tính chất của sự kết hợp
DR
RR CS DC CP
1
JavaBean không không không
2
EJB, COM không không không
3
Koala không
DR: trong giai đoạn thiết kế, thành phần có thể được lưu vào kho chứa.
RR: trong giai đoạn thiết kế, thành phần có thể được lấy ra từ kho chứa.
CS: sự kết hợp có thể diễn ra trong giai đoạn thiết kế.
DC: trong giai đoạn thiết kế, thành phần phức hợp có thể được lưu trữ vào kho chứa.
CP: trong giai đoạn triển khai, có thể diễn ra sự kết hợp các thành phần.

KẾT LUẬN

Khả năng phát triển của phần mềm dựa trên các thành phần phụ thuộc vào cấu trúc cơ bản của thành phần. Bài viết đã phân tích các thành phần phổ biến hiện nay theo mô hình thống nhất, đưa ra những nhược điểm cũng như ưu điểm của từng thành phần để thấy được sự cần thiết phải có thành phần hoàn hảo và đa năng hơn.

ThS. Trần Minh Cường,
Trưởng phòng Tư vấn CNTT,
Viện CNVT-KHCN Việt Nam.

(theo PC World VN)


 
 

 
     
 
Công nghệ khác:


Phương pháp bảo mật cơ sở dữ liệuTương lai là wiki, không phải blog!
Design Pattern - Thiết kế theo mô hình mẫuQuản lý cấu hình - Yêu cầu cơ bản trong mọi dự án phần mềm
Tăng lực cho trình duyệtNhững xu hướng phần mềm nổi bật của năm 2007
  Xem tiếp    
 
Lịch khai giảng của hệ thống
 
Ngày
Giờ
T.Tâm
TP Hồ Chí Minh
Hà Nội
 
   
New ADSE - Nhấn vào để xem chi tiết
Mừng Sinh Nhật Lần Thứ 20 FPT-APTECH
Nhấn vào để xem chi tiết
Bảng Vàng Thành Tích Sinh Viên FPT APTECH - Nhấn vào để xem chi tiết
Cập nhật công nghệ miễn phí cho tất cả cựu sinh viên APTECH toàn quốc
Tiết Thực Vì Cộng Đồng
Hội Thảo CNTT
Những khoảnh khắc không phai của Thầy Trò FPT-APTECH Ngày 20-11