Apa itu decoupling dan bidang pengembangan apa yang bisa diterapkan? [Tutup]

21

Saya baru-baru ini melihat decoupling sebagai topik dalam sebuah pertanyaan, dan ingin tahu apa itu dan di mana itu bisa diterapkan.

Dengan "di mana itu bisa diterapkan", maksud saya:

Apakah hanya relevan di mana bahasa yang dikompilasi seperti C dan Java terlibat?

Haruskah saya tahu / mempelajarinya sebagai pengembang web?


sumber
Akan membantu jika Anda melakukan sedikit riset dan mengajukan pertanyaan berdasarkan bagian definisi yang tidak jelas.
JeffO
2
@ Jeffe - Saya pikir dunia mendapat manfaat dari pertanyaan konsep lengkap sebanyak yang dilakukannya dari nuansa tertentu. "Mengapa langit Berwarna biru?" memungkinkan jawaban untuk mencakup konsep itu sendiri tanpa masuk ke detail ekstrim pada spesifik. Itu sebabnya saya pergi ke depan dan menanyakan pertanyaan saya tanpa penelitian.
Apa masalah spesifik yang Anda alami? Seperti berdiri sekarang, pertanyaan Anda jauh terlalu luas. Dalam bentuk ini, jawabannya pada dasarnya adalah seluruh teks Desain Terstruktur: Dasar-dasar Disiplin Program Komputer dan Desain Sistem oleh Edward Yourdon dan Larry Constantine .
Jörg W Mittag
Saya pikir jawaban di sini melakukan pekerjaan yang sempurna untuk menggambarkan konsep. Ini seperti bertanya "Apa definisi kata ini dalam kaitannya dengan pemrograman" - Lalu bagaimana kata itu terlalu luas? @ GlenH7
1
@ jt0dd saya harus setuju. Hanya karena Anda dapat menjelaskan sesuatu dengan buku, bukan berarti tidak ada nilai dalam jawaban yang lebih ringkas. Dengan literatur pemrograman, orang sering membanjiri Anda dengan detail sebelum memberikan ikhtisar tingkat yang lebih baik. "Apa itu OOP?" akan terlalu luas. Tapi ini adalah topik IMO yang cukup spesifik.
Erik Reppen

Jawaban:

57

'Coupling' adalah istilah yang menggambarkan hubungan antara dua entitas dalam sistem perangkat lunak (biasanya kelas).

Ketika suatu kelas menggunakan kelas lain, atau berkomunikasi dengannya, itu dikatakan 'bergantung' pada kelas lain, dan karenanya kelas-kelas ini 'digabungkan'. Setidaknya salah satu dari mereka 'tahu' tentang yang lain.

Idenya adalah bahwa kita harus mencoba menjaga sambungan antara kelas dalam sistem kita sebagai 'longgar' mungkin: maka 'lepas kopling' atau kadang-kadang 'decoupling' (walaupun dalam bahasa Inggris 'decoupling' akan berarti 'tidak ada kopling sama sekali', orang-orang sering menggunakannya untuk menyiratkan 'lepas kopling' antara entitas).

Jadi: dalam praktiknya apa yang longgar-lepas versus kuat, dan mengapa kita harus membuat entitas longgar?


Coupling menggambarkan tingkat ketergantungan antara satu entitas dengan entitas lainnya. Seringkali kelas atau objek.

Ketika ClassA sangat bergantung pada ClassB, kemungkinan ClassA terpengaruh ketika ClassB diubah sangat tinggi. Ini adalah kopling yang kuat.

Namun jika ClassA sedikit tergantung pada ClassB, maka kemungkinan ClassA terpengaruh dengan cara apa pun oleh perubahan kode ClassB, rendah. Ini adalah kopling longgar, atau hubungan 'dipisahkan'.

Kopling longgar baik karena kami tidak ingin komponen sistem kami sangat bergantung satu sama lain. Kami ingin menjaga sistem tetap modular, di mana kami dapat dengan aman mengubah satu bagian tanpa memengaruhi yang lain.

Ketika dua bagian secara longgar digabungkan, mereka lebih independen satu sama lain dan lebih kecil kemungkinannya untuk patah ketika bagian lainnya berubah.

Misalnya, saat membuat mobil, Anda tidak akan menginginkan perubahan internal pada mesin untuk memecahkan sesuatu di setir.

