Thuật ngữ liên kết ban đầu được sử dụng để mô tả các mô-đun của mã nguồn như một thước đo định tính về mức độ liên quan của mã nguồn của mô-đun với nhau. Ý tưởng về sự gắn kết được sử dụng trong nhiều lĩnh vực. Ví dụ, một nhóm người chẳng hạn như một đơn vị quân đội có thể gắn kết, có nghĩa là những người trong đơn vị làm việc cùng nhau để hướng tới một mục tiêu chung.
Bản chất của sự gắn kết mã nguồn là mã nguồn trong một mô-đun làm việc cùng nhau hướng tới một mục tiêu chung, được xác định rõ ràng. Số lượng mã nguồn tối thiểu cần thiết để tạo ra các đầu ra của mô-đun nằm trong mô-đun và không nhiều hơn. Giao diện được xác định rõ ràng và các đầu vào chảy qua giao diện và các đầu ra chảy ngược lại qua giao diện. Không có tác dụng phụ và điểm nhấn là sự tối giản.
Lợi ích của các mô-đun gắn kết về mặt chức năng là việc phát triển và tự động hóa các bài kiểm tra đơn vị rất đơn giản. Trên thực tế, một thước đo tốt về sự gắn kết của một mô-đun là việc tạo ra một bộ đầy đủ các bài kiểm tra đơn vị đầy đủ cho mô-đun dễ dàng như thế nào.
Một mô-đun có thể là một lớp trong ngôn ngữ hướng đối tượng hoặc một hàm trong ngôn ngữ chức năng hoặc ngôn ngữ không hướng đối tượng, chẳng hạn như C. Phần lớn công việc ban đầu trong lĩnh vực đo lường sự gắn kết này chủ yếu liên quan đến các chương trình COBOL tại IBM trở lại Những năm 1970 nên sự gắn kết chắc chắn không chỉ là một khái niệm hướng đối tượng.
Mục đích ban đầu của nghiên cứu mà từ đó khái niệm về sự gắn kết và khái niệm liên quan về sự kết hợp ra đời là nghiên cứu xem đặc điểm của các chương trình dễ hiểu, dễ duy trì và mở rộng ở đâu. Mục tiêu là có thể học các phương pháp lập trình tốt nhất, hệ thống hóa các phương pháp hay nhất đó và sau đó dạy các phương pháp này cho các lập trình viên khác.
Mục tiêu của các lập trình viên giỏi là viết mã nguồn có tính liên kết càng cao càng tốt với môi trường và vấn đề đang được giải quyết. Điều này ngụ ý rằng trong một ứng dụng lớn, một số phần của phần thân mã nguồn sẽ thay đổi so với các phần khác theo mức độ gắn kết của mã nguồn trong mô-đun hoặc lớp đó. Đôi khi điều tốt nhất bạn có thể nhận được là sự gắn kết theo thời gian hoặc tuần tự do vấn đề bạn đang cố gắng giải quyết.
Mức độ gắn kết tốt nhất là gắn kết chức năng. Một mô-đun có liên kết chức năng tương tự như một hàm toán học ở chỗ bạn cung cấp một tập hợp các đầu vào và bạn nhận được một đầu ra cụ thể. Một mô-đun thực sự có chức năng sẽ không có tác dụng phụ ngoài đầu ra cũng như không duy trì bất kỳ loại trạng thái nào. Thay vào đó, nó sẽ có một giao diện được xác định rõ ràng, đóng gói chức năng của mô-đun mà không để lộ bất kỳ phần nào bên trong của mô-đun và người sử dụng mô-đun sẽ cung cấp một tập hợp đầu vào cụ thể và đổi lại nhận được một đầu ra cụ thể. Một mô-đun thực sự có chức năng cũng phải an toàn.
Nhiều thư viện ngôn ngữ lập trình chứa một số ví dụ về các mô-đun chức năng cho dù là lớp, mẫu hay hàm. Các ví dụ liên kết hàm nhất sẽ là các hàm toán học như sin, cosin, căn bậc hai, v.v.
Các chức năng khác có thể có tác dụng phụ hoặc duy trì trạng thái nào đó dẫn đến việc sử dụng các chức năng đó phức tạp hơn.
Ví dụ: một hàm ném ra một ngoại lệ hoặc đặt một biến lỗi chung ( errno
trong C) hoặc phải được sử dụng trong một chuỗi ( strtok()
hàm là một ví dụ từ thư viện C chuẩn vì nó duy trì trạng thái bên trong) hoặc cung cấp một con trỏ mà sau đó phải được quản lý hoặc cấp nhật ký cho một số tiện ích nhật ký là tất cả các ví dụ về một chức năng không còn gắn kết chức năng.
Tôi đã đọc cả cuốn sách gốc của Yourdon và Constantine, Lập trình có cấu trúc, nơi tôi lần đầu tiên biết đến ý tưởng về sự gắn kết vào những năm 1980 và cuốn sách Hướng dẫn thực hành về thiết kế hệ thống có cấu trúc của Meilir Page-Jones, và Page-Jones đã làm tốt hơn nhiều trong việc mô tả cả sự liên kết và sự gắn kết. Cuốn Yourdon and Constantine có vẻ hàn lâm hơn một chút. Cuốn sách Code Complete của Steve McConnell khá hay và thực tế và bản sửa đổi có khá nhiều điều để nói về thực hành lập trình tốt.