Apa itu "kopling longgar?" Tolong berikan contoh

172

Sepertinya saya tidak bisa memahami konsep "longgar." Saya kira itu tidak membantu bahwa kata "longgar" biasanya memiliki konotasi negatif, jadi saya selalu lupa bahwa pemasangan longgar adalah hal yang baik .

Apakah seseorang tolong tunjukkan beberapa kode "sebelum" dan "setelah" (atau pseudocode) yang menggambarkan konsep ini?

trebormf
sumber
Saya tidak yakin bagaimana ini dapat dipisahkan dari bahasa tertentu karena bagian dari konsepnya adalah bagaimana seseorang menggunakan bahasa untuk menjaga unit kode agar tidak terjerat satu sama lain. Saya juga mencatat bahwa beberapa jawaban menggunakan kode untuk menggambarkan konsep.
Onorio Catenacci
11
Tidak setuju sepenuhnya, kepraktisannya dapat diilustrasikan secara berbeda dalam bahasa yang berbeda, dan ini terutama terlihat dalam bahasa yang dinamis vs yang dikompilasi. Namun konsepnya sama saja.
Owen
Loose vs Tight dan Coupling vs Decoupling . Ikut serta bukanlah hal yang baik selalu, kadang baik / kadang tidak baik ... Karena kita harus memiliki kemandirian kita sendiri, begitu juga dengan kelas.
bonCodigo

Jawaban:

180

Pertimbangkan aplikasi keranjang belanja sederhana yang menggunakan kelas CartContents untuk melacak barang-barang di keranjang belanja dan kelas Pesanan untuk memproses pembelian. Pesanan perlu menentukan nilai total konten dalam keranjang, mungkin melakukannya seperti:

Contoh Digabungkan Tightly:

public class CartEntry
{
    public float Price;
    public int Quantity;
}

public class CartContents
{
    public CartEntry[] items;
}

public class Order
{
    private CartContents cart;
    private float salesTax;

    public Order(CartContents cart, float salesTax)
    {
        this.cart = cart;
        this.salesTax = salesTax;
    }

    public float OrderTotal()
    {
        float cartTotal = 0;
        for (int i = 0; i < cart.items.Length; i++)
        {
            cartTotal += cart.items[i].Price * cart.items[i].Quantity;
        }
        cartTotal += cartTotal*salesTax;
        return cartTotal;
    }
}

Perhatikan bagaimana metode OrderTotal (dan dengan demikian kelas Order) bergantung pada detail implementasi dari CartContents dan kelas CartEntry. Jika kami mencoba mengubah logika ini untuk mendapatkan diskon, kami kemungkinan harus mengubah ketiga kelas. Juga, jika kita berubah menggunakan koleksi Daftar untuk melacak item kita harus mengubah kelas Order juga.

Sekarang, inilah cara yang sedikit lebih baik untuk melakukan hal yang sama:

Contoh kurang digabungkan:

public class CartEntry
{
    public float Price;
    public int Quantity;

    public float GetLineItemTotal()
    {
        return Price * Quantity;
    }
}

public class CartContents
{
    public CartEntry[] items;

    public float GetCartItemsTotal()
    {
        float cartTotal = 0;
        foreach (CartEntry item in items)
        {
            cartTotal += item.GetLineItemTotal();
        }
        return cartTotal;
    }
}

public class Order
{
    private CartContents cart;
    private float salesTax;

    public Order(CartContents cart, float salesTax)
    {
        this.cart = cart;
        this.salesTax = salesTax;
    }

    public float OrderTotal()
    {
        return cart.GetCartItemsTotal() * (1.0f + salesTax);
    }
}

Logika yang khusus untuk implementasi item baris keranjang atau koleksi keranjang atau pesanan dibatasi hanya untuk kelas itu. Jadi kita bisa mengubah implementasi dari kelas-kelas ini tanpa harus mengubah kelas lainnya. Kita bisa mengambil decoupling ini lebih jauh dengan meningkatkan desain, memperkenalkan antarmuka, dll, tapi saya pikir Anda mengerti maksudnya.

Baji
sumber
Bisakah Anda memperluas jawaban yang memperkenalkan decoupling lebih lanjut melalui injeksi dependensi (meskipun konstruktor harus ideal)?
BAD_SEED
4
@ Wed, saya tidak melihat alasan untuk Ordermemiliki pengetahuan tentang Cart. Belanja langsung dan facturasi adalah dua konteks yang berbeda. Ketika klien siap membayar, Anda dapat memiliki proses yang bertanggung jawab untuk menerjemahkan CartEntries menjadi sesuatu yang berarti untuk Order. Dengan cara ini Orderkelas juga akan di-instanciated dan digunakan tanpa a Cart.
plalx
@Wedge Bisakah Anda bereaksi terhadap komentar saya?
plalx
Yah & cukup dijelaskan. Saya mulai melihat cahaya di ".. Perhatikan bagaimana metode OrderTotal (dan dengan demikian kelas Order) bergantung pada detail implementasi kelas CartContents dan kelas CartEntry .."
okey_on
Contoh ini disajikan dengan jelas. Namun pada hari-hari ini, semakin banyak arsitek setuju bahwa gaya berorientasi objek yang berlebihan ini adalah praktik yang buruk. Tidak ada gunanya menyembunyikan detail "implementasi" dari CartEntrydan CartContents. Karena ini memiliki makna yang sangat jelas, mereka harus dimodelkan sebagai data mati. dalam hal basis data, semua yang diperlukan di sini adalah sebuah tabelCREATE TABLE entry (price INTEGER, quantity INTEGER)
Jo So
160

