Apa yang dimaksud dengan 'kopling rendah dan kohesi tinggi'


151

Saya memiliki masalah dalam memahami pernyataan itu low in coupling and high in cohesion. Saya sudah googled dan banyak membaca tentang ini, tetapi masih merasa sulit untuk dipahami.

Apa yang saya pahami High cohesionartinya, bahwa kita harus memiliki kelas yang khusus untuk melakukan fungsi tertentu. Semoga ini benar? Seperti kelas validasi kartu kredit, yang khusus untuk memvalidasi kartu kredit saja.

Dan masih tidak mengerti apa artinya Kopling rendah?


4
Untuk penjelasan yang lebih terperinci, Anda dapat memilih jawaban dari pos ini Kohesi & Kopling
Infinity

Jawaban ini tentu lebih baik dan ringkas daripada yang diberikan di sini.
Lokesh

Bahkan, ini adalah duplikat dari itu. Jawaban oleh Infinity adalah satu-satunya non-duplikat yang tidak disebutkan sejauh ini di sini.
cellepo

Jawaban:


232

Apa yang saya percayai adalah ini:

Kohesi mengacu pada sejauh mana unsur-unsur modul / kelas berada bersama, disarankan bahwa kode terkait harus dekat satu sama lain, jadi kita harus berusaha untuk kohesi tinggi dan mengikat semua kode terkait bersama sedekat mungkin. Ini ada hubungannya dengan elemen-elemen dalam modul / kelas.

Kopling mengacu pada sejauh mana modul / kelas yang berbeda bergantung satu sama lain, disarankan agar semua modul harus independen sejauh mungkin, itu sebabnya kopling rendah. Ini berkaitan dengan elemen-elemen di antara berbagai modul / kelas.

Untuk memvisualisasikan seluruh gambar akan sangat membantu:

masukkan deskripsi gambar di sini

Tangkapan layar diambil dari Coursera .


20
Profesor kami mengatakan "Kohesi tinggi adalah tentang memastikan modul tidak melakukan banyak hal, itu dimaksudkan untuk melakukan hanya satu hal tertentu".
Lokesh

2
Dari apa yang saya yakini lebih seperti "memastikan satu modul melakukan sesuatu, tidak banyak modul melakukan hal yang sama", dengan ini Anda dapat memastikan bahwa hanya satu modul yang menentukan perilaku, sehingga perilaku keseluruhan untuk suatu benda adalah kohesif.
sschrass

5
@Lokesh Saya pikir komentar Anda membingungkan. Profesor Anda membingungkan kohesi tinggi dengan "Prinsip tanggung jawab tunggal". Kohesi tinggi berarti menyatukan hal-hal yang serupa dan terkait. Anda dapat memiliki kohesi yang tinggi dalam suatu objek atau layanan yang terdiri dari banyak fungsi.
Max Hodges

17
Diagram itu secara harfiah tidak berarti apa-apa.
Liam

1
Dalam hal arsitektur layanan-mikro, kohesi tinggi berarti bahwa hal-hal yang sangat terkait harus disimpan bersama dalam satu layanan-mikro dan pelepasan longgar berarti bahwa layanan-mikro itu sendiri harus berbutir halus untuk bekerja dalam konteks terbatas yaitu melakukan satu hal secara mandiri.
sactiw

41

Kohesi dalam rekayasa perangkat lunak, seperti dalam kehidupan nyata, adalah seberapa banyak elemen yang terdiri dari keseluruhan (dalam kasus kami katakanlah sebuah kelas) dapat dikatakan bahwa mereka sebenarnya milik bersama. Dengan demikian, ini adalah ukuran seberapa kuat setiap fungsionalitas yang diekspresikan oleh kode sumber modul perangkat lunak.

Salah satu cara melihat kohesi dalam hal OO adalah jika metode di kelas menggunakan salah satu atribut pribadi.