Meskipun ini tidak akan pernah terjadi secara tidak sengaja ketika membuat mobil, hal serupa terjadi pada programmer setiap saat. Kopling longgar dimaksudkan untuk mengurangi risiko hal-hal seperti itu terjadi.

Kopling yang kuat biasanya terjadi ketika entitas A tahu terlalu banyak tentang entitas B. Jika entitas A membuat terlalu banyak asumsi tentang bagaimana entitas B beroperasi atau bagaimana ia dibangun, maka ada risiko tinggi bahwa perubahan dalam entitas B akan memengaruhi entitas A. Ini adalah karena salah satu anggapan tentang entitas B sekarang salah.

Sebagai contoh, bayangkan bahwa sebagai pengemudi, Anda akan membuat asumsi tertentu tentang bagaimana mesin mobil Anda bekerja.

Pada hari Anda membeli mobil baru dengan mesin yang bekerja secara berbeda (atau karena alasan tertentu mesin Anda diganti), asumsi Anda sebelumnya akan salah. Jika Anda kode di komputer, Anda sekarang akan menjadi kode yang salah yang tidak berfungsi dengan baik.

Namun, jika semua asumsi bahwa sebagai pengemudi Anda membuat mobil adalah: A- mereka memiliki roda kemudi dan B- mereka memiliki pedal rem dan gas, daripada perubahan dalam mobil tidak akan mempengaruhi Anda, selama beberapa asumsi Anda tetap benar. Ini adalah kopling longgar.


Teknik penting untuk mencapai kopling longgar adalah Enkapsulasi. Idenya adalah bahwa kelas menyembunyikan detail internal dari kelas lain, dan menawarkan antarmuka yang didefinisikan secara ketat untuk kelas lain untuk berkomunikasi dengannya.

Jadi misalnya, jika Anda mendefinisikan kelas Mobil, itu antarmuka (metode umum) mungkin akan menjadi drive(), stop(), steerLeft(), steerRight(), getSpeed(). Ini adalah metode yang dapat digunakan benda lain pada objek Mobil.

Semua detail lain dari kelas Mobil: bagaimana mesin bekerja, jenis bahan bakar yang digunakannya, dll. Disembunyikan dari kelas lain - untuk mencegah mereka mengetahui terlalu banyak tentang Mobil.

Saat kelas A tahu terlalu banyak tentang kelas B: kami memiliki hubungan yang sangat berpasangan, di mana kelas A terlalu bergantung pada kelas B dan perubahan pada kelas B cenderung memengaruhi kelas A. Membuat sistem sulit untuk diperluas dan dipelihara.

Hubungan antara dua entitas, di mana mereka tahu sedikit tentang satu sama lain (hanya apa yang diperlukan) - adalah hubungan yang longgar, atau terpisah.

Aviv Cohn
sumber
3

Decoupling pada umumnya adalah tentang melihat apakah dua hal perlu bekerja sama secara erat atau dapat dibuat lebih mandiri. Kemerdekaan itu hebat karena hal-hal itu mudah diubah atau digunakan di tempat lain. Decoupling dapat diterapkan di banyak bidang, tidak hanya pengembangan, dan ini terutama berlaku untuk decoupling temporal, yang bahkan dapat diterapkan dalam kehidupan sehari-hari Anda (sampai batas tertentu). Juga mencatat, ada banyak jenis sambungan dalam pengembangan perangkat lunak untuk dipertimbangkan, dan tidak semua akan dibahas dalam jawabannya. Anda harus melakukan riset.

Dua hal, A dan B , digabungkan jika ada ketergantungan di antara mereka. Jika A bergantung pada B, Anda dapat menggunakan B tanpa mempertimbangkan A. Jika Anda ingin menggunakan A, Anda juga harus membawa B, karena A bergantung padanya.

Dalam pengembangan perangkat lunak, biasanya, Anda tidak dapat menghapus sambungan antar komponen sepenuhnya. Decoupling dalam konteks itu biasanya berarti melonggarkan kopling yang ada. Yaitu, memastikan setiap komponen tahu sesedikit mungkin tentang komponen lain di sekitarnya.

Ini mungkin jenis kopling yang paling umum ditemukan di alam:

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = (Friend[])client.GetConnection().ExecuteCommandForResult("getFriends:" + user.Name);
     ...
}