Banyak produk terintegrasi (terutama oleh Apple) seperti iPod , iPads adalah contoh yang baik dari kopling ketat: sekali baterai mati Anda mungkin juga membeli perangkat baru karena baterai disolder tetap dan tidak akan lepas, sehingga membuat penggantian sangat mahal. Pemain yang digabungkan secara longgar memungkinkan penggantian baterai dengan mudah.

Hal yang sama berlaku untuk pengembangan perangkat lunak: umumnya (jauh) lebih baik memiliki kode yang digabungkan secara longgar untuk memfasilitasi ekstensi dan penggantian (dan untuk membuat bagian-bagian individual lebih mudah dimengerti). Tapi, sangat jarang, dalam keadaan khusus kopling ketat dapat menguntungkan karena integrasi ketat beberapa modul memungkinkan untuk optimasi yang lebih baik.

Konrad Rudolph
sumber
Apakah kopling longgar atau kencang baik? Bagaimana cara memutuskan untuk menerapkan kopling longgar atau kopling ketat?
Sreekanth Karumanaghat
2
terima kasih atas contoh yang bagus ini. saya menghabiskan banyak waktu untuk jawaban lain tetapi tidak layak seperti ini
alamin
1
Sreekanth Karumanaghat, apakah Anda lebih suka menghabiskan lebih sedikit uang hanya untuk baterai dan memiliki iPod yang berfungsi lagi atau Anda lebih suka menghabiskan banyak uang untuk seluruh iPod?
Koshera
1
@SreekanthKarumanaghat Biasanya kopling longgar lebih baik karena mempromosikan modularitas dan dengan demikian membuat kode lebih mudah dipelihara. Jika Anda secara ketat memasangkan kelas / pustaka / kode Anda, maka setiap perubahan kecil yang Anda buat dalam satu kelas harus diterapkan di semua kelas yang menggunakannya.
Kenny Worden
56

Saya akan menggunakan Java sebagai contoh. Katakanlah kita memiliki kelas yang terlihat seperti ini:

public class ABC
{
   public void doDiskAccess() {...}
}

Ketika saya memanggil kelas, saya perlu melakukan sesuatu seperti ini:

ABC abc = new ABC();

abc. doDiskAccess();

Sejauh ini baik. Sekarang katakanlah saya memiliki kelas lain yang terlihat seperti ini:

public class XYZ
{
   public void doNetworkAccess() {...}
}

Itu terlihat persis sama dengan ABC, tetapi katakanlah itu berfungsi melalui jaringan bukan pada disk. Jadi sekarang mari kita menulis program seperti ini:

if(config.isNetwork()) new XYZ().doNetworkAccess();
else new ABC().doDiskAccess();

Itu bekerja, tapi agak sulit. Saya dapat menyederhanakan ini dengan antarmuka seperti ini:

public interface Runnable
{
    public void run();
}

public class ABC implements Runnable
{
   public void run() {...}
}

public class XYZ implements Runnable
{
   public void run() {...}
}

Sekarang kode saya dapat terlihat seperti ini:

Runnable obj = config.isNetwork() ? new XYZ() : new ABC();

obj.run();

Lihat seberapa bersih dan lebih sederhana untuk memahami itu? Kami baru saja memahami prinsip dasar pertama dari kopling longgar: abstraksi. Kunci dari sini adalah untuk memastikan bahwa ABC dan XYZ tidak bergantung pada metode atau variabel apa pun dari kelas yang memanggil mereka. Itu memungkinkan ABC dan XYZ menjadi API yang sepenuhnya independen. Atau dengan kata lain, mereka "dipisahkan" atau "longgar digabungkan" dari kelas induk.

Tetapi bagaimana jika kita membutuhkan komunikasi antara keduanya? Nah, maka kita dapat menggunakan abstraksi lebih lanjut seperti Model Peristiwa untuk memastikan bahwa kode induk tidak perlu dipasangkan dengan API yang telah Anda buat.

