Ở bài trước, chúng ta đã biết các software component giao tiếp với nhau thông qua Port và Port Interface: dữ liệu đi từ provider port sang receiver port. Nhưng câu hỏi còn lại là: trong một hệ thống thật, ai được nối với ai?

Một ECU có thể có hàng nghìn port, và việc quyết định port nào kết nối với port nào không nằm ở chính port, mà nằm ở Connector. Bài này giới thiệu Composition (nơi chứa các component) và các loại Connector, cùng quy tắc để biết khi nào dùng loại nào.

I. Composition là gì?

Composition là một loại software component dùng để gom nhóm các software component hoặc các composition khác.

Nói đơn giản, hãy hình dung Composition như một chiếc hộp (container) chứa một nhóm software component. Điểm cần nhớ:

  • Composition có thể chứa cả component lẫn composition khác, tức là có thể lồng nhau nhiều tầng.
  • Bản thân Composition cũng là một software component, nên nó cũng có thể có port riêng.

II. Connector là gì?

Port chỉ là điểm kết nối. Connector mới là thứ nối hai port lại với nhau. Cấu hình connector quyết định dữ liệu của provider port đi đến receiver port nào.

AUTOSAR có ba loại connector:

  • Assembly Connector
  • Delegation Connector
  • Pass-through Connector

Để dễ hiểu, chúng ta sẽ đi qua một ví dụ cụ thể.

III. Assembly Connector

Giả sử có hai software component, SWC 1 và SWC 2. Giữa chúng có hai kiểu giao tiếp: Sender-Receiver và Client-Server, nên mỗi bên có hai port: SWC 1 có hai provider port, SWC 2 có hai receiver port. Ta đặt cả hai component vào một composition tên là Composition 1.

Để nối các port này, ta dùng Assembly Connector:

Hai SWC trong cùng một composition, nối bằng assembly connector

Assembly Connector nối một provider port và một receiver port nằm trong cùng một composition. Trong cấu hình, ta sẽ thấy composition software component Composition 1 được tạo ra và bao bọc hai component SWC 1, SWC 2.

💡 Quy tắc của Assembly Connector: hai port cần nối phải có cùng composition cha (parent composition).

IV. Khi Assembly Connector không đủ: Delegation Connector

Giờ thêm một component nữa là SWC 3, đặt trong một composition mới tên Composition 2. Composition 2 còn bao luôn cả Composition 1. Như đã nói, một composition chứa được cả component lẫn composition khác.

Bài toán: SWC 3 cần nối hai port của nó với SWC 1 và SWC 2. Ta không thể dùng Assembly Connector trực tiếp, vì:

  • Composition cha của SWC 1 và SWC 2 là Composition 1.
  • Composition cha của SWC 3 là Composition 2.

Hai bên khác composition cha, vi phạm quy tắc ở trên.

Cách giải quyết là kéo các port của component ra ngoài composition bằng Delegation Connector:

  1. Port của SWC 1 và SWC 2 được nối bằng delegation connector ra ranh giới của Composition 1.
  2. Một port “phản chiếu” (mirror port) mới được tạo trên Composition 1. Delegation connector nối port ngoài này với port bên trong của component.
  3. Lúc này các port đối diện của SWC 3 và port mới của Composition 1 đã nằm cùng một composition cha (Composition 2).
  4. Ta dùng Assembly Connector giữa Composition 1 và SWC 3 để hoàn tất kết nối.

Delegation connector đưa port ra ngoài, rồi assembly connector hoàn tất kết nối

Tóm lại: Delegation Connector kéo port bên trong ra composition bên ngoài, còn Assembly Connector làm nốt bước kết nối thực sự.

V. Pass-through Connector

Loại thứ ba là Pass-through Connector. Nó dùng khi một composition chỉ đóng vai trò “đi qua”: một R-Port của composition được nối thẳng tới một P-Port của chính composition đó, dữ liệu đi vào rồi đi ra mà không qua component nào bên trong.

Pass-through connector nối R-Port với P-Port của cùng một composition

VI. So sánh Assembly và Delegation

Assembly Connector Delegation Connector
Nối cái gì Một provider port với một receiver port Hai port cùng loại: provider với provider, hoặc receiver với receiver
Phạm vi Hai port có cùng composition cha Port bên trong với port “phản chiếu” ở composition bên ngoài
Vai trò Hoàn tất kết nối dữ liệu Đưa port ra khỏi composition để có thể nối tiếp

VII. Tổng kết

  • Composition là container chứa component hoặc composition khác.
  • Connector quyết định port nào nối với port nào.
  • Assembly Connector nối provider với receiver trong cùng composition cha.
  • Delegation Connector đưa port từ trong ra ngoài composition khi hai port không cùng composition cha.
  • Mỗi chuỗi kết nối port cuối cùng phải kết thúc bằng một Assembly Connector.

Hy vọng bài này giúp bạn phân biệt được khi nào dùng Assembly và khi nào dùng Delegation.