Sekarang diskusi lebih besar dari ini tetapi Kohesi Tinggi (atau tipe kohesi terbaik - kohesi fungsional) adalah ketika bagian-bagian modul dikelompokkan karena mereka semua berkontribusi pada satu tugas modul yang didefinisikan dengan baik.

Menggabungkan dengan kata-kata sederhana, adalah seberapa banyak satu komponen (sekali lagi, bayangkan sebuah kelas, meskipun tidak harus) tahu tentang cara kerja bagian dalam atau elemen dalam yang lain, yaitu seberapa banyak pengetahuan yang dimiliki komponen lain.

Loose coupling adalah metode interkoneksi komponen-komponen dalam suatu sistem atau jaringan sehingga komponen-komponen tersebut, saling bergantung satu sama lain sejauh mungkin secara praktis ...

Saya menulis posting blog tentang ini. Ini membahas semua ini dengan sangat rinci, dengan contoh-contoh dll. Ini juga menjelaskan manfaat mengapa Anda harus mengikuti prinsip-prinsip ini.


26

Dalam perancangan perangkat lunak, kohesi yang tinggi berarti bahwa kelas harus melakukan satu hal dan satu hal dengan sangat baik. Kohesi tinggi terkait erat dengan prinsip tanggung jawab tunggal .

Kopling rendah menunjukkan bahwa kelas harus memiliki dependensi sekecil mungkin. Juga, dependensi yang harus ada harus dependensi yang lemah - lebih memilih ketergantungan pada antarmuka daripada ketergantungan pada kelas beton, atau lebih suka komposisi daripada warisan.

Kohesi Tinggi dan kopling rendah memberi kami kode yang dirancang lebih baik sehingga lebih mudah untuk dipelihara.


Anda melewatkan Injeksi Ketergantungan. Ini terkait erat dengan kopling rendah untuk memastikan kelas memiliki dependensi yang paling / tidak sama sekali.
BugHunterUK

16

Jawaban singkat dan jelas

  • Kohesi tinggi : Elemen dalam satu kelas / modul harus secara fungsional menjadi satu dan melakukan satu hal tertentu.
  • Longgar kopling : Di antara kelas / modul yang berbeda harus minimal ketergantungan.

9

Kopling rendah adalah dalam konteks dua atau banyak modul. Jika perubahan dalam satu modul menghasilkan banyak perubahan pada modul lain maka mereka dikatakan sangat berpasangan. Di sinilah pemrograman berbasis antarmuka membantu. Setiap perubahan dalam modul tidak akan berdampak pada modul lainnya karena antarmuka (rata-rata interaksi) di antara mereka tidak berubah.

Kohesi tinggi- Menyatukan hal-hal serupa. Jadi kelas harus memiliki metode atau perilaku untuk melakukan pekerjaan terkait. Hanya untuk memberikan contoh buruk yang berlebihan: Implementasi antarmuka Daftar tidak boleh memiliki operasi yang terkait dengan String. Kelas string harus memiliki metode, bidang yang relevan untuk String dan juga, implementasi Daftar harus memiliki hal-hal yang sesuai.

Semoga itu bisa membantu.


5

Singkatnya cerita, kopling rendah seperti yang saya pahami itu berarti komponen dapat ditukar tanpa mempengaruhi berfungsinya suatu sistem. Pada dasarnya memodulasi sistem Anda menjadi komponen yang berfungsi yang dapat diperbarui secara terpisah tanpa merusak sistem


1
Bukankah itu sama dengan Kohesi Tinggi?
user1315906

4

Apakah Anda memiliki ponsel pintar? Apakah ada satu aplikasi besar atau banyak yang kecil? Apakah satu aplikasi membalas yang lain? Bisakah Anda menggunakan satu aplikasi saat memasang, memperbarui, dan / atau mencopot pemasangan yang lain? Bahwa setiap aplikasi mandiri adalah kohesi yang tinggi. Bahwa setiap aplikasi independen dari yang lain adalah kopling rendah. DevOps menyukai arsitektur ini karena itu berarti Anda dapat melakukan penyebaran kontinu tanpa mengganggu keseluruhan sistem.