64BitBob
sumber
2
Contoh ini masih memiliki tingkat kopling yang cukup tinggi. Baru saja alih-alih digabungkan ke satu kelas, ada dua untuk dipilih. Contoh ini mengasumsikan hanya akan ada dua implementasi "Runnable" yang tersedia. Dalam hal ini antarmuka bahkan tidak diperlukan.
Owen
Metode bernama Run * and Do * ini adalah bau kode besar bagi saya. Anda sebaiknya memperbaiki ini menggunakan IHandleStuff atau IFrobnicateThings. Runnable adalah istilah yang terlalu umum untuk kasus ini.
Wedge
8
Owen, sayang langkah teman saya. Jika dia tidak mengerti pemasangan, bagaimana dia akan mengerti apa yang dibeli pola pabrik padanya? Contoh kode ini menempatkannya di jalur yang benar. Maksudnya adalah bahwa ia akan lebih memahami masalah dan menyadari bagaimana cara mengabstraksi penciptaan objek.
64BitBob
6
Apakah ini akan lebih mudah dibaca jika ABC dan XYZ diubah namanya menjadi DiskAccessordan NetworkAccessor? Saya tidak tahu java ...
MusiGenesis
Apakah itu juga menggunakan pola desain pabrik? Karena kami membuat objek XYZ atau ABC baru tergantung kebutuhan.
munmunbb
37

Maaf, tapi "kopling longgar" bukan masalah pengkodean, ini masalah desain. Istilah "pelonggaran longgar" terkait erat dengan keadaan "kohesi tinggi" yang diinginkan, berlawanan tetapi saling melengkapi.

Loose coupling berarti bahwa elemen desain individu harus dibangun sehingga jumlah informasi yang tidak perlu yang perlu mereka ketahui tentang elemen desain lainnya berkurang.

Kohesi tinggi adalah semacam "ikatan ketat", tetapi Kohesi tinggi adalah keadaan di mana elemen desain yang benar-benar perlu diketahui satu sama lain dirancang agar mereka bekerja bersama secara bersih dan elegan.

Intinya adalah, beberapa elemen desain harus mengetahui detail tentang elemen desain lainnya, sehingga mereka harus dirancang seperti itu, dan tidak secara tidak sengaja. Elemen desain lain tidak boleh tahu detail tentang elemen desain lain, jadi elemen itu harus dirancang dengan cara itu, sengaja, dan bukan secara acak.

Menerapkan ini dibiarkan sebagai latihan untuk pembaca :).

David M. Karr
sumber
33

Kode digabungkan ketat bergantung pada implementasi konkret. Jika saya membutuhkan daftar string dalam kode saya dan saya menyatakannya seperti ini (di Jawa)

ArrayList<String> myList = new ArrayList<String>();

maka saya bergantung pada implementasi ArrayList.

Jika saya ingin mengubahnya menjadi kode yang digabungkan secara longgar, saya menjadikan referensi saya tipe antarmuka (atau abstrak lainnya).

List<String> myList = new ArrayList<String>();

Ini mencegah saya memanggil metode apa punmyList yang khusus untuk implementasi ArrayList. Saya terbatas hanya pada metode-metode yang didefinisikan dalam antarmuka Daftar. Jika nanti saya memutuskan bahwa saya benar-benar membutuhkan LinkedList, saya hanya perlu mengubah kode saya di satu tempat, tempat saya membuat Daftar baru, dan bukan di 100 tempat di mana saya membuat panggilan ke metode ArrayList.

Tentu saja, Anda dapat membuat Instanate ArrayList menggunakan deklarasi pertama dan menahan diri dari tidak menggunakan metode apa pun yang bukan bagian dari antarmuka Daftar, tetapi menggunakan deklarasi kedua membuat kompilator membuat Anda jujur.

Bill the Lizard
sumber
Ini hampir tidak berkaitan dengan apa yang "kopling" sebenarnya adalah . Lihat stackoverflow.com/questions/39946/coupling-and-cohesion untuk beberapa jawaban yang bagus.
Rogério
@Ogerio: Saya pikir ini berhubungan. Mungkin Anda bingung dengan definisi lain "kopling" tetapi Anda harus membaca Kopling longgar . "Kopling kuat terjadi ketika kelas dependen berisi pointer langsung ke kelas beton yang menyediakan perilaku yang diperlukan ... Kopling longgar terjadi ketika kelas dependen hanya berisi pointer ke antarmuka, yang kemudian dapat diimplementasikan oleh satu atau banyak kelas beton . " Dalam contoh saya, kode saya akan secara bebas digabungkan ke ArrayList melalui antarmuka Daftar.
Bill the Lizard
@ Bill: Terima kasih atas tautannya, tetapi artikel itu tampaknya sepenuhnya palsu bagi saya. Tampaknya "menafsirkan kembali" ide-ide dari domain lain (perilaku organisasi), memberikan definisi "pelepasan longgar" yang bertentangan dengan definisi spesifik perangkat lunak asli oleh Larry Constantine: en.wikipedia.org/wiki/Coupling_(computer_science) .
Rogério
@Rogerio: Makalah Constantine ditulis pada tahun 1974. Kemungkinan besar banyak penafsiran ulang telah berlangsung dalam 36 tahun terakhir, tetapi saya tidak berpikir bahwa artikel Wikipedia adalah sumbernya. Sebagai contoh, pola seperti Dependency Injection mengandalkan antarmuka untuk melonggarkan kopling seperti yang saya jelaskan dalam jawaban saya.
Bill the Lizard
2
@ Bill: Tentu, pekerjaan Constantine pada Desain Terstruktur adalah hal-hal lama, tapi saya gagal melihat alasan untuk membatalkan atau menafsirkannya secara radikal. Konsep asli kohesi dan penggandengan merupakan inti dari Desain Berorientasi Objek, seperti halnya warisan dan polimorfisme. DI (artikel yang lebih baik adalah martinfowler.com/articles/injection.html ) hanyalah teknik untuk konfigurasi eksternal plug-in (antarmuka abstrak dengan implementasi yang dipilih saat runtime melalui kode konfigurasi); Teknik lain yang serupa adalah pola Service Locator. DI dan kopling adalah konsep independen.
Rogério
27

