Xu hướng lập trình: Giao tiếp trong kiến trúc Module

Kiến trúc mô-đun (module) cho phép chia nhỏ bài toán của phần mềm thành các phần hầu như không trùng lặp và do đó hỗ trợ làm việc song song trên các module và đặc biệt là dễ bảo trì hơn.

Kiến trúc module cũng là chìa khóa để đạt tới các khả năng tái sử dụng các thành phần của hệ thống và khả năng mở rộng tốt hơn.

Một số ngôn ngữ hỗ trợ lập trình theo cơ chế module cho phép biên dịch các module một cách độc lập và có thể gắn kết vào hệ thống lúc thực thi như Flex, Ruby... Một số ngôn ngữ khác thì hỗ trợ cơ chế như thư viện liên kết động (DLL) để biên dịch các module thành các thư viện độc lập và có thể gắn kết động vào hệ thống.

Ví dụ dễ thấy của kiến trúc module là các môi trường như Eclipse, Visual Studio. Chúng được tạo ra như những nền tảng cơ bản trong đó việc hỗ trợ các ngôn ngữ như Java, C#... được thiết kế dạng plugin có thể dễ dàng gắn vào nền tảng. Chúng ta cũng có thể thấy công cụ Visual Studio đi kèm bộ SQL Professional để hỗ trợ các project của SQL server dưới tên khác là SQL.

Kiến trúc module có thể mở rộng để áp dụng ở mức hệ thống và các module có thể là các ứng dụng hay dịch vụ chạy song song và tương tác với nhau thông qua một kiểu giao tiếp nào đó như Messaging, RPC, Socket...

Về mặt ý tưởng, kiến trúc module có thể xem là nền tảng cơ bản của rất nhiều kiến trúc tiên tiến khác như MVC, Multi-tier, SOA... Hơn nữa, kiến trúc module có thể tái áp dụng vào các module của chính nó hay các thành phần con của các kiến trúc trên như các dịch vụ bên trong các hệ thống SOA.


Interface – công cụ giao tiếp của các module

Các module được gắn kết với nhau trong chương trình thông qua các "interface". Một interface của module mô tả những thành phần được cung cấp và cần được cung cấp. Các thành phần này được các module khác "thấy" và sử dụng.

Lưu ý khái niệm interface ở đây khác biệt với khái niệm "interface" của các ngôn ngữ như Java, C#. Các interface của các module thường được thiết kế theo tiêu chí sao cho các quan hệ phụ thuộc giữa các module là nhỏ nhất.

Trong kiến trúc module, theo nguyên tắc Information-hiding, những phần có khả năng thay đổi bên trong của module được ẩn đi nên những phần còn lại dùng để giao tiếp giữa các module sẽ không bị ảnh hưởng khi thay đổi thiết kế. Kết quả là những module có thể thay đổi một cách độc lập mà không ảnh hưởng lẫn nhau.

Như vậy theo Parmas, interface của module nên được thiết kế chỉ bao gồm những phần hầu như không thay đổi, những thành phần này được gọi là thành phần "công khai". Còn những chi tiết ẩn bên trong bởi interface thường được gọi là các thành phần "bí mật" hoặc "riêng tư”.

Trong .Net framework, những thành phần bí mật được sử dụng nội bộ bên trong các lớp thư viện của framework được khai báo bằng từ khóa "Internal". Các thành phần "Internal" của .Net không thể truy cập trực tiếp từ bên ngoài assembly của chúng cho dù chúng ta biết rõ mô tả của chúng. Tuy nhiên, trong một số trường hợp chúng ta muốn sử dụng một số tính năng cấp thấp hoặc sửa lỗi của framework nên buộc phải truy cập vào các thành phần này, một kĩ thuật thường dùng là Reflection. Trong các mẫu lập trình (pattern), có một mẫu được tổ chức theo ý tưởng trên và được dùng rất phổ biến, đó là Facade pattern.

Facade pattern

Facade pattern thường được dùng trong lập trình hướng đối tượng. Một facade là một object đại diện cho các lớp thư viện bên trong, cung cấp một giao diện đơn giản ra bên ngoài. Facade có thể:

• Làm cho một thư viện phần mềm dễ hiểu và dễ sử dụng hơn vì facade cung cấp phương tiện đơn giản hơn để truy cập những tác vụ thông thường (thay vì thao tác qua nhiều lớp thư viện phức tạp).

• Giảm sự phụ thuộc giữa code bên ngoài và code thực thi bên trong thư viện, vì thế cho phép phát triển hệ thống một cách mềm dẻo hơn.

• Được dùng như một cách để gói gọn một tập hợp API có sẵn được tổ chức không tốt bằng một tập API đơn giản hơn nhiều để phục vụ cho một vài tác vụ nhất định.

Facade pattern thường kết hợp với Singleton pattern để tổ chức lớp facade theo dạng singleton. Ngoài ra, Facade pattern đặc biệt phù hợp trong mô hình 3 cấp (3-tier) qua cách định nghĩa các giao tiếp đơn giản để tương tác giữa các cấp, nhờ đó ẩn đi các xử lý phức tạp bên trong. Nó còn được áp dụng rất phổ biến trong .NET Framework theo mô hình thiết kế component-oriented.

Inversion of control

Inversion of Control, hay IoC, là một nguyên tắc thuộc lĩnh vực thiết kế kiến trúc phần mềm trong đó mô tả luồng điều khiển của hệ thống bị đảo ngược so với kiến trúc cổ điển.

Theo mô hình lập trình cổ điển, lập trình viên viết các xử lý và thủ tục gọi đến các thủ tục trong thư viện có sẵn, các thủ tục này có thể gọi đến một thủ tục khác ở một thư viện khác nhưng nó không bao giờ gọi trở lại những xử lý do người lập trình đó viết (chúng ta tạm gọi là thủ tục của người dùng – user procedure). Nhưng đối với IoC, điều này lại xảy ra. Kết quả này có thể đạt được bằng cách thư viện hay một framework định nghĩa cơ chế chung cho một loại vấn đề, còn xử lý cụ thể sẽ do thủ tục của người dùng giải quyết.

Event-driven architecture

Event-driven architecture (EDA) là mẫu kiến trúc phần mềm (architecture software pattern) trong đó, về cơ bản, hệ thống được xây dựng xung quanh các thao tác như tạo, khám phá, tiêu thụ và đáp trả lại các sự kiện.

Một event trong EDA được hiểu là một "thay đổi trạng thái đáng chú ý” của một thành phần nào đó. Event có thể được phát sinh do người dùng, do các thiết bị phần cứng hoặc do chính phần mềm phát sinh trong một điều kiện nào đó. EDA được xem như một trong những kĩ thuật thiết kế hiệu quả nhất trong việc hạn chế đến mức nhỏ nhất quan hệ phụ thuộc giữa các thành phần hệ thống hay các module.

Hi vọng bài viết cung cấp cho các bạn những thông tin hữu ích về kiến trúc module.

Nghề lập trình viên luôn nằm trong tốp các ngành nghề tạo được độ nóng trên thị trường nguồn nhân lực chất lượng cao vì thế áp lực dành cho những người làm nghề càng lớn, để là nhân lực tốt của ngành bạn luôn phải trau dồi kiến thức vì công nghệ luôn thay đổi và cập nhật, hãy đừng để mình tụt hậu.

Bạn chỉ cần Click là sẽ có được đầy đủ các thông tin cần để sẵn sàng cho một khởi đầu với nghề lập trình viên.

Sưu tầm và Tổng hợp

Nhật Lệ (Stanford - Nâng tầm tri thức)

Tags: