Sự khác biệt giữa sự gắn kết và khớp nối là gì?
Làm thế nào có thể ghép và gắn kết dẫn đến thiết kế phần mềm tốt hay kém?
Một số ví dụ phác thảo sự khác biệt giữa hai và tác động của chúng đến chất lượng mã tổng thể là gì?
Sự khác biệt giữa sự gắn kết và khớp nối là gì?
Làm thế nào có thể ghép và gắn kết dẫn đến thiết kế phần mềm tốt hay kém?
Một số ví dụ phác thảo sự khác biệt giữa hai và tác động của chúng đến chất lượng mã tổng thể là gì?
Câu trả lời:
Sự gắn kết đề cập đến những gì lớp (hoặc mô-đun) có thể làm. Sự gắn kết thấp sẽ có nghĩa là lớp học thực hiện rất nhiều hành động - nó rộng lớn, không tập trung vào những gì nó nên làm. Sự gắn kết cao có nghĩa là lớp tập trung vào những gì nó nên làm, tức là chỉ các phương thức liên quan đến ý định của lớp.
Ví dụ về độ kết dính thấp:
-------------------
| Staff |
-------------------
| checkEmail() |
| sendEmail() |
| emailValidate() |
| PrintLetter() |
-------------------
Ví dụ về độ kết dính cao:
----------------------------
| Staff |
----------------------------
| -salary |
| -emailAddr |
----------------------------
| setSalary(newSalary) |
| getSalary() |
| setEmailAddr(newEmail) |
| getEmailAddr() |
----------------------------
Đối với khớp nối , nó đề cập đến mức độ liên quan hoặc phụ thuộc của hai lớp / mô-đun đối với nhau. Đối với các lớp kết hợp thấp, việc thay đổi thứ gì đó chính trong một lớp sẽ không ảnh hưởng đến lớp khác. Khớp nối cao sẽ gây khó khăn cho việc thay đổi và duy trì mã của bạn; vì các lớp được liên kết chặt chẽ với nhau, nên việc thay đổi có thể yêu cầu cải tạo toàn bộ hệ thống.
Thiết kế phần mềm tốt có độ gắn kết cao và khớp nối thấp .
set
& get
minh họa chức năng cụ thể hơn cho bối cảnh "Nhân viên" - độ đặc hiệu cao hơn cho ví dụ đó về độ gắn kết cao hơn.
Sự gắn kết là dấu hiệu của mối quan hệ trong một mô-đun.
Khớp nối là dấu hiệu của mối quan hệ giữa các mô-đun.
Sự gắn kết
Khớp nối
kiểm tra liên kết này
Sự gắn kết cao trong các mô-đun và khớp nối thấp giữa các mô-đun thường được coi là có liên quan đến chất lượng cao trong các ngôn ngữ lập trình OO.
Ví dụ, mã bên trong mỗi lớp Java phải có sự gắn kết bên trong cao, nhưng phải được ghép một cách lỏng lẻo nhất có thể với mã trong các lớp Java khác.
Chương 3 của Xây dựng phần mềm hướng đối tượng của Meyer (ấn bản 2) là một mô tả tuyệt vời về những vấn đề này.
Sự gắn kết là một chỉ dẫn về mức độ liên quan và tập trung vào trách nhiệm của một yếu tố phần mềm.
Khớp nối đề cập đến mức độ mạnh mẽ của một yếu tố phần mềm được kết nối với các yếu tố khác.
Phần tử phần mềm có thể là lớp, gói, thành phần, hệ thống con hoặc hệ thống. Và trong khi thiết kế các hệ thống, nên có các yếu tố phần mềm có độ gắn kết cao và hỗ trợ khớp nối Thấp .
Sự gắn kết thấp dẫn đến các lớp nguyên khối khó duy trì, hiểu và làm giảm khả năng sử dụng lại. Tương tự Kết quả khớp nối cao trong các lớp được liên kết chặt chẽ và các thay đổi có xu hướng không cục bộ, khó thay đổi và giảm việc sử dụng lại.
Chúng ta có thể lấy một kịch bản giả thuyết trong đó chúng ta đang thiết kế một màn hình điển hình có thể ConnectionPool
với các yêu cầu sau. Lưu ý rằng, nó có thể trông quá nhiều đối với một lớp đơn giản như thế ConnectionPool
nhưng mục đích cơ bản chỉ là thể hiện tính liên kết thấp và độ gắn kết cao với một số ví dụ đơn giản và tôi nghĩ sẽ giúp ích.
Với sự gắn kết thấp, chúng tôi có thể thiết kế một ConnectionPool
lớp bằng cách nhồi mạnh tất cả các chức năng / trách nhiệm này vào một lớp như dưới đây. Chúng ta có thể thấy rằng lớp đơn này chịu trách nhiệm quản lý kết nối, tương tác với cơ sở dữ liệu cũng như duy trì số liệu thống kê kết nối.
Với sự gắn kết cao, chúng tôi có thể phân công các trách nhiệm này trên các lớp và làm cho nó dễ bảo trì và tái sử dụng hơn.
Để chứng minh khớp nối Thấp, chúng tôi sẽ tiếp tục với ConnectionPool
sơ đồ gắn kết cao ở trên. Nếu chúng ta nhìn vào sơ đồ trên mặc dù nó hỗ trợ sự gắn kết cao, thì ConnectionPool
nó được kết hợp chặt chẽ với ConnectionStatistics
lớp và PersistentStore
nó tương tác trực tiếp với chúng. Thay vào đó để giảm sự ghép nối, chúng tôi có thể giới thiệu một ConnectionListener
giao diện và để hai lớp này thực hiện giao diện và để chúng đăng ký với ConnectionPool
lớp. Và ý ConnectionPool
chí sẽ lặp lại thông qua những người nghe này và thông báo cho họ về các sự kiện kết nối và phát hành và cho phép ít kết nối hơn.
Lưu ý / Lời hoặc Chú ý: Đối với kịch bản đơn giản này, nó có thể trông giống như quá mức nhưng nếu chúng ta tưởng tượng ra một kịch bản thời gian thực, nơi ứng dụng của chúng ta cần tương tác với nhiều dịch vụ của bên thứ ba để hoàn tất giao dịch: Ghép trực tiếp mã của chúng tôi với các dịch vụ của bên thứ ba sẽ có nghĩa là bất kỳ thay đổi nào trong dịch vụ của bên thứ ba có thể dẫn đến thay đổi mã của chúng tôi ở nhiều nơi, thay vào đó chúng tôi có thể Facade
tương tác với nhiều dịch vụ này trong nội bộ và mọi thay đổi đối với dịch vụ trở thành cục bộ đối với Facade
và thực thi khớp nối thấp với bên thứ ba dịch vụ.
Tăng sự gắn kết và giảm khớp nối dẫn đến thiết kế phần mềm tốt.
Sự gắn kết phân vùng chức năng của bạn sao cho ngắn gọn và gần nhất với dữ liệu liên quan đến nó, trong khi tách riêng đảm bảo rằng việc thực hiện chức năng được tách biệt với phần còn lại của hệ thống.
Decoupling cho phép bạn thay đổi việc thực hiện mà không ảnh hưởng đến các phần khác của phần mềm.
Sự gắn kết đảm bảo rằng việc thực hiện cụ thể hơn đối với chức năng và đồng thời dễ bảo trì hơn.
Phương pháp hiệu quả nhất để giảm khớp nối và tăng sự gắn kết là thiết kế theo giao diện .
Đó là các đối tượng chức năng chính chỉ nên 'biết' nhau thông qua (các) giao diện mà chúng thực hiện. Việc thực hiện một giao diện giới thiệu sự gắn kết là kết quả tự nhiên.
Mặc dù không thực tế trong một số kịch bản, nó nên là một mục tiêu thiết kế để thực hiện.
Ví dụ (rất sơ sài):
public interface IStackoverFlowQuestion
void SetAnswered(IUserProfile user);
void VoteUp(IUserProfile user);
void VoteDown(IUserProfile user);
}
public class NormalQuestion implements IStackoverflowQuestion {
protected Integer vote_ = new Integer(0);
protected IUserProfile user_ = null;
protected IUserProfile answered_ = null;
public void VoteUp(IUserProfile user) {
vote_++;
// code to ... add to user profile
}
public void VoteDown(IUserProfile user) {
decrement and update profile
}
public SetAnswered(IUserProfile answer) {
answered_ = answer
// update u
}
}
public class CommunityWikiQuestion implements IStackoverflowQuestion {
public void VoteUp(IUserProfile user) { // do not update profile }
public void VoteDown(IUserProfile user) { // do not update profile }
public void SetAnswered(IUserProfile user) { // do not update profile }
}
Một số nơi khác trong cơ sở mã của bạn, bạn có thể có một mô-đun xử lý các câu hỏi bất kể chúng là gì:
public class OtherModuleProcessor {
public void Process(List<IStackoverflowQuestion> questions) {
... process each question.
}
}
giải thích tốt nhất về sự gắn kết đến từ Bộ luật sạch của chú Bob:
Các lớp nên có một số lượng nhỏ các biến thể hiện. Mỗi phương thức của một lớp nên thao tác một hoặc nhiều biến đó. Nói chung, càng nhiều biến một phương thức thao tác thì phương thức đó càng gắn kết với lớp của nó . Một lớp trong đó mỗi biến được sử dụng bởi mỗi phương thức được gắn kết tối đa.
Nói chung, không thể tạo ra các lớp gắn kết tối đa như vậy; mặt khác, chúng tôi muốn sự gắn kết cao . Khi độ gắn kết cao, điều đó có nghĩa là các phương thức và biến của lớp là đồng phụ thuộc và liên kết với nhau như một tổng thể logic.
Chiến lược giữ các hàm nhỏ và giữ danh sách tham số ngắn đôi khi có thể dẫn đến sự tăng sinh của các biến thể hiện được sử dụng bởi một tập hợp con các phương thức. Khi điều này xảy ra, điều đó hầu như luôn có nghĩa là có ít nhất một lớp khác đang cố gắng thoát khỏi lớp lớn hơn. Bạn nên cố gắng tách các biến và phương thức thành hai hoặc nhiều lớp sao cho các lớp mới gắn kết hơn.
đơn giản, Sự gắn kết đại diện cho mức độ mà một phần của cơ sở mã tạo thành một đơn vị nguyên tử, đơn lẻ. Mặt khác, khớp nối thể hiện mức độ mà một đơn vị độc lập với các đơn vị khác. Nói cách khác, đó là số lượng kết nối giữa hai hoặc nhiều đơn vị. Số càng ít, khớp nối càng thấp.
Về bản chất, sự gắn kết cao có nghĩa là giữ các bộ phận của một cơ sở mã có liên quan với nhau ở một nơi duy nhất. Khớp nối thấp, đồng thời, là về việc tách các phần không liên quan của cơ sở mã càng nhiều càng tốt.
Các loại mã từ quan điểm gắn kết và khớp nối:
Lý tưởng là mã theo hướng dẫn. Nó được liên kết lỏng lẻo và gắn kết cao. Chúng ta có thể minh họa mã như vậy với hình ảnh này:
God Object là kết quả của việc giới thiệu sự gắn kết cao và khớp nối cao. Nó là một mô hình chống và về cơ bản là viết tắt của một đoạn mã duy nhất thực hiện tất cả công việc cùng một lúc: lựa chọn kém diễn ra khi ranh giới giữa các lớp hoặc mô-đun khác nhau được chọn kém
Phá hủy phá hủy là một trong những thú vị nhất. Đôi khi nó xảy ra khi một lập trình viên cố gắng tách rời một cơ sở mã nhiều đến mức mã hoàn toàn mất trọng tâm:
đọc thêm ở đây
Sự gắn kết trong công nghệ phần mềm là mức độ mà các yếu tố của một mô-đun nhất định 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.
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.
Tôi đã viết một bài đăng trên blog về điều này , nếu bạn muốn đọc chi tiết hơn một chút với các ví dụ và bản vẽ. Tôi nghĩ rằng nó trả lời hầu hết các câu hỏi của bạn.
sự gắn kết đề cập đến tất cả về cách một lớp duy nhất được thiết kế. Sự gắn kết là nguyên tắc Hướng đối tượng liên quan chặt chẽ nhất với việc đảm bảo rằng một lớp được thiết kế với một mục đích duy nhất, tập trung tốt. Một lớp càng tập trung thì sự gắn kết của lớp đó càng nhiều. Ưu điểm của sự gắn kết cao là các lớp như vậy dễ duy trì hơn nhiều (và ít thay đổi thường xuyên hơn) so với các lớp có độ gắn kết thấp. Một lợi ích khác của sự gắn kết cao là các lớp có mục đích tập trung tốt có xu hướng tái sử dụng nhiều hơn các lớp khác.
Trong hình ảnh trên, chúng ta có thể thấy rằng trong sự gắn kết thấp, chỉ có một lớp chịu trách nhiệm thực hiện nhiều công việc không phổ biến làm giảm cơ hội sử dụng lại và bảo trì. Nhưng trong sự gắn kết cao, có một lớp riêng cho tất cả các công việc để thực hiện một công việc cụ thể, dẫn đến khả năng sử dụng và bảo trì tốt hơn.
Sự gắn kết (gắn kết): Co có nghĩa là cùng nhau , hesion mà phương tiện để thanh . Hệ thống dính các hạt của các chất khác nhau.
Ví dụ thực tế: img Courtesy
Toàn bộ là lớn hơn Tổng của các bộ phận -Aristotle.
Sự gắn kết là một kiểu đo lường thông thường và thường được mô tả là sự gắn kết cao, hay sự gắn kết thấp. Các mô-đun có độ gắn kết cao có xu hướng thích hợp hơn, bởi vì độ gắn kết cao có liên quan đến một số đặc điểm mong muốn của phần mềm bao gồm độ bền, độ tin cậy, khả năng sử dụng lại và dễ hiểu. Ngược lại, sự gắn kết thấp có liên quan đến các đặc điểm không mong muốn như khó duy trì, kiểm tra, tái sử dụng hoặc thậm chí hiểu. wiki
Khớp nối thường tương phản với sự gắn kết . Khớp nối thấp thường tương quan với sự gắn kết cao, và ngược lại. Khớp nối thấp thường là dấu hiệu của một hệ thống máy tính có cấu trúc tốt và thiết kế tốt, và khi kết hợp với sự gắn kết cao, hỗ trợ các mục tiêu chung về khả năng đọc và bảo trì cao. wiki
Tôi nghĩ rằng sự khác biệt có thể được đặt ra như sau:
Trong bài viết trên blog này tôi viết về nó chi tiết hơn.
Sự gắn kết là một dấu hiệu cho thấy sức mạnh chức năng tương đối của một mô-đun.
View Quan điểm thông thường:
tinh thần duy nhất của người Viking
ViewOO xem:
Cohesion ngụ ý rằng một thành phần hoặc lớp chỉ gói gọn các thuộc tính và hoạt động có liên quan chặt chẽ với nhau và với chính lớp hoặc thành phần đó
Những sự gắn kết
Chức năng
Layer
Truyền thông
Số lượng
Đặc điểm
Temporal
Tính linh hoạt
Khớp nối là một dấu hiệu của sự phụ thuộc lẫn nhau tương đối giữa các mô-đun.
Khớp nối phụ thuộc vào độ phức tạp của giao diện giữa các mô-đun, điểm mà tại đó mục nhập hoặc tham chiếu được thực hiện cho mô-đun và dữ liệu nào đi qua giao diện.
Chế độ xem thông thường: Mức độ mà một thành phần được kết nối với các thành phần khác và với thế giới bên ngoài
Chế độ xem OO: thước đo định tính mức độ mà các lớp được kết nối với nhau
Mức độ khớp nối
Nội dung
Common
Kiểm soát
Stamp
AtData
Call Gọi điện thoại
Sử dụng loại
Loại trừ hoặc nhập khẩu
# Vĩnh cửu
Khớp nối = tương tác / mối quan hệ giữa hai mô-đun ... Sự gắn kết = tương tác giữa hai yếu tố trong một mô-đun.
Một phần mềm bao gồm nhiều mô-đun. Module bao gồm các yếu tố. Coi một mô-đun là một chương trình. Một chức năng trong một chương trình là một yếu tố.
Trong thời gian chạy, đầu ra của một chương trình được sử dụng làm đầu vào cho một chương trình khác. Điều này được gọi là mô-đun để tương tác mô-đun hoặc quá trình để xử lý giao tiếp. Điều này cũng được gọi là Khớp nối.
Trong một chương trình duy nhất, đầu ra của một chức năng được truyền cho một chức năng khác. Điều này được gọi là tương tác của các yếu tố trong một mô-đun. Điều này cũng được gọi là sự gắn kết.
Thí dụ:
Khớp nối = giao tiếp giữa 2 gia đình khác nhau ... Sự gắn kết = giao tiếp giữa cha và mẹ trong một gia đình.
Nói một cách đơn giản, sự gắn kết có nghĩa là một lớp nên đại diện cho một khái niệm duy nhất.
Giao diện chung của một lớp được gắn kết nếu tất cả các tính năng của lớp có liên quan đến khái niệm mà lớp đại diện. Ví dụ, thay vì có lớp CashRegister, việc có sự gắn kết của CashRegister và Coin làm cho nó thành 2 lớp - lớp CashRegister và Coin.
Trong khớp nối , một lớp phụ thuộc vào lớp khác vì nó sử dụng các đối tượng của lớp.
Vấn đề với khớp nối cao là nó có thể tạo ra tác dụng phụ. Một thay đổi trong một lớp có thể gây ra lỗi không mong muốn ở lớp kia và có thể phá vỡ toàn bộ mã.
Nói chung, độ kết dính cao và khớp nối thấp được coi là OOP chất lượng cao.
Thuật ngữ gắn kết thực sự là một chút phản biện trực quan cho những gì nó có nghĩa trong thiết kế phần mềm.
Sự gắn kết có nghĩa phổ biến là một cái gì đó kết hợp tốt với nhau, được hợp nhất, được đặc trưng bởi liên kết mạnh như sức hút phân tử. Tuy nhiên, trong thiết kế phần mềm, điều đó có nghĩa là phấn đấu cho một lớp lý tưởng chỉ làm một việc, vì vậy nhiều mô-đun phụ thậm chí không tham gia.
Có lẽ chúng ta có thể nghĩ về nó theo cách này. Một phần có sự gắn kết nhất khi nó là phần duy nhất (chỉ thực hiện một điều và không thể bị phá vỡ thêm nữa). Đây là những gì được mong muốn trong thiết kế phần mềm. Sự gắn kết đơn giản là một tên gọi khác của "trách nhiệm đơn lẻ" hoặc "phân tách mối quan tâm".
Thuật ngữ ghép trên tay khá trực quan, có nghĩa là khi một mô-đun không phụ thuộc vào quá nhiều mô-đun khác và những mô-đun mà nó kết nối có thể dễ dàng thay thế, ví dụ tuân theo nguyên tắc thay thế liskov .
1.Cincincidental 2.Logical 3.Temporal 4.Procedural 5.C Truyền thông 6.Sequential 7.Feftal