Tingkat perbedaan antara jawaban di sini menunjukkan mengapa itu akan menjadi konsep yang sulit untuk dipahami tetapi untuk membuatnya sesederhana yang saya bisa gambarkan:

Agar saya tahu bahwa jika saya melempar bola kepada Anda, maka Anda dapat menangkapnya, saya benar-benar tidak perlu tahu berapa usia Anda. Saya tidak perlu tahu apa yang Anda makan untuk sarapan, dan saya benar-benar tidak peduli siapa orang pertama yang Anda sukai. Yang perlu saya ketahui adalah Anda bisa menangkapnya. Jika saya tahu ini, maka saya tidak peduli jika Anda, saya melemparkan bola kepada Anda atau saudara Anda.

Dengan bahasa non-dinamis seperti c # atau Java dll, kami menyelesaikan ini melalui Antarmuka. Jadi katakanlah kita memiliki antarmuka berikut:

public ICatcher
{
   public void Catch();
}

Dan sekarang katakanlah kita memiliki kelas berikut:

public CatcherA : ICatcher
{
   public void Catch()
   {
      console.writeline("You Caught it");
   }

}
public CatcherB : ICatcher
{
   public void Catch()
   {
      console.writeline("Your brother Caught it");
   }

}

Sekarang CatcherA dan CatcherB mengimplementasikan metode Catch, sehingga layanan yang membutuhkan Catcher dapat menggunakan keduanya dan tidak benar-benar peduli. Jadi layanan yang digabungkan secara ketat mungkin secara langsung memulai contoh yang tertangkap

public CatchService
{
   private CatcherA catcher = new CatcherA();

   public void CatchService()
   {
      catcher.Catch();
   }

}

Jadi CatchService dapat melakukan apa yang telah ditetapkan untuk dilakukan, tetapi menggunakan CatcherA dan akan selalu menggunakan CatcherA. Keras dikodekan, jadi tetap di sana sampai seseorang datang dan refactor itu.

Sekarang mari kita ambil opsi lain, yang disebut injeksi ketergantungan:

public CatchService
{
   private ICatcher catcher;

   public void CatchService(ICatcher catcher)
   {
      this.catcher = catcher;
      catcher.Catch();
   }
}

Jadi teman-teman yang berhubungan dengan CatchService dapat melakukan hal berikut:

CatchService catchService = new CatchService(new CatcherA());

atau

CatchService catchService = new CatchService(new CatcherB());

Ini berarti bahwa layanan Catch tidak digabungkan dengan CatcherA atau CatcherB.

Ada beberapa strategi lain untuk layanan kopling longgar seperti ini seperti penggunaan kerangka kerja IOC dll.

Owen
sumber
1
Saya suka contoh ini lebih baik daripada yang lain, karena hal semacam ini terjadi di dunia bisnis setiap hari. Jika Class Person berjalan, Kelas Cat berjalan, Kelas Dog berjalan, dll. Ini akan menjadi program besar untuk merinci semua kelas yang berjalan. Tetapi menggunakan antarmuka yang disebut berjalan, di mana setiap kelas melakukan hal yang sama, membuat program Anda jauh lebih fleksibel dan mudah dikelola. :)
sksallaj
Dijelaskan dengan sangat baik, hanya untuk menghapus dalam contoh terakhir Anda melakukannya dengan injeksi ketergantungan, dan contoh pertama juga longgar digabungkan?
Ali Sajid
Wow, jawaban lama dikomentari :). Jadi jawabannya tidak, contoh pertama memiliki ketergantungan yang kuat pada CatcherA sehingga mereka sangat berpasangan
Owen
23