Di sini DisplayFriends tidak perlu beroperasi secara manual dengan koneksi di belakang klien Facebook untuk mendapatkan apa yang dibutuhkannya. DisplayFriendsKelas digabungkan ke keduanya FacebookClientdan Connection. Jika FacebookClient tiba-tiba mengubah jenis koneksi yang digunakannya, aplikasi tidak akan bisa mendapatkan teman-teman Facebook lagi. Kami dapat menghapus sambungan antara kelas DisplayFriends dan Koneksi dengan meminta FacebookClient untuk menyediakan apa yang kami butuhkan untuk kami.

//Inside a class meant to display info for a particular Facebook user.
void DisplayFriends(FacebookUser user, FacebookClient client)
{
     Friend[] = client.GetFriends(user);
     ...
}

Sekarang kami tidak terlalu peduli bagaimana FacebookClient mendapatkan teman-teman kami. Yang benar-benar kita pedulikan adalah kenyataan bahwa itu membuat mereka. Setiap perubahan yang dibawa ke perilaku internal tidak akan merusak kelas kita sendiri.

Jenis decoupling ini dapat dengan mudah dicapai dengan mengikuti Hukum Demeter untuk fungsi, yang mengatakan (mengutip Wikipedia):

Hukum Demeter untuk fungsi mensyaratkan bahwa metode m suatu objek O hanya dapat memanggil metode dari jenis objek berikut ini:

  • O sendiri
  • parameter m
  • Setiap objek yang dibuat / dipakai dalam m
  • Objek komponen langsung O
  • Variabel global, dapat diakses oleh O, dalam lingkup m

Karena saya menyebutkan tentang penggabungan waktu pada awal jawaban, saya akan segera menjelaskannya.

Temporal coupling biasanya dipertimbangkan ketika merancang aplikasi yang menjalankan algoritma secara paralel. Pertimbangkan dua unit yang dapat dieksekusi (baik itu instruksi aktual, metode, atau apa pun yang Anda ingin anggap sebagai unit), A dan B. Kami mengatakan A untuk sementara digabungkan ke B jika B harus dieksekusi sebelum A dieksekusi. Jika A tidak sementara digabungkan ke B, A dan B dapat dieksekusi pada saat yang sama. Bangun contoh Anda sendiri untuk yang satu ini: pikirkan hal-hal biasa yang Anda lakukan dalam kehidupan sehari-hari. Adakah dua hal yang Anda lakukan satu demi satu, tetapi Anda bisa melakukannya pada saat yang sama?

Akhirnya, untuk menjawab bagian terakhir Anda:

Haruskah saya tahu / mempelajarinya sebagai pengembang web?

Iya. Sebagai contoh, salah satu pola desain paling populer untuk pengembangan web (MVC) adalah semua tentang decoupling.


sumber
1

Jawaban lain melakukan pekerjaan yang baik untuk menggambarkan apa decoupling itu Saya ingin membahas pertanyaan terakhir Anda.

Haruskah saya tahu / mempelajarinya sebagai pengembang web?

Jawabannya adalah ya tegas. Tidak masalah apa pun pengembang Anda. Anda bisa menjadi pengembang web atau pengembang sistem tertanam.

Katakanlah Anda memiliki kelas yang menghasilkan URL khusus yang ditempatkan di halaman web Anda. Anda mungkin tergoda untuk membuat kelas menulis URL langsung ke halaman, menempatkannya di href tag. Ini mungkin tampak lebih sederhana pada awalnya. Tetapi apa yang terjadi ketika Anda perlu membuat perubahan untuk meletakkan tautan di email dan mengirimkannya ke pengguna? Kode Anda saat ini tidak berfungsi karena generator URL Anda tergabung erat dengan kerangka kerja web yang Anda gunakan.

Opsi yang lebih baik adalah memiliki kelas generator URL yang mengembalikan URL sebagai string. Ini dapat digunakan oleh kode web Anda dan juga dapat digunakan oleh kode email Anda. Mungkin tampak lebih banyak pekerjaan dimuka untuk memiliki kode dipisahkan, tetapi upaya membayar sendiri dari waktu ke waktu.

Memiliki kode yang termodulasi dan dipisahkan akan membuat kode Anda lebih mudah dimengerti, lebih dapat diuji, dan lebih dapat dipelihara, tidak peduli apa pun domain pemrograman tempat Anda bekerja.

epotter
sumber
Setelah ini dan dua jawaban lainnya, saya benar-benar mendapatkan ini dan melihat bagaimana saya bisa menggunakannya.