"Thấp trong khớp nối và gắn kết cao" nghĩa là gì


151

Tôi có vấn đề hiểu được tuyên bố low in coupling and high in cohesion. Tôi đã googled và đọc rất nhiều về điều này, nhưng vẫn thấy khó hiểu.

Theo những gì tôi hiểu là High cohesioncó nghĩa là chúng ta nên có các lớp chuyên biệt để thực hiện một chức năng cụ thể. Hy vọng điều này là chính xác? Giống như một lớp xác nhận thẻ tín dụng, chỉ chuyên dùng để xác thực thẻ tín dụng.

Và vẫn không hiểu khớp nối thấp có nghĩa là gì?


4
Để được giải thích chi tiết hơn, bạn có thể thích câu trả lời từ bài đăng này Sự gắn kết & Khớp nối
Infinity

Câu trả lời này chắc chắn là tốt hơn và súc tích sau đó những người đưa ra ở đây.
Lokesh

Trong thực tế, đây là một bản sao của những người. Trả lời bởi Infinity là không trùng lặp duy nhất không được đề cập cho đến nay ở đây.
cellepo

Câu trả lời:


232

Những gì tôi tin là đây:

Sự gắn kết liên quan đến mức độ mà các yếu tố của một mô-đun / lớp thuộc về nhau, có ý kiến ​​cho rằng các mã liên quan phải gần nhau, vì vậy chúng ta nên cố gắng gắn kết cao và liên kết tất cả các mã liên quan với nhau càng gần càng tốt. Nó phải làm với các thành phần trong mô-đun / lớp.

Khớp nối liên quan đến mức độ mà các mô-đun / lớp khác nhau phụ thuộc vào nhau, có ý kiến ​​cho rằng tất cả các mô-đun nên độc lập hết mức có thể, đó là lý do tại sao khớp nối thấp. Nó phải làm với các thành phần giữa các mô-đun / lớp khác nhau.

Để hình dung toàn bộ bức tranh sẽ hữu ích:

nhập mô tả hình ảnh ở đây

Ảnh chụp màn hình được chụp từ Coursera .


20
Giáo sư của chúng tôi nói "Sự gắn kết cao là về việc đảm bảo mô-đun không làm được nhiều việc, nó chỉ có nghĩa là làm một việc cụ thể".
Lokesh

2
Từ những gì tôi tin nó giống như "đảm bảo một mô-đun làm một việc, không nhiều mô-đun làm điều tương tự", bằng cách này, bạn có thể đảm bảo rằng chỉ một mô-đun duy nhất chỉ định hành vi, vì vậy hành vi tổng thể cho một sự việc được gắn kết.
sschrass

5
@Lokesh Tôi nghĩ bình luận của bạn làm vấy bẩn mọi thứ. Giáo sư của bạn đang nhầm lẫn sự gắn kết cao với "Nguyên tắc trách nhiệm duy nhất". Sự gắn kết cao có nghĩa là giữ những thứ tương tự và liên quan với nhau. Bạn có thể có sự gắn kết cao trong một đối tượng hoặc một dịch vụ được tạo thành từ nhiều chức năng.
Max Hodges

17
Sơ đồ đó có nghĩa là không có gì.
Liam

1
Về mặt kiến ​​trúc dịch vụ vi mô, sự gắn kết cao có nghĩa là những thứ liên quan mạnh mẽ nên được giữ cùng nhau trong một dịch vụ vi mô và khớp nối lỏng lẻo có nghĩa là bản thân một dịch vụ vi mô phải được xử lý tốt để làm việc trong bối cảnh bị ràng buộc, tức là làm một việc độc lập.
sactiw

41

Sự gắn kết trong công nghệ phần mềm, như trong cuộc sống thực, là bao nhiêu phần tử bao gồm toàn bộ (trong trường hợp của chúng ta, giả sử một lớp) có thể nói rằng chúng thực sự thuộc về nhau. Do đó, đây là thước đo mức độ liên quan mạnh mẽ của từng phần chức năng được biểu thị bằng mã nguồn của mô-đun phần mềm.

Một cách để xem xét sự gắn kết trong điều khoản của OO là nếu các phương thức trong lớp đang sử dụng bất kỳ thuộc tính riêng tư nào.

Bây giờ cuộc thảo luận lớn hơn thế này nhưng Độ kết dính cao (hoặc loại tốt nhất của sự gắn kết - sự gắn kết chức năng) là khi các phần của mô-đun được nhóm lại vì tất cả đều góp phần vào một nhiệm vụ được xác định rõ của mô-đun.

Ghép nối trong các từ đơn giản, là bao nhiêu một thành phần (một lần nữa, hãy tưởng tượng một lớp, mặc dù không nhất thiết) biết về hoạt động bên trong hoặc các yếu tố bên trong của một thành phần khác, tức là nó có bao nhiêu kiến ​​thức về thành phần kia.

Khớp nối lỏng lẻo là một phương thức kết nối các thành phần trong một hệ thống hoặc mạng để các thành phần đó, phụ thuộc vào nhau ở mức độ ít nhất có thể thực tế

Tôi đã viết một bài blog về điều này. Nó thảo luận về tất cả những điều này rất chi tiết, với các ví dụ, vv Nó cũng giải thích những lợi ích của lý do tại sao bạn nên tuân theo các nguyên tắc này.


26

Trong thiết kế phần mềm sự gắn kết cao có nghĩa là lớp nên làm một việc và một việc rất tốt. Sự gắn kết cao có liên quan chặt chẽ với nguyên tắc trách nhiệm duy nhất .

Khớp nối thấp cho thấy rằng lớp nên có sự phụ thuộc ít nhất có thể. Ngoài ra, các phụ thuộc phải tồn tại phải là các phụ thuộc yếu - thích phụ thuộc vào giao diện hơn là phụ thuộc vào lớp cụ thể hoặc thích thành phần hơn kế thừa.

Độ kết dính cao và khớp nối thấp cho chúng ta mã được thiết kế tốt hơn, dễ bảo trì hơn.


Bạn đã bỏ lỡ tiêm phụ thuộc. Nó liên quan chặt chẽ đến khớp nối thấp để đảm bảo một lớp có ít nhất / không phụ thuộc.
BugHunterUK

16

Câu trả lời ngắn gọn và rõ ràng

  • Độ gắn kết cao : Các thành phần trong một lớp / mô đun có chức năng thuộc về nhau và thực hiện một điều cụ thể.
  • Khớp nối lỏng lẻo : Trong số các lớp / mô-đun khác nhau nên phụ thuộc tối thiểu.

9

Khớp nối thấp nằm trong bối cảnh của hai hoặc nhiều mô-đun. Nếu một thay đổi trong một mô-đun dẫn đến nhiều thay đổi trong mô-đun khác thì chúng được cho là có tính kết hợp cao. Đây là nơi lập trình dựa trên giao diện giúp. Mọi thay đổi trong mô-đun sẽ không ảnh hưởng đến mô-đun khác vì giao diện (giá trị trung bình của tương tác) giữa chúng không thay đổi.

Độ gắn kết cao - Đặt những thứ tương tự lại với nhau. Vì vậy, một lớp nên có phương pháp hoặc hành vi để làm công việc liên quan. Chỉ cần đưa ra một ví dụ xấu phóng đại: Việc triển khai giao diện Danh sách không nên có hoạt động liên quan đến Chuỗi. Lớp String nên có các phương thức, các trường có liên quan đến String và tương tự, việc triển khai List sẽ có những thứ tương ứng.

Mong rằng sẽ giúp.


5

Câu chuyện dài, khớp nối thấp như tôi hiểu nó có nghĩa là các thành phần có thể được hoán đổi mà không ảnh hưởng đến hoạt động đúng đắn của một hệ thống. Về cơ bản điều chỉnh hệ thống của bạn thành các thành phần hoạt động có thể được cập nhật riêng lẻ mà không phá vỡ hệ thống


1
Điều đó không giống với sự gắn kết cao sao?
dùng1315906

4

Bạn có điện thoại thông minh không? Có một ứng dụng lớn hay nhiều ứng dụng nhỏ? Có một ứng dụng trả lời khác? Bạn có thể sử dụng một ứng dụng trong khi cài đặt, cập nhật và / hoặc gỡ cài đặt ứng dụng khác không? Rằng mỗi ứng dụng được khép kín là sự gắn kết cao. Rằng mỗi ứng dụng độc lập với các ứng dụng khác là khớp nối thấp. DevOps ủng hộ kiến ​​trúc này bởi vì nó có nghĩa là bạn có thể thực hiện triển khai liên tục rời rạc mà không làm gián đoạn toàn bộ hệ thống.


> Có một ứng dụng trả lời trên một ứng dụng khác? . . Vâng, một số làm. Nhiều ứng dụng sử dụng ứng dụng Camera, bằng cách ứng dụng tập luyện cung cấp dữ liệu về tim và tập luyện cho Sức khỏe và Hoạt động. Tôi có thể chia sẻ một đoạn từ một ứng dụng cho nhiều người khác. Ứng dụng báo thức của tôi biết thời gian và phát một bản nhạc từ ứng dụng Âm nhạc ...
Max Hodges

@MaxHodges điều đó (độ gắn kết thấp và khớp nối cao) bị khấu hao và nên được giảm thiểu đến mức tối thiểu có thể. Trong một số trường hợp, như bạn đã đề cập. Điều này không thể được loại bỏ hoàn toàn.
M. Habib

2

Kế thừa hoặc khái quát hóa là một ví dụ về khớp nối cao (nghĩa là phụ thuộc lẫn nhau cao). Điều tôi muốn nói là điều này là trong kế thừa thường lớp cha định nghĩa các hàm cơ sở được sử dụng bởi lớp con của nó và thay đổi trong các phương thức của lớp cha mẹ tác động trực tiếp đến các lớp con của nó. Do đó chúng ta có thể nói rằng có một mức độ phụ thuộc lẫn nhau lớn hơn giữa các lớp.

Giao diện thực hiện hoặc sử dụng là một ví dụ về sự gắn kết cao (nghĩa là sự phụ thuộc thấp). Điều này có nghĩa là một giao diện đưa ra một hợp đồng cho bất kỳ lớp nào thực hiện nó nhưng mỗi lớp có quyền thực hiện các phương thức được khai báo trong giao diện theo cách riêng của nó và các thay đổi trong phương thức được khai báo trong một lớp không ảnh hưởng đến bất kỳ lớp nào khác.


2

Sự gắn kết - mọi thứ liên quan chặt chẽ với nhau như thế nào.
Khớp nối - làm thế nào mọi thứ được kết nối với nhau.

Hãy lấy một ví dụ - Chúng tôi muốn thiết kế một chiếc xe tự lái.

(1) Chúng ta cần động cơ để chạy đúng.

(2) Chúng tôi cần chiếc xe tự lái.

Tất cả các lớp và chức năng trong (1) khởi động động cơ và làm cho nó chạy tốt cùng nhau, nhưng không giúp chiếc xe điều khiển. Vì vậy, chúng tôi đặt các lớp phía sau Bộ điều khiển động cơ.

Tất cả các lớp và chức năng trong (2) hoạt động tuyệt vời để làm cho chiếc xe lái, tăng tốc và phanh. Họ không giúp xe khởi động hoặc gửi xăng tới pít-tông. Vì vậy, chúng tôi đặt các lớp này đằng sau Trình điều khiển lái xe riêng của nó.

Các bộ điều khiển này được sử dụng để giao tiếp với tất cả các lớp và chức năng có sẵn. Các bộ điều khiển sau đó chỉ giao tiếp với nhau. Điều này có nghĩa là tôi không thể gọi một chức năng trong lớp pít-tông từ lớp chân ga để làm cho chiếc xe đi nhanh hơn.

Lớp bàn đạp phải yêu cầu Bộ điều khiển lái xe nói chuyện với Bộ điều khiển động cơ, sau đó báo cho lớp piston đi nhanh hơn. Điều này cho phép chúng tôi lập trình viên có thể tìm thấy các vấn đề và cho phép chúng tôi kết hợp các chương trình lớn mà không phải lo lắng. Điều này là do tất cả các mã làm việc đằng sau bộ điều khiển.


1

Khớp nối thấp và độ kết dính cao là một hiện tượng được khuyến nghị.

Khớp nối có nghĩa là mức độ khác nhau của các mô-đun phụ thuộc lẫn nhau và cách các mô-đun khác bị ảnh hưởng đến việc thay đổi một số / chức năng đáng kể của mô-đun. Khớp nối thấp được nhấn mạnh vì sự phụ thuộc phải được duy trì ở mức thấp để các thay đổi rất ít / không đáng kể được thực hiện cho các mô-đun khác.


1

Một ví dụ có thể hữu ích. Hãy tưởng tượng một hệ thống tạo dữ liệu và đưa nó vào một kho lưu trữ dữ liệu, một tệp trên đĩa hoặc cơ sở dữ liệu.

Độ kết dính cao có thể đạt được bằng cách tách mã lưu trữ dữ liệu khỏi mã sản xuất dữ liệu. (và trên thực tế tách bộ lưu trữ đĩa khỏi bộ lưu trữ cơ sở dữ liệu).