> Apakah satu aplikasi membalas yang lain? . . baik ya, ada yang melakukannya. Banyak aplikasi menggunakan aplikasi Kamera, dengan aplikasi latihan memasukkan data jantung dan latihan ke Kesehatan dan Aktivitas. Saya dapat membagikan cuplikan dari satu aplikasi ke yang lainnya. Aplikasi alarm saya tahu waktu dan memutar trek dari aplikasi Musik ...
Max Hodges

@ MaxHodges hal itu (kohesi rendah dan kopling tinggi) disusutkan dan harus diminimalkan seminimal mungkin. Dalam beberapa kasus, seperti yang Anda sebutkan. Ini tidak dapat sepenuhnya dihapus.
M. Habib

2

Warisan atau generalisasi adalah contoh dari kopling tinggi (yaitu saling ketergantungan tinggi). Apa yang saya maksudkan dengan ini adalah bahwa dalam pewarisan sering kali kelas induk mendefinisikan fungsionalitas dasar yang digunakan oleh kelas anaknya dan perubahan metode kelas induk secara langsung berdampak pada kelas anaknya. Oleh karena itu kita dapat mengatakan bahwa ada tingkat saling ketergantungan yang lebih besar antara kelas-kelas.

Realisasi atau menggunakan antarmuka adalah contoh kohesi tinggi (yaitu saling ketergantungan rendah). Apa artinya ini adalah bahwa antarmuka mengajukan kontrak untuk kelas apa pun yang mengimplementasikannya tetapi setiap kelas memiliki hak untuk mengimplementasikan metode yang dinyatakan dalam antarmuka dengan caranya sendiri dan perubahan dalam metode yang dinyatakan dalam satu kelas tidak memengaruhi kelas lain.


2

Kohesi - seberapa dekat hubungan semuanya dengan satu sama lain.
Coupling - bagaimana semuanya terhubung satu sama lain.

Mari kita ambil contoh - Kami ingin merancang mobil self-driving.

(1) Kita membutuhkan motor untuk berjalan dengan baik.

(2) Kita perlu mobil untuk berkendara sendiri.

Semua kelas dan fungsi dalam (1) menghidupkan motor dan membuatnya bekerja dengan baik bersama-sama, tetapi tidak membantu menyetir mobil. Jadi kami menempatkan kelas-kelas itu di belakang Engine Controller.

Semua kelas dan fungsi dalam (2) bekerja sangat baik untuk membuat mobil mengarahkan, mempercepat dan mengerem. Mereka tidak membantu mobil menghidupkan atau mengirim bensin ke piston. Jadi kami menempatkan kelas-kelas ini di belakang Driving Controller-nya sendiri.

Kontroler ini digunakan untuk berkomunikasi dengan semua kelas dan fungsi yang tersedia. Kontroler kemudian hanya berkomunikasi satu sama lain. Ini berarti saya tidak dapat memanggil fungsi di kelas piston dari kelas pedal gas untuk membuat mobil melaju lebih cepat.

Kelas pedal harus meminta Pengendali Mengemudi untuk berbicara dengan Pengontrol Engine yang kemudian memerintahkan kelas piston untuk bergerak lebih cepat. Hal ini memungkinkan kami programmer untuk dapat menemukan masalah dan memungkinkan kami untuk menggabungkan program besar tanpa khawatir. Ini karena kodenya semuanya bekerja di belakang controller.


1

Kopling Rendah dan Kohesi Tinggi adalah fenomena yang direkomendasikan.

Kopling berarti sejauh mana berbagai modul saling tergantung dan bagaimana modul lainnya terpengaruh pada perubahan beberapa fungsi modul. Kopling rendah ditekankan karena ketergantungannya harus dipertahankan rendah sehingga perubahan yang dibuat paling kecil / dapat diabaikan untuk modul lain.


1

Contoh mungkin membantu. Bayangkan sebuah sistem yang menghasilkan data dan memasukkannya ke dalam penyimpanan data, baik file di disk atau database.

