• Thứ Sáu, 11/11/2005 11:25 (GMT+7)

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

    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.

    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).

    Ư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).

    Hình 1: Mô hình trừu tượng của thành phần

    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.

     

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

    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) (xem hình 3).

                                                                          Hình 3: 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.

    JavaBean

     

                  Hình 4: Ví dụ sự kết hợp của hai 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 (hình 4).

    EJB (Enterprise JavaBean)

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

     

    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 (hình 5).

    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.

    COM (Component Object Model)

     

    Hình 6: Ví dụ một thành phần COM

    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) (hình 6).

    Hình 7: Ví dụ về sự kết hợp hai thành phần COM

     

    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. (hình 7)


    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ự.

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

     

    Hình 8: Ví dụ thành phần Koala

    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). Hình 8

    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.

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

     

    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. (hình 9).

    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 (xem hình 10)

     

    Hình 10

    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. (xem bảng)

    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.

     

    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

       

    JavaBeans

       

    ü

       

    û

       

    û

       

    û

       

    ü

     
     

    2

       

    EJB, COM

       

    ü

       

    û

       

    ü

       

    û

       

    û

     
     

    3

       

    Koala

       

    ü

       

    ü

       

    ü

       

    ü

       

    û

     
     

    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.

     

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

    ID: A0510_116