DESAIN SOFTRWARE
5.3 KOHESI DAN COUPLING
kita dapat secara kuantitatif mengkarakterisasi modularitas solusi desain berdasarkan kohesi dan kopling yang ada dalam desain.
Solusi desain dikatakan sangat modular, jika modul yang berbeda dalam solusi memiliki kohesi tinggi dan sambungan antar-modulnya rendah. Sebuah desain perangkat lunak dengan kohesi tinggi dan kopling rendah antara modul adalah dekomposisi masalah efektif yang kita bahas di Bab 1. Desain seperti itu akan mengarah pada peningkatan produktivitas selama pengembangan program dengan menurunkan kompleksitas masalah yang dirasakan.
Berdasarkan klasifikasi ini, kita akan dapat dengan mudah menilai kohesi dan kopling yang ada dalam solusi desain. Dari pengetahuan tentang kohesi dan kopling dalam desain, kita dapat membentuk pendapat kita sendiri tentang modularitas solusi desain. Kita dapat mendefinisikan konsep kohesi dan kopling dan berbagai kelas kohesi. Sekarang mari kita bahas karakteristik penting lainnya dari solusi desain yang baik—desain berlapis.
Desain berlapis
Sebuah desain berlapis adalah salah satu di mana ketika hubungan panggilan antara modul yang berbeda direpresentasikan secara grafis, itu akan menghasilkan diagram seperti pohon dengan layering yang jelas. Dalam solusi desain berlapis, modul disusun dalam hierarki lapisan. Sebuah modul hanya dapat menjalankan fungsi dari modul-modul di lapisan tepat di bawahnya. Modul lapisan yang lebih tinggi dapat dianggap serupa dengan manajer yang memanggil (memesan) modul lapisan bawah untuk menyelesaikan tugas tertentu. Desain berlapis dapat dianggap menerapkan abstraksi kontrol, karena modul di lapisan bawah tidak mengetahui (tentang cara memanggil) modul lapisan yang lebih tinggi.
Sebuah desain berlapis dapat membuat solusi desain mudah dimengerti, karena untuk memahami cara kerja modul, seseorang harus memahami bagaimana modul lapisan bawah langsung bekerja tanpa harus khawatir tentang fungsi modul lapisan atas. Ketika kegagalan terdeteksi saat menjalankan modul, jelas bahwa modul di bawahnya mungkin bisa menjadi sumber kesalahan. Ini sangat menyederhanakan debugging karena seseorang hanya perlu berkonsentrasi pada beberapa modul untuk mendeteksi kesalahan.
Kohesi: Untuk memahami kohesi, mari kita pahami analogi terlebih dahulu. Misalkan Anda mendengarkan ceramah oleh beberapa pembicara. Anda akan menyebut pidato menjadi kohesif, jika semua kalimat pidato memainkan peran dalam memberikan pidato satu tema dan fokus. Sekarang, kita dapat memperluas ini ke modul dalam solusi desain. Ketika fungsi modul bekerja sama satu sama lain untuk melakukan satu tujuan, maka modul memiliki kohesi yang baik. Jika fungsi modul melakukan hal yang sangat berbeda dan tidak bekerja sama satu sama lain untuk melakukan satu pekerjaan, maka modul memiliki kohesi yang sangat buruk.
Kemandirian fungsional
Dengan istilah independensi fungsional, modul melakukan satu tugas dan membutuhkan sedikit interaksi dengan modul lain. Sebuah modul yang sangat kohesif dan juga memiliki kopling rendah dengan modul lain dikatakan secara fungsional independen dari modul lainnya. Kemandirian fungsional adalah kunci untuk setiap desain yang baik terutama karena keuntungan-keuntungan berikut yang ditawarkannya:
Isolasi kesalahan: Setiap kali ada kesalahan dalam modul, independensi fungsional mengurangi kemungkinan kesalahan menyebar ke modul lain. Alasan di balik ini adalah bahwa jika sebuah modul secara fungsional independen, interaksinya dengan modul lain rendah.
Oleh karena itu, kesalahan yang ada pada modul sangat kecil kemungkinannya mempengaruhi fungsi modul lainnya.
Selanjutnya, setelah kegagalan terdeteksi, isolasi kesalahan membuatnya sangat mudah untuk menemukan kesalahan. Di sisi lain, ketika modul tidak independen secara fungsional, setelah kegagalan terdeteksi dalam fungsi yang disediakan oleh modul, kesal ahan dapat berpotensi terjadi di salah satu dari sejumlah besar modul dan disebarkan ke fungsi modul.
Lingkup penggunaan kembali: Penggunaan kembali modul untuk pengembangan aplikasi lain menjadi lebih mudah. Alasan untuk ini adalah sebagai berikut. Sebuah modul fungsional independen melakukan beberapa tugas yang terdefinisi dengan baik dan tepat dan antarmuka modul dengan modul lain sangat sedikit dan sederhana. Oleh karena itu, modul yang secara fungsional independen dapat dengan mudah dikeluarkan dan dig unakan kembali dalam program yang berbeda. Di sisi lain, jika modul berinteraksi dengan beberapa modul lain atau fungsi modul melakukan tugas yang sangat berbeda, maka akan sulit untuk menggunakannya kembali. Hal ini terutama terjadi, jika modul mengakses data (atau kode) internal ke modul lain.
Dapat dimengerti: Ketika modul secara fungsional independen, kompleksitas desain sangat berkurang. Ini karena fakta bahwa modul yang berbeda dapat dipahami secara terpisah, karena modul tidak tergantung satu sama lain.
Klasifikasi Keterpaduan
Kekompakan modul adalah sejauh mana fungsi yang berbeda dari modul bekerja sama untuk bekerja menuju satu tujuan. Modul desain yang berbeda dapat memiliki derajat kebebasan yang berbeda. Namun, kelas kohesi yang berbeda yang dapat dimiliki modul digambarkan pada Gambar 5.3. Kekompakan meningkat dari kohesi kebetulan menjadi kohesi fungsional. Artinya, kebetulan adalah jenis kohesi terburuk dan fungsional adalah kohesi terbaik. Kelas kohesi yang berbeda ini diuraikan di bawah ini.
Gambar 5.3 Klasifikasi kohesi.
Kohesi kebetulan: Sebuah modul dikatakan memiliki kohesi kebetulan, jika melakukan serangkaian tugas yang berhubungan satu sama lain sangat longgar, jika sama sekali. Dalam hal ini, kita dapat mengatakan bahwa modul berisi kumpulan fungsi acak. Sangat mungkin bahwa fungsi-fungsi tersebut telah ditempatkan dalam modul karena kebetulan murni daripada melalui beberapa pemikiran atau desain. Desain yang dibuat oleh programmer pemula sering memiliki kategori kohesi ini, karena mereka sering menggabungkan fungsi ke modul dengan agak sewenang-wenang. Contoh modul dengan kohesi kebetulan ditunjukkan pada Gambar 5.4(a). Perhatikan bahwa fungsi modul yang berbeda melakukan aktivitas yang sangat berbeda dan tidak terkait mulai dari penerbitan buku perpustakaan hingga pembuatan catatan anggota perpustakaan di satu sisi, dan penanganan permintaan cuti pustakawan di sisi lain.
Gambar 5.4 Contoh kohesi
Kohesi logis: Sebuah modul dikatakan kohesif secara logis, jika semua elemen modul melakukan operasi serupa, seperti penanganan kesalahan, input data, output data, dll.
Sebagai contoh kohesi logis, pertimbangkan modul yang berisi satu set print berfungsi untuk menghasilkan berbagai jenis laporan keluaran seperti grade sheet, slip gaji, laporan tahunan, dll.
Kohesi temporal: Ketika sebuah modul berisi fungsi-fungsi yang terkait dengan fakta bahwa fungsi-fungsi ini dijalankan dalam rentang waktu yang sama, maka modul tersebut dikatakan memiliki kohesi temporal. Sebagai contoh, perhatikan situasi berikut. Saat komputer di-boot, beberapa fungsi perlu dilakukan. Ini termasuk inisialisasi memori dan perangkat, memuat sistem operasi, dll. Ketika satu modul melakukan semua tugas ini, maka modul tersebut dapat dikatakan menunjukkan kohesi temporal. Contoh lain dari modul yang memiliki kohesi temporal adalah sebagai berikut. Demikian pula, modul akan menunjukkan kohesi temporal, jika terdiri dari fungsi untuk melakukan inisialisasi, atau start-up, atau shutdown dari beberapa proses.
Kohesi prosedural: Sebuah modul dikatakan memiliki kohesi prosedural, jika kumpulan fungsi modul dieksekusi satu demi satu, meskipun fungsi-fungsi ini dapat bekerja untuk tujuan yang sama sekali berbeda dan beroperasi pada data yang sangat berbeda.
Pertimbangkan aktivitas yang terkait dengan pemrosesan pesanan di rumah perdagangan.
Fungsi login(), place-order(), check-order(), printbill(), place-order-on-vendor(), update- inventory(), dan logout() semuanya melakukan hal yang berbeda dan beroperasi pada data yang berbeda. Namun, mereka biasanya dieksekusi satu demi satu selama pemrosesan pesanan biasa oleh petugas penjualan.
Kohesi komunikasi: Sebuah modul dikatakan memiliki kohesi komunikasi, jika semua fungsi modul mengacu atau memperbarui struktur data yang sama. Sebagai contoh kohesi prosedural, pertimbangkan sebuah modul bernama student di mana fungsi yang berbeda dalam modul seperti acceptStudent, enterMarks, printGradeSheet, dll. mengakses dan memanipulasi data yang disimpan dalam array bernama studentRecords yang didefinisikan di dalam modul.
Kohesi berurutan: Sebuah modul dikatakan memiliki kohesi berurutan, jika fungsi modul yang berbeda dijalankan secara berurutan, dan output dari satu fungsi dimasukkan ke fungsi berikutnya dalam urutan tersebut. Sebagai contoh perhatikan situasi berikut. Di toko online pertimbangkan bahwa setelah pelanggan meminta beberapa item, pertama-tama ditentukan apakah item tersebut tersedia. Dalam hal ini, jika fungsi create-order(), check- item-availability(), placeorder-on-vendor() ditempatkan dalam satu modul, maka modul akan menunjukkan kohesi berurutan. Perhatikan bahwa fungsi create-order() membuat pesanan yang diproses oleh fungsi check-item-availability() (apakah item tersedia dalam jumlah yang diperlukan dalam inventaris) dimasukkan ke place-order-on-vendor( ).
Kohesi fungsional: Sebuah modul dikatakan memiliki kohesi fungsional, jika fungsi yang berbeda dari modul bekerja sama untuk menyelesaikan satu tugas. Misalnya, modul yang berisi semua fungsi yang diperlukan untuk mengelola daftar gaji karyawan menampilkan kohesi fungsional. Dalam hal ini, semua fungsi modul (misalnya, computeOvertime(), computeWorkHours(), computeDeductions(), dll.) bekerja sama untuk menghasilkan slip gaji karyawan. Contoh lain dari modul yang memiliki kohesi fungsional telah ditunjukkan pada Gambar 5.4(b). Dalam contoh ini, fungsi issue-book(), return-book(), query-book(), dan find- borrower(), bersama-sama mengelola semua aktivitas yang berkaitan dengan peminjaman buku. Ketika sebuah modul memiliki kohesi fungsional, maka kita harus dapat menggambarkan apa yang dilakukan modul hanya dengan menggunakan satu kalimat sederhana. Sebagai contoh, untuk modul pada Gambar 5.4(a), kita dapat menggambarkan keseluruhan tanggung jawab modul dengan mengatakan “Ini mengelola prosedur peminjaman buku di perpustakaan.”
Cara sederhana untuk menentukan kekompakan dari setiap modul yang diberikan adalah sebagai berikut. Pertama periksa apa yang dilakukan fungsi modul. Kemudian, coba tuliskan sebuah kalimat untuk menggambarkan keseluruhan pekerjaan yang dilakukan oleh modul. Jika Anda memerlukan kalimat majemuk untuk menggambarkan fungsionalitas modul, maka modul tersebut memiliki kohesi sekuensial atau komunikasi. Jika Anda membutuhkan kata-kata seperti "pertama", "berikutnya", "setelah", "kemudian", dll., maka itu memiliki kohesi berurutan atau temporal. Jika perlu kata-kata seperti "inisialisasi", "setup", "shut down”, dll., untuk mendefinisikan fungsinya, maka ia memiliki kohesi temporal.
Kita sekarang dapat melakukan pengamatan berikut. Modul kohesif adalah modul di mana fungsi-fungsi berinteraksi di antara mereka sendiri secara intens untuk mencapai satu tujuan. Akibatnya, jika salah satu fungsi ini dihapus ke modul yang berbeda, kopling akan meningkat karena fungsi sekarang akan berinteraksi di dua modul yang berbeda.
Klasifikasi Kopling
Kopling antara dua modul menunjukkan tingkat saling ketergantungan di antara mereka. Secara intuitif, jika dua modul bertukar data dalam jumlah besar, maka mereka sangat saling bergantung atau digabungkan. Kita dapat menyatakan konsep ini secara bergantian sebagai berikut. Tingkat kopling antara dua modul tergantung pada kompleksitas antarmuka mereka. Kompleksitas antarmuka ditentukan berdasarkan jumlah parameter dan kompleksitas parameter yang dipertukarkan saat satu modul memanggil fungsi modul lainnya.
Mari kita sekarang mengklasifikasikan berbagai jenis kopling yang ada di antara dua modul. Di
antara dua modul yang berinteraksi, salah satu dari lima jenis kopling berikut dapat ada. Jenis kopling yang berbeda ini, dalam urutan tingkat keparahannya yang meningkat juga telah ditunjukkan pada Gambar 5.5.
Gambar 5.5 Klasifikasi kopling.
Kopling data: Dua modul adalah data yang digabungkan, jika mereka berkomunikasi menggunakan item data dasar yang dilewatkan sebagai parameter di antara keduanya, mis.
integer, float, karakter, dll. Item data ini harus terkait dengan masalah dan tidak digunakan untuk tujuan kontrol.
• Kopling stempel: Dua modul digabungkan stempel, jika mereka berkomunikasi menggunakan item data komposit seperti catatan dalam PASCAL atau struktur dalam C.
• Kopling kontrol: Kopling kontrol ada di antara dua modul, jika data dari satu modul digunakan untuk mengarahkan urutan eksekusi instruksi di modul lain. Contoh kopling kontrol adalah flag yang diatur dalam satu modul dan diuji di modul lain.
• Kopling umum: Dua modul digabungkan secara umum, jika mereka berbagi beberapa item data global.
• Penggabungan konten: Penggabungan konten ada di antara dua modul, jika mereka berbagi kode. Artinya, lompatan dari satu modul ke kode modul lain dapat terjadi. Bahasa pemrograman tingkat tinggi modern seperti C tidak mendukung lompatan lintas modul seperti itu.
Berbagai jenis kopling ditunjukkan secara skematis pada Gambar 5.5. Tingkat penggandengan meningkat dari penyambungan data ke penyambungan konten. Kopling yang tinggi di antara modul tidak hanya membuat solusi desain sulit untuk dipahami dan dipelihara, tetapi juga meningkatkan upaya pengembangan dan juga membuat modul ini sangat sulit untuk dikembangkan secara mandiri oleh anggota tim yang berbeda.