Nói tóm lại, bất cứ khi nào bạn sử dụng "mới", bạn sẽ liên kết chặt chẽ lớp chứa mã này với đối tượng được tạo; để khởi tạo một trong các đối tượng này, lớp thực hiện khởi tạo phải biết về lớp cụ thể được khởi tạo. Vì vậy, khi sử dụng "mới", bạn nên xem xét liệu lớp bạn đang đặt khởi tạo có phải là nơi "tốt" để kiến thức đó cư trú hay không và bạn có sẵn sàng thay đổi trong lĩnh vực này hay không nếu hình thức của đối tượng được khởi tạo là để thay đổi.
Khớp nối chặt chẽ, đó là một đối tượng có kiến thức về một lớp cụ thể khác, không phải lúc nào cũng phải tránh; Ở một mức độ nào đó, một cái gì đó, SOMEWHERE, phải biết cách tạo ra đối tượng này, ngay cả khi mọi thứ khác liên quan đến đối tượng bằng cách được cung cấp một bản sao của nó từ một nơi khác. Tuy nhiên, khi lớp được tạo thay đổi, bất kỳ lớp nào biết về việc triển khai cụ thể của lớp đó phải được cập nhật để xử lý chính xác các thay đổi của lớp đó.
Câu hỏi mà bạn luôn phải đặt ra là "Liệu lớp này có biết cách tạo lớp khác này trở thành trách nhiệm khi duy trì ứng dụng không?" Cả hai phương pháp thiết kế chính (RẮN và GRASP) thường sẽ trả lời "có", vì những lý do khác nhau. Tuy nhiên, chúng chỉ là phương pháp và cả hai đều có giới hạn cực đoan là chúng không được xây dựng dựa trên kiến thức về chương trình độc đáo của bạn. Như vậy, họ chỉ có thể nhầm lẫn về mặt thận trọng và cho rằng bất kỳ điểm nào của khớp nối chặt chẽ sẽ TUYỆT VỜI khiến bạn gặp vấn đề liên quan đến việc thay đổi một trong hai hoặc của cả hai điểm này. Bạn phải đưa ra quyết định cuối cùng khi biết ba điều; thực hành tốt nhất về mặt lý thuyết (đó là ghép đôi mọi thứ một cách lỏng lẻo vì mọi thứ đều có thể thay đổi); chi phí thực hiện thực tiễn tốt nhất về mặt lý thuyết (có thể bao gồm một số lớp trừu tượng mới sẽ giảm bớt một loại thay đổi trong khi cản trở một loại khác); và xác suất trong thế giới thực rằng loại thay đổi bạn dự đoán sẽ là cần thiết.
Một số hướng dẫn chung:
Tránh khớp nối chặt chẽ giữa các thư viện mã được biên dịch. Giao diện giữa các DLL (hoặc EXE và DLL của nó) là nơi chính mà sự kết hợp chặt chẽ sẽ gây ra bất lợi. Nếu bạn thay đổi một lớp A trong DLL X và lớp B trong EXE chính biết về lớp A, bạn phải biên dịch lại và giải phóng cả hai nhị phân. Trong một nhị phân đơn, khớp nối chặt chẽ hơn thường được cho phép hơn vì toàn bộ nhị phân phải được xây dựng lại cho bất kỳ thay đổi nào. Đôi khi, việc phải xây dựng lại nhiều nhị phân là không thể tránh khỏi, nhưng bạn nên cấu trúc mã của mình để có thể tránh được khi có thể, đặc biệt đối với các tình huống băng thông ở mức cao (như triển khai ứng dụng di động; đẩy DLL mới trong nâng cấp rẻ hơn rất nhiều hơn là đẩy toàn bộ chương trình).
Tránh khớp nối chặt chẽ giữa các "trung tâm logic" chính của chương trình của bạn. Bạn có thể nghĩ về một chương trình có cấu trúc tốt bao gồm các lát ngang và dọc. Các lát cắt ngang có thể là các tầng ứng dụng truyền thống, như UI, Bộ điều khiển, Miền, DAO, Dữ liệu; lát cắt dọc có thể được xác định cho từng cửa sổ hoặc chế độ xem hoặc cho "câu chuyện người dùng" riêng lẻ (như tạo bản ghi mới của một số loại cơ bản). Khi thực hiện một cuộc gọi di chuyển lên, xuống, trái hoặc phải trong một hệ thống có cấu trúc tốt, bạn thường nên gọi cuộc gọi trừu tượng. Ví dụ, khi xác thực cần truy xuất dữ liệu, nó không nên truy cập trực tiếp vào DB mà nên thực hiện cuộc gọi đến giao diện để truy xuất dữ liệu, được hỗ trợ bởi đối tượng thực tế biết cách thực hiện việc này. Khi một số điều khiển UI cần thực hiện logic nâng cao liên quan đến một cửa sổ khác, cần tóm tắt việc kích hoạt logic này thông qua một sự kiện và / hoặc gọi lại; kết quả là không cần phải biết những gì sẽ được thực hiện, cho phép bạn thay đổi những gì sẽ được thực hiện mà không thay đổi điều khiển kích hoạt nó.
Trong mọi trường hợp, hãy xem xét việc thay đổi sẽ dễ dàng hay khó khăn như thế nào, và khả năng thay đổi sẽ như thế nào. Nếu một đối tượng bạn đang tạo chỉ được sử dụng từ một nơi và bạn không thấy trước sự thay đổi đó, thì khớp nối chặt chẽ thường được cho phép hơn, và thậm chí có thể vượt trội hơn trong tình huống này đối với khớp nối lỏng lẻo. Khớp nối lỏng lẻo đòi hỏi sự trừu tượng, là lớp bổ sung ngăn thay đổi đối tượng phụ thuộc khi việc thực hiện phụ thuộc phải thay đổi. Tuy nhiên, nếu bản thân giao diện phải thay đổi (thêm một cuộc gọi phương thức mới hoặc thêm một tham số vào một cuộc gọi phương thức hiện có), thì một giao diện thực sự làm tăng lượng công việc cần thiết để thực hiện thay đổi. Bạn phải cân nhắc khả năng các loại thay đổi khác nhau ảnh hưởng đến thiết kế,