Saya memiliki ujian pola perangkat lunak minggu ini dan salah satu topik yang akan kami pelajari adalah kopling Efferent dan Afferent.
Saya mengerti sebuah paket memiliki Ce tinggi (efferent coupling) jika tergantung pada sejumlah tipe lainnya.
Sebagai contoh:
class Car{
Engine engine;
Wheel wheel;
Body body;
}
Kelas ini akan memiliki kopling eferen yang tinggi karena tergantung pada tipe Mesin, Roda, dan Tubuh.
Sedangkan jenis "Roda" akan memiliki Ca tinggi (kopling aferen) jika beberapa paket lain bergantung padanya (Mobil, Pesawat, Sepeda).
Salah satu pertanyaan yang mungkin pada ujian kami adalah, kapan Efferent / Afferent coupling baik atau buruk? Ini nampak aneh bagi saya karena secara logis suatu program akan membutuhkan paket / kelas dengan kopling Efferent / Afferent yang tinggi.
Adakah yang punya contoh kapan / di mana kopling eferen atau aferen tinggi baik / buruk ??
Terima kasih!
sumber
Jawaban:
Kopling aferen paling mudah dapat dinilai dalam hal berapa banyak rasa sakit yang disebabkan / diselamatkan karena perubahan kebutuhan atau kemungkinan. Sebagai contoh, ambil kelas roda Anda dan katakanlah banyak modul lain menggunakannya untuk membangun berbagai jenis kendaraan. Jika kelas roda sangat stabil, maka kopling aferen ini bermanfaat karena kendaraan membutuhkan roda dan mereka menggunakan yang andal. Jika, di sisi lain, kelas roda mudah berubah dalam hal perawatan, kopling aferen ini akan menjadi titik kesakitan saat Anda memperkenalkan perubahan yang berulang-ulang ke banyak kode.
Efferent coupling serupa dalam konsep, tetapi Anda akan melihat proposisi nilai yang sedikit berbeda. Jika Anda memiliki kelas mobil yang bergantung langsung pada banyak bagian individu (bukan hanya untuk mengatakan "Mesin" dan "Chassis", dan mereka terdiri dari sub-bagian lain), kelas tersebut mungkin melakukan banyak hal dan karenanya dapat menjadi bottleneck perawatan. Perubahan pada kelas itu cenderung sulit dan berisiko karena kerumitannya. Di sisi lain, jika sambungan eferen tinggi, tetapi sebenarnya cukup kohesif dan jelas, maka Anda tidak memiliki hierarki objek dan hubungan yang perlu dikhawatirkan.
Ketika datang ke arsitektur / desain, apa yang Anda benar-benar harus pertimbangkan adalah pengorbanan yang cukup banyak dan metrik ini tidak berbeda. Jika Anda ingin mengetahui contoh sesuatu yang baik atau buruk, mainkan permainan "bagaimana jika". Bayangkan sebuah contoh dan katakan "bagaimana jika saya ingin melakukan X - berapa banyak yang akan mengisap?" Untuk X di mana jawabannya adalah "banyak," Anda memiliki kelemahan dan untuk X di mana jawabannya adalah "itu sebenarnya sangat mudah" Anda memiliki keunggulan.
sumber
Berbicara secara umum, sambungan longgar:
positif : melindungi sebagian sistem dari perubahan pada sesuatu yang bergantung padanya (kopling aferen)
negatif : hubungan mungkin lebih sulit untuk dipahami
Sebagai contoh, jika saya sedang mengembangkan sistem yang mengandalkan HTTTP, saya akan memutuskan apakah saya perlu memasangkan HTTP secara ketat atau longgar. Jika saya berpikir bahwa sistem itu kemungkinan akan beralih ke protokol yang berbeda, saya dapat memilih untuk secara bebas berpasangan dengannya, sementara jika saya menerima bahwa HTTP adalah protokol saya, saya dapat dengan ketat memasangkannya ke protokol itu untuk kesederhanaan dalam memahami.
Pertimbangkan bahwa beberapa kompleksitas di WS * dalam decoupling dari HTTP sebagai protokol.
sumber
Aferen
Jika sesuatu menggunakan banyak hal yang berbeda (jumlah kopling aferen yang tinggi), maka mungkin akan mudah pecah jika ada yang berubah.
Ketidakstabilan = 1
Eferen
Jika sesuatu digunakan oleh banyak hal yang berbeda (tingginya jumlah efferent coupling), maka itu bisa cenderung merusak banyak hal jika itu berubah.
Ketidakstabilan = 0
Stabilitas
Definisi Martin tentang "stabilitas" adalah campuran eksotis antara "sulit untuk berubah" dan "memiliki beberapa alasan untuk berubah". Namun metrik ketidakstabilannya hanya menggambarkan "kesulitan untuk berubah". "Alasan untuk berubah" akan lebih banyak berkaitan dengan faktor-faktor yang tidak dapat dengan mudah dihitung, seperti hanya mendesain antarmuka Anda secara tepat, pada tingkat abstraksi yang tepat, dan memahami persyaratan pengguna akhir secara lebih jelas.
Kopling eferen yang sangat tinggi dengan kopling aferen yang rendah menghasilkan stabilitas (seperti dalam sesuatu yang sulit diubah karena akan merusak banyak hal), sebaliknya menghasilkan ketidakstabilan (seperti dalam sesuatu yang mudah diubah karena tidak akan merusak banyak barang) .
Sejumlah besar kopling aferen bisa menjadi indikator bahwa desain Anda kurang fokus - menggunakan banyak hal yang berbeda jadi mungkin tidak memiliki tanggung jawab yang jelas dan tunggal.
Sejumlah besar kopling eferen pada awalnya dapat diartikan sebagai hal yang sangat baik, karena ini menunjukkan bahwa desain Anda sedang digunakan secara luas. Namun itu akan buruk jika Anda merasa tergoda untuk sering mengubah desain dengan cara yang merusak segalanya. Jadi dengan sejumlah besar kopling eferen datang kebutuhan untuk paket tersebut memiliki "sedikit atau tidak ada alasan untuk berubah". Desain harus stabil dalam arti ideal tidak memiliki alasan untuk berubah, karena mereka juga akan sangat sulit untuk diubah.
Prinsip Abstraksi Yang Stabil
Konsep seperti inversi ketergantungan (yang secara alami membutuhkan injeksi ketergantungan) dan SAP (prinsip abstraksi yang stabil) semuanya menunjukkan bahwa dependensi mengalir ke arah abstraksi. Dan ada alasan sederhana mengapa ketika mempertimbangkan "stabilitas" dalam konteks memiliki "beberapa alasan untuk berubah". Antarmuka abstrak tidak menyebutkan detail konkret, hanya berfokus pada "apa yang harus dilakukan" dan bukan "apa yang ada", dan dengan demikian memiliki lebih sedikit alasan untuk berubah. Port grafis yang dipercepat di motherboard kami (antarmuka abstrak) memiliki lebih sedikit alasan untuk menjalani perubahan desain daripada GPU yang dihubungkan ke dalamnya (detail konkret).
Dapat digunakan kembali vs digunakan kembali
Jenis metrik pribadi saya sendiri jika saya dapat menyarankan satu yang agak bertabrakan dengan Martin adalah gagasan ini saya ingin menekankan bahwa perpustakaan yang paling dapat digunakan kembali harus berusaha untuk menggunakan kembali kode lain secara minimal. Itu mendorong ketidakstabilan menuju angka 0. Ini karena alasan praktis memiliki alasan minimum untuk berubah, tetapi juga untuk mempromosikan perpustakaan termudah untuk digunakan. Perpustakaan tujuan umum dan banyak digunakan yang bergantung pada selusin perpustakaan yang berbeda memiliki banyak alasan untuk berubah, serta distribusi yang dibuat dengan canggung yang mungkin sulit untuk digunakan. Perbedaannya di sini adalah bahwa "alasan untuk berubah" dalam kasus saya meluas bahkan ke implementasi, karena itu datang dari tampilan berorientasi perpustakaan yang berusaha untuk merilis versi stabil perpustakaan. Martin mungkin mengabaikan implementasi sebagai bagian yang sangat terpisah,
Dari sudut pandang distribusi, implementasi dan antarmuka kabur bersama untuk menghasilkan dependensi pengguna ke pustaka yang stabil atau tidak stabil. Dari sudut pandang antarmuka, hanya antarmuka yang digunakan dan detail implementasi yang terkait sepenuhnya terpisah.
sumber