Kohesi Tinggi dapat dicapai dengan memisahkan kode penyimpanan data dari kode produksi data. (dan sebenarnya memisahkan penyimpanan disk dari penyimpanan basis data).

Kopling Rendah dapat dicapai dengan memastikan bahwa produksi data tidak memiliki pengetahuan yang tidak perlu tentang penyimpanan data (mis. Tidak menanyakan penyimpanan data tentang nama file atau koneksi db).


1

Inilah jawaban dari sedikit sudut teori grafik abstrak:

Mari kita menyederhanakan masalah dengan hanya melihat grafik dependensi (diarahkan) antara objek stateful.

Sebuah jawaban yang sangat sederhana dapat diilustrasikan dengan mempertimbangkan dua kasus pembatasan grafik ketergantungan:

Kasing pembatas pertama : grafik cluster .

Grafik klaster adalah realisasi paling sempurna dari grafik dependensi kohesi tinggi dan kopling rendah (diberikan satu set ukuran kluster).

Ketergantungan antara cluster adalah maksimal (terhubung penuh), dan ketergantungan antar cluster minimal (nol).

Ini adalah ilustrasi abstrak dari jawaban dalam salah satu kasus yang membatasi .

Kasing pembatas ke-2 adalah grafik yang terhubung sepenuhnya, di mana semuanya tergantung pada semuanya.

Realitas ada di antara keduanya, semakin dekat ke cluster cluster semakin baik, dalam pemahaman saya yang rendah hati.

Dari sudut pandang lain : ketika melihat grafik ketergantungan terarah, idealnya harus asiklik, jika tidak maka siklus membentuk kelompok / komponen terkecil.

Satu langkah naik / turun hierarki sesuai dengan "satu contoh" kopling longgar, kohesi ketat dalam perangkat lunak tetapi dimungkinkan untuk melihat prinsip kohesi kopling longgar / ketat ini sebagai fenomena berulang di kedalaman berbeda dari grafik yang diarahkan asiklik (atau pada salah satu dari pohon merentangnya).

Dekomposisi semacam itu dari sistem menjadi hierarki membantu mengalahkan kompleksitas eksponensial (katakanlah setiap cluster memiliki 10 elemen). Kemudian pada 6 lapisan sudah 1 juta objek:

10 cluster membentuk 1 superkluster, 10 superkluster membentuk 1 hypercluster dan seterusnya ... tanpa konsep kohesi yang ketat, kopling longgar, arsitektur hierarkis seperti itu tidak akan mungkin terjadi.

Jadi ini mungkin adalah arti penting sebenarnya dari cerita dan bukan hanya kohesi tinggi, kopling rendah dalam dua lapisan saja. Pentingnya nyata menjadi jelas ketika mempertimbangkan abstraksi tingkat yang lebih tinggi dan interaksinya.


0

Saya pikir Anda telah merah definisi begitu banyak tetapi jika Anda masih memiliki keraguan atau Jika Anda masih baru dalam pemrograman dan ingin masuk jauh ke dalam ini maka saya akan menyarankan Anda untuk menonton video ini, https://youtu.be/HpJTGW9AwX0 Ini hanya referensi untuk mendapatkan info lebih lanjut tentang polimorfisme ... Semoga Anda mendapatkan pemahaman yang lebih baik dengan ini


0

Kopling Rendah: - Akan membuatnya sangat sederhana. Jika Anda mengubah modul Anda bagaimana pengaruhnya terhadap modul lain.

Contoh: - Jika API layanan Anda ditampilkan sebagai JAR, setiap perubahan pada tanda tangan metode akan memutus panggilan API (Kopling Tinggi / Ketat).

Jika modul Anda dan modul lainnya berkomunikasi melalui pesan async. Selama Anda mendapatkan pesan, tanda tangan perubahan metode Anda akan bersifat lokal untuk modul Anda (kopling rendah).

Tentu saja jika ada perubahan dalam format pesan, klien panggilan perlu melakukan beberapa perubahan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.