Anda dapat menganggap kopling (ketat atau longgar) sebagai jumlah usaha yang diperlukan untuk memisahkan kelas tertentu dari ketergantungannya pada kelas lain. Sebagai contoh, jika setiap metode di kelas Anda memiliki sedikit blok akhirnya di bagian bawah di mana Anda membuat panggilan ke Log4Net untuk mencatat sesuatu, maka Anda akan mengatakan kelas Anda sangat erat dengan Log4Net. Jika kelas Anda berisi metode pribadi yang disebut LogSomething yang merupakan satu-satunya tempat yang disebut komponen Log4Net (dan metode lain semuanya disebut LogSomething sebagai gantinya), maka Anda akan mengatakan bahwa kelas Anda secara longgar digabungkan ke Log4Net (karena itu tidak akan memakan banyak waktu upaya untuk mengeluarkan Log4Net dan menggantinya dengan yang lain).

MusiGenesis
sumber
1
Jadi, "longgar digabungkan" sebenarnya berarti lebih sedikit ketergantungan? Apakah saya benar?
user314362
4
Ini tidak benar-benar terkait dengan jumlah total dependensi yang dimiliki satu kelas tertentu. Coupling (ketat atau longgar) sebenarnya adalah properti dari hubungan antara dua kelas. Jadi, Anda mungkin memiliki satu kelas yang secara longgar digabungkan ke 100 kelas lainnya, atau kelas lain yang digabungkan secara ketat menjadi hanya 2 kelas lainnya (misalnya).
MusiGenesis
2
Contoh buruk, saya akan mengatakan: apa yang Anda miliki adalah duplikasi kode, bukan kopling ketat. Dan dengan alat refactoring yang baik, duplikasi seperti itu dapat dihilangkan dalam hitungan detik.
Rogério
@Ogerio: itu mungkin bukan contoh terbaik. Saya suka 64BitBobjawaban yang lebih baik, saya sendiri.
MusiGenesis
12

Definisi

Pada dasarnya, kopling adalah seberapa banyak objek atau set objek tertentu bergantung pada objek lain atau set objek lain untuk menyelesaikan tugasnya.

Kopling Tinggi

Pikirkan mobil. Agar mesin menyala, kunci harus dimasukkan ke dalam kunci kontak, dihidupkan, bensin harus ada, percikan harus terjadi, piston harus menyala, dan mesin harus hidup. Bisa dibilang bahwa mesin mobil sangat digabungkan ke beberapa objek lainnya. Ini kopling tinggi, tapi itu bukan hal yang buruk.

Kopling longgar

Pikirkan kontrol pengguna untuk halaman web yang bertanggung jawab untuk memungkinkan pengguna memposting, mengedit, dan melihat beberapa jenis informasi. Kontrol tunggal dapat digunakan untuk membiarkan pengguna memposting informasi baru atau mengedit informasi baru. Kontrol harus dapat dibagi antara dua jalur yang berbeda - baru dan edit. Jika kontrol ditulis sedemikian rupa sehingga memerlukan beberapa jenis data dari halaman yang akan berisi itu, maka Anda bisa mengatakan itu terlalu tinggi digabungkan. Kontrol seharusnya tidak memerlukan apa pun dari halaman wadahnya.

Tom
sumber
7

Ini adalah konsep yang cukup umum, jadi contoh kode tidak akan memberikan gambaran keseluruhan.

Seorang pria di sini di tempat kerja berkata kepada saya, "pola seperti fraktal, Anda dapat melihatnya ketika Anda memperbesar sangat dekat, dan ketika Anda memperbesar jauh ke tingkat arsitektur."

Membaca halaman wikipedia singkat dapat memberi Anda kesan umum ini:

http://en.wikipedia.org/wiki/Loose_coupling

Sejauh contoh kode spesifik ...

Berikut adalah satu kopling longgar yang baru-baru ini saya kerjakan, dari hal-hal Microsoft.Practices.CompositeUI.

    [ServiceDependency]
    public ICustomizableGridService CustomizableGridService
    {
        protected get { return _customizableGridService; }
        set { _customizableGridService = value; }
    }

Kode ini menyatakan bahwa kelas ini memiliki ketergantungan pada CustomizableGridService. Alih-alih hanya langsung merujuk implementasi yang tepat dari layanan, itu hanya menyatakan bahwa itu memerlukan BEBERAPA implementasi dari layanan itu. Kemudian pada saat runtime, sistem menyelesaikan ketergantungan itu.

Jika tidak jelas, Anda dapat membaca penjelasan yang lebih rinci di sini:

http://en.wikipedia.org/wiki/Dependency_injection

Bayangkan bahwa ABCCustomizableGridService adalah implementasi yang ingin saya hubungkan di sini.

Jika saya memilih untuk, saya dapat menarik keluar dan menggantinya dengan XYZCustomizableGridService, atau StubCustomizableGridService tanpa perubahan sama sekali ke kelas dengan ketergantungan ini.

Jika saya mereferensikan ABCCustomizableGridService secara langsung, maka saya perlu melakukan perubahan pada referensi tersebut untuk bertukar dalam implementasi layanan lain.

Nasi
sumber
6

