Singkatnya, setiap kali Anda menggunakan "baru", Anda dengan erat menyambungkan kelas yang berisi kode ini ke objek yang sedang dibuat; untuk instantiate salah satu objek ini, kelas yang melakukan instantiasi harus tahu tentang kelas konkret yang sedang dipakai. Jadi, ketika menggunakan "baru", Anda harus mempertimbangkan apakah kelas tempat Anda meletakkan instantiasi adalah tempat "baik" untuk tempat pengetahuan itu berada, dan Anda bersedia untuk membuat perubahan di bidang ini jika bentuk dari objek yang dipakai adalah untuk berubah.
Kopling ketat, yang merupakan objek yang memiliki pengetahuan kelas konkret lainnya, tidak selalu harus dihindari; pada tingkat tertentu, sesuatu, DI MANA SAJA, harus tahu cara membuat objek ini, bahkan jika segala sesuatu berurusan dengan objek dengan diberi salinannya dari tempat lain. Namun, ketika kelas yang dibuat berubah, setiap kelas yang tahu tentang implementasi konkret dari kelas itu harus diperbarui untuk menangani dengan benar perubahan kelas itu.
Pertanyaan yang harus selalu Anda tanyakan adalah, "Apakah kelas ini tahu cara membuat kelas lain ini menjadi tanggung jawab saat mempertahankan aplikasi?" Kedua metodologi desain utama (SOLID dan GRASP) biasanya akan menjawab "ya", untuk alasan yang agak berbeda. Namun, mereka hanya metodologi, dan keduanya memiliki batasan ekstrem yang tidak dirumuskan berdasarkan pengetahuan program unik Anda. Dengan demikian, mereka hanya bisa keliru pada sisi hati-hati, dan menganggap bahwa setiap titik kopling ketat akan BENAR-BENAR menyebabkan Anda masalah terkait dengan membuat perubahan pada salah satu atau kedua sisi dari titik ini. Anda harus membuat keputusan akhir dengan mengetahui tiga hal; praktik terbaik teoretis (yaitu secara longgar menggabungkan segala sesuatu karena apa pun dapat berubah); biaya penerapan praktik terbaik teoretis (yang mungkin mencakup beberapa lapisan abstraksi baru yang akan memudahkan satu jenis perubahan sementara menghambat yang lain); dan probabilitas dunia nyata bahwa jenis perubahan yang Anda harapkan akan diperlukan.
Beberapa pedoman umum:
Hindari hubungan erat antara pustaka kode yang dikompilasi. Antarmuka antara DLL (atau EXE dan DLLnya) adalah tempat utama di mana kopling ketat akan menghadirkan kerugian. Jika Anda membuat perubahan ke kelas A di DLL X, dan kelas B di EXE utama tahu tentang kelas A, Anda harus mengkompilasi ulang dan melepaskan kedua binari. Dalam satu biner, kopling yang lebih ketat umumnya lebih diizinkan karena seluruh biner harus dibangun kembali untuk setiap perubahan. Kadang-kadang, harus membangun kembali banyak biner tidak dapat dihindari, tetapi Anda harus menyusun kode Anda sehingga Anda dapat menghindarinya jika memungkinkan, terutama untuk situasi di mana bandwidth berada pada premium (seperti menggunakan aplikasi seluler; mendorong DLL baru dalam peningkatan jauh lebih murah) daripada mendorong seluruh program).
Hindari hubungan erat antara "pusat-pusat logika" utama dari program Anda. Anda dapat menganggap program terstruktur dengan baik sebagai terdiri dari irisan horizontal dan vertikal. Irisan horizontal dapat berupa tingkatan aplikasi tradisional, seperti UI, Pengendali, Domain, DAO, Data; irisan vertikal dapat didefinisikan untuk jendela atau tampilan individual, atau untuk "cerita pengguna" individual (seperti membuat catatan baru dari beberapa tipe dasar). Saat melakukan panggilan yang bergerak ke atas, ke bawah, ke kiri atau ke kanan dalam sistem yang terstruktur dengan baik, Anda biasanya harus mengabstraksikan panggilan tersebut. Misalnya, ketika validasi perlu mengambil data, seharusnya tidak memiliki akses ke DB secara langsung tetapi harus membuat panggilan ke antarmuka untuk pengambilan data, yang didukung oleh objek aktual yang tahu bagaimana melakukan ini. Ketika beberapa kontrol UI perlu melakukan logika lanjutan yang melibatkan jendela lain, harus abstrak pemicu logika ini melalui suatu peristiwa dan / atau panggilan balik; itu tidak harus tahu apa yang akan dilakukan sebagai hasilnya, memungkinkan Anda untuk mengubah apa yang akan dilakukan tanpa mengubah kontrol yang memicunya.
Dalam setiap kasus, pertimbangkan seberapa mudah atau sulit perubahan akan dibuat, dan seberapa besar kemungkinan perubahan itu akan terjadi. Jika suatu objek yang Anda buat hanya pernah digunakan dari satu tempat, dan Anda tidak melihat perubahan itu, maka kopling ketat umumnya lebih diizinkan, dan bahkan mungkin lebih unggul dalam situasi ini dari kopling longgar. Kopling longgar membutuhkan abstraksi, yang merupakan lapisan tambahan yang mencegah perubahan pada objek dependen ketika implementasi dependensi harus berubah. Namun, jika antarmuka itu sendiri harus berubah (menambahkan panggilan metode baru, atau menambahkan parameter ke panggilan metode yang ada), maka antarmuka sebenarnya meningkatkan jumlah pekerjaan yang diperlukan untuk melakukan perubahan. Anda harus mempertimbangkan kemungkinan berbagai jenis perubahan yang berdampak pada desain,