Kết nối thấp có thể đạt được bằng cách đảm bảo rằng việc sản xuất dữ liệu không có bất kỳ kiến ​​thức không cần thiết nào về lưu trữ dữ liệu (ví dụ: không hỏi kho lưu trữ dữ liệu về tên tệp hoặc kết nối db).


1

Đây là một câu trả lời từ một góc độ lý thuyết trừu tượng, đồ thị:

Chúng ta hãy đơn giản hóa vấn đề bằng cách chỉ nhìn vào biểu đồ phụ thuộc (được định hướng) giữa các đối tượng trạng thái.

Một câu trả lời cực kỳ đơn giản có thể được minh họa bằng cách xem xét hai trường hợp giới hạn của biểu đồ phụ thuộc:

Trường hợp giới hạn thứ 1 : một đồ thị cụm .

Biểu đồ cụm là sự hiện thực hóa hoàn hảo nhất của biểu đồ phụ thuộc độ liên kết cao và khớp nối thấp (được cung cấp một tập hợp các kích thước cụm).

Sự phụ thuộc giữa các cụm là tối đa (kết nối đầy đủ) và sự phụ thuộc giữa các cụm là tối thiểu (không).

Đây là một minh họa trừu tượng của câu trả lời trong một trong những trường hợp giới hạn .

Trường hợp giới hạn thứ 2 là một biểu đồ được kết nối đầy đủ, trong đó mọi thứ phụ thuộc vào mọi thứ.

Thực tế là một nơi nào đó ở giữa, càng gần với biểu đồ cụm thì càng tốt, theo sự hiểu biết khiêm tốn của tôi.

Từ một góc độ khác : khi nhìn vào biểu đồ phụ thuộc có hướng, lý tưởng nhất là theo chu kỳ, nếu không thì chu kỳ tạo thành các cụm / thành phần nhỏ nhất.

Một bước lên / xuống hệ thống phân cấp tương ứng với "một trường hợp" của khớp nối lỏng lẻo, sự gắn kết chặt chẽ trong một phần mềm nhưng có thể xem nguyên tắc liên kết chặt chẽ / liên kết chặt chẽ này như một hiện tượng lặp lại ở các độ sâu khác nhau của đồ thị có hướng xoay vòng (hoặc trên một trong những cây bao trùm của nó).

Sự phân rã như vậy của một hệ thống thành một hệ thống phân cấp giúp đánh bại sự phức tạp theo cấp số nhân (giả sử mỗi cụm có 10 phần tử). Sau đó, ở 6 lớp, nó đã có 1 triệu đối tượng:

10 cụm tạo thành 1 siêu lớp, 10 siêu lớp tạo thành 1 siêu liên kết và cứ thế ... không có khái niệm về sự gắn kết chặt chẽ, khớp nối lỏng lẻo, một kiến ​​trúc phân cấp như vậy sẽ không thể thực hiện được.

Vì vậy, đây có thể là tầm quan trọng thực sự của câu chuyện và không chỉ là sự gắn kết thấp gắn kết cao trong hai lớp mà thôi. Tầm quan trọng thực sự trở nên rõ ràng khi xem xét trừu tượng cấp cao hơn và tương tác của chúng.


0

Tôi nghĩ bạn có màu đỏ rất nhiều định nghĩa nhưng trong trường hợp bạn vẫn còn nghi ngờ hoặc Trong trường hợp bạn chưa quen với lập trình và muốn đi sâu vào vấn đề này thì tôi sẽ đề nghị bạn xem video này, https://youtu.be/HpJTGW9AwX0 Đây chỉ là tài liệu tham khảo để có thêm thông tin về đa hình ... Hy vọng bạn sẽ hiểu rõ hơn về điều này


0

Khớp nối thấp: - Sẽ giữ cho nó rất đơn giản. Nếu bạn thay đổi mô-đun của mình, nó ảnh hưởng đến các mô-đun khác như thế nào.

Ví dụ: - Nếu API dịch vụ của bạn được hiển thị dưới dạng JAR, mọi thay đổi đối với chữ ký phương thức sẽ phá vỡ API gọi (khớp nối Cao / Chặt).

Nếu mô-đun của bạn và mô-đun khác giao tiếp qua tin nhắn không đồng bộ. Miễn là bạn nhận được tin nhắn, chữ ký thay đổi phương thức của bạn sẽ nằm cục bộ trong mô-đun của bạn (Khớp nối thấp).

Tất nhiên nếu có thay đổi trong định dạng tin nhắn, khách hàng gọi sẽ cần thực hiện một số thay đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.