Coupling berkaitan dengan dependensi antar sistem, yang bisa berupa modul kode (fungsi, file, atau kelas), alat dalam pipa, proses server-klien, dan sebagainya. Semakin tidak umum ketergantungannya, semakin "erat" mereka menjadi, karena mengubah satu sistem diperlukan mengubah sistem lain yang bergantung padanya. Situasi ideal adalah "lepas kopling" di mana satu sistem dapat diubah dan sistem yang bergantung padanya akan terus bekerja tanpa modifikasi.

Cara umum untuk mencapai kopling longgar adalah melalui antarmuka yang terdefinisi dengan baik. Jika interaksi antara dua sistem didefinisikan dengan baik dan ditaati di kedua sisi, maka akan lebih mudah untuk memodifikasi satu sistem sambil memastikan bahwa konvensi tidak rusak. Ini biasanya terjadi dalam prakteknya bahwa tidak ada antarmuka yang ditetapkan dengan baik, menghasilkan desain yang ceroboh dan kopling ketat.

Beberapa contoh:

  • Aplikasi tergantung pada perpustakaan. Di bawah kopling ketat, aplikasi istirahat pada versi lib yang lebih baru. Google untuk "DLL Hell".

  • Aplikasi klien membaca data dari server. Di bawah kopling ketat, perubahan ke server memerlukan perbaikan di sisi klien.

  • Dua kelas berinteraksi dalam hierarki Object-Oriented. Di bawah kopling ketat, perubahan ke satu kelas mengharuskan kelas lain diperbarui agar sesuai.

  • Beberapa alat baris perintah berkomunikasi dalam pipa. Jika dipasangkan dengan erat, perubahan ke versi satu alat baris perintah akan menyebabkan kesalahan pada alat yang membaca hasilnya.

Parappa
sumber
5

Coupling mengacu pada bagaimana kelas yang sangat berbeda terhubung satu sama lain. Kelas berpasangan ketat mengandung banyak interaksi dan dependensi.

Kelas longgar digabungkan adalah sebaliknya dalam hal ketergantungan mereka satu sama lain dijaga agar tetap minimum dan sebagai gantinya bergantung pada antarmuka publik yang didefinisikan dengan baik satu sama lain.

Lego, mainan yang SNAP bersama-sama akan dianggap longgar digabungkan karena Anda hanya bisa menjepit potongan-potongan dan membangun sistem apa pun yang Anda inginkan. Namun, puzzle memiliki potongan-potongan yang SANGAT tergabung. Anda tidak dapat mengambil bagian dari satu puzzle (sistem) dan memasukkannya ke dalam puzzle yang berbeda, karena sistem (puzzle) sangat tergantung pada potongan yang sangat spesifik yang dibangun khusus untuk "desain" tertentu. Lego dibuat dengan cara yang lebih umum sehingga dapat digunakan di Rumah Lego Anda, atau di Lego Alien Man saya.

Referensi: https://megocode3.wordpress.com/2008/02/14/coupling-and-cohesion/

pengguna1263981
sumber
4

Dua komponen sangat digabungkan ketika mereka bergantung pada implementasi konkrit satu sama lain.

Misalkan saya memiliki kode ini di suatu tempat dalam suatu metode di kelas saya:

this.some_object = new SomeObject();

Sekarang kelas saya bergantung pada SomeObject, dan mereka sangat berpasangan. Di sisi lain, katakanlah saya memiliki metode InjectSomeObject:

void InjectSomeObject(ISomeObject so) { // note we require an interface, not concrete implementation
  this.some_object = so;
}

Kemudian contoh pertama hanya dapat menggunakan SomeObject yang disuntikkan. Ini berguna selama pengujian. Dengan operasi normal, Anda dapat menggunakan kelas-kelas yang berat, menggunakan basis data, menggunakan jaringan dll. Dengan kode yang dipasangkan dengan ketat Anda tidak dapat melakukannya.

Anda dapat membuat beberapa bagian dari easer kerja ini dengan menggunakan wadah injeksi ketergantungan. Anda dapat membaca lebih lanjut tentang DI di Wikipedia: http://en.wikipedia.org/wiki/Dependency_injection .

Terkadang mudah untuk mengambil ini terlalu jauh. Pada titik tertentu Anda harus membuat hal-hal yang konkret, atau program Anda akan kurang mudah dibaca dan dimengerti. Jadi gunakan teknik ini terutama pada batas komponen, dan ketahui apa yang Anda lakukan. Pastikan Anda memanfaatkan kopling longgar. Jika tidak, Anda mungkin tidak membutuhkannya di tempat itu. DI mungkin membuat program Anda lebih kompleks. Pastikan Anda melakukan tradeoff yang baik. Dengan kata lain, pertahankan keseimbangan yang baik. Seperti biasa saat mendesain sistem. Semoga berhasil!

Paweł Hajdan
sumber
3

Pertimbangkan aplikasi Windows dengan FormA dan FormB. FormA adalah formulir utama dan menampilkan FormB. Bayangkan FormB perlu mengirimkan data kembali ke induknya.

Jika Anda melakukan ini:

class FormA 
{
    FormB fb = new FormB( this );

    ...
    fb.Show();
}

class FormB 
{
    FormA parent;

    public FormB( FormA parent )
    {
        this.parent = parent;
    }     
}

FormB sangat erat digabungkan ke FormA. FormB tidak dapat memiliki induk selain dari tipe FormA.

Jika, di sisi lain, Anda memiliki FormB mempublikasikan acara dan meminta FormA berlangganan acara tersebut, maka FormB dapat mendorong data kembali melalui acara tersebut ke pelanggan apa pun yang dimiliki acara tersebut. Dalam hal ini, FormB bahkan tidak tahu itu berbicara kembali ke induknya; melalui sambungan longgar acara menyediakan itu hanya berbicara dengan pelanggan. Jenis apa pun sekarang bisa menjadi induk dari FormA.

rp

rp.
sumber
3

Dalam ilmu komputer ada arti lain untuk "lepas kopling" bahwa tidak ada orang lain yang diposting di sini, jadi ... Ini dia - semoga Anda akan memberi saya beberapa suara sehingga ini tidak hilang di bagian bawah tumpukan! SANGAT subjek jawaban saya termasuk dalam jawaban komprehensif untuk pertanyaan ...

Istilah "Loose Coupling" pertama kali memasuki komputasi sebagai istilah yang digunakan sebagai kata sifat mengenai arsitektur CPU dalam konfigurasi multi-CPU. Istilah lawannya adalah "kopling ketat". Loose Coupling adalah ketika CPU tidak berbagi banyak sumber daya yang sama dan Tight Coupling adalah ketika mereka melakukannya.

Istilah "sistem" dapat membingungkan di sini jadi tolong uraikan situasinya dengan cermat.

Biasanya, tetapi tidak selalu, banyak CPU dalam konfigurasi perangkat keras di mana mereka ada dalam satu sistem (seperti dalam kotak "PC" individu) akan digabungkan secara ketat. Dengan pengecualian beberapa sistem berperforma sangat tinggi yang memiliki subsistem yang benar-benar berbagi memori utama di seluruh "sistem", semua sistem yang dapat dibagi secara longgar digabungkan.

Istilah Tightly Coupled dan Loosely Coupled diperkenalkan sebelum CPU multi-threaded dan multi-core diciptakan, sehingga istilah ini mungkin memerlukan beberapa teman untuk sepenuhnya mengartikulasikan situasi saat ini. Dan, memang, hari ini orang mungkin memiliki sistem yang mencakup kedua jenis dalam satu sistem keseluruhan. Mengenai sistem perangkat lunak saat ini, ada dua arsitektur umum, satu dari masing-masing varietas, yang cukup umum ini harus familliar.

Pertama, karena pertanyaannya adalah apa, beberapa contoh sistem Loosely Coupled:

  • VaxClusters
  • Linux Clusters

Sebaliknya, beberapa contoh Tightly Coupled:

  • Sistem operasi Semetrical-Multi-Processing (SMP) - mis. Fedora 9
  • CPU multi-utas
  • CPU Multi-Core

Dalam komputasi hari ini, contoh-contoh dari keduanya yang beroperasi dalam satu sistem keseluruhan tidak jarang. Sebagai contoh, ambil Pentium dual atau quad core CPU modern yang menjalankan Fedora 9 - ini adalah sistem komputasi yang sangat erat. Kemudian, gabungkan beberapa dari mereka dalam Linux Cluster yang digabungkan secara longgar dan Anda sekarang memiliki komputasi yang digabungkan secara longgar dan erat! Oh, bukankah perangkat keras modern hebat!

Richard T
sumber
3

Dalam bahasa yang sederhana, digabungkan secara longgar berarti tidak tergantung pada peristiwa lain yang terjadi. Ini dijalankan secara independen.

Ravindra Miyani
sumber
1
Itu tidak benar - seperti yang disebutkan dalam contoh lain, ini bukan tentang apakah ada atau tidak hubungan antara entitas (modul, kelas), tetapi apakah mereka dapat dengan mudah ditukar dengan kelas lain yang menerapkan fungsi yang sama. misalnya ViewModel mungkin bekerja dengan model yang berbeda, tetapi pasti tidak akan berfungsi tanpa model
Hayden Crocker
eh, tidak terlalu membantu
brgs
2

Beberapa jawaban panjang di sini. Prinsipnya sangat sederhana. Saya menyerahkan pernyataan pembukaan dari wikipedia :

"Kopling longgar menggambarkan hubungan yang kuat antara dua atau lebih sistem atau organisasi dengan semacam hubungan pertukaran.

Setiap ujung transaksi membuat persyaratannya eksplisit dan membuat beberapa asumsi tentang ujung lainnya. "

Ben Aston
sumber
1
Jika itu sangat sederhana, kami tidak akan memiliki diskusi ini.
brgs
2

Saya mengusulkan Tes Kopling Kode yang sangat sederhana :

  1. Bagian A dari kode secara erat digabungkan ke Bagian B dari kode jika ada modifikasi yang mungkin untuk Bagian B yang akan memaksa perubahan dalam Bagian A untuk menjaga kebenaran.

  2. Bagian A dari kode tidak tergabung erat dengan Bagian B dari kode jika tidak ada modifikasi yang memungkinkan untuk Bagian B yang akan membuat perubahan ke Bagian A diperlukan.

Ini akan membantu Anda memverifikasi berapa banyak kopling yang ada di antara bagian-bagian kode Anda. untuk alasan yang melihat posting blog ini: http://marekdec.wordpress.com/2012/11/14/loose-coupling-tight-coupling-decoupling-what-is-that-all-about/

Marek Dec
sumber
2

Ketika Anda membuat objek kelas menggunakan newkata kunci di beberapa kelas lain, Anda sebenarnya melakukan kopling ketat (praktik buruk) alih-alih Anda harus menggunakan kopling longgar yang merupakan praktik yang baik

--- A.java ---

package interface_package.loose_coupling;

public class A {

void display(InterfaceClass obji)
{
    obji.display();
    System.out.println(obji.getVar());
}
}

--- B.java ---

package interface_package.loose_coupling;

public class B implements InterfaceClass{

private String var="variable Interface";

public String getVar() {
    return var;
}

public void setVar(String var) {
    this.var = var;
}

@Override
public void display() {
    // TODO Auto-generated method stub
    System.out.println("Display Method Called");
}
}

--- InterfaceClass ---

package interface_package.loose_coupling;

public interface InterfaceClass {

void display();
String getVar();
}

--- MainClass ---

package interface_package.loose_coupling;

public class MainClass {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    A obja=new A();
    B objb=new B();
    obja.display(objb);     //Calling display of A class with object of B class 

}
}

Penjelasan:

Dalam contoh di atas, kami memiliki dua kelas A dan B

Kelas B mengimplementasikan Interface yaitu InterfaceClass.

InterfaceClass mendefinisikan Kontrak untuk kelas B karena InterfaceClass memiliki metode abstrak kelas B yang dapat diakses oleh kelas lain misalnya A.

Di Kelas A kami memiliki metode tampilan yang dapat kecuali objek kelas yang mengimplementasikan InterfaceClass (dalam kasus kami ini adalah kelas B). Dan pada metode objek kelas A adalah memanggil display () dan getVar () kelas B

Dalam MainClass kita telah membuat objek Kelas A dan B. Dan memanggil metode tampilan A dengan melewatkan objek kelas B yaitu objb. Metode tampilan A akan dipanggil dengan objek kelas B.

Sekarang berbicara tentang kopling longgar. Misalkan di masa depan Anda harus mengubah nama Kelas B ke ABC maka Anda tidak harus mengubah namanya dalam metode tampilan kelas B, cukup buat objek baru (kelas ABC) dan berikan kepada metode tampilan di MailClass. Anda tidak perlu mengubah apa pun di Kelas A

ref: http://p3lang.com/2013/06/loose-coupling-example-using-interface/

Abhishek Aggarwal
sumber
0

Anda dapat membaca lebih lanjut tentang konsep generik "lepas kopling" .

Singkatnya, ini adalah deskripsi hubungan antara dua kelas, di mana masing-masing kelas tahu paling sedikit tentang yang lain dan masing-masing kelas berpotensi terus bekerja dengan baik apakah yang lain ada atau tidak dan tanpa ketergantungan pada implementasi tertentu dari yang lain. kelas.

Franci Penov
sumber
-8

Kopling longgar, secara umum, adalah 2 aktor yang bekerja secara independen satu sama lain pada beban kerja yang sama. Jadi, jika Anda memiliki 2 server web menggunakan database back-end yang sama, maka Anda akan mengatakan bahwa server web tersebut secara longgar digabungkan. Kopling ketat akan dicontohkan dengan memiliki 2 prosesor pada satu server web ... prosesor tersebut tergabung erat.

Semoga itu agak membantu.

Steve
sumber
1
Saya mengerti apa yang Anda tuju, tetapi masih bukan cara yang sangat baik untuk menjelaskan bahwa penggabungan erat adalah ketika dua 'hal' saling bergantung satu sama lain, dibandingkan dengan digabungkan secara longgar ketika dua 'benda' ada secara independen - di mana satu 'benda' dapat diubah tanpa mengubah 'hal' lainnya ...
Bryan Rehbein
Steve, Anda BENAR-BENAR benar - Anda tidak berhak mendapatkan suara APA PUN. Hanya saja audiens Anda belum siap untuk terminologi Anda dan terlalu banyak di situs ini memiliki kebiasaan memilih apa yang tidak mereka mengerti atau apa yang tidak dikenal. -shrug-
Richard T
Saya pikir Steve melewatkan intinya. Kopling longgar tidak selalu menyiratkan 2 aktor bekerja secara independen pada beban kerja yang sama.
Rob