Poate cineva descrie exact diferența între cuplarea și cuplaj strâns în paradigma orientată Obiect?
Cuplaj strâns este atunci când un grup de clase sunt extrem de dependente una de alta.
Acest scenariu apare atunci când o clasă își asumă prea multe responsabilități, sau atunci când o preocupare se întinde pe mai multe clase, mai degrabă decât având propria sa clasă.
Cuplarea se realizează prin intermediul unui design care promovează single-responsabilitate și separarea de preocupări.
Un vag-cuplat clasa poate fi consumat și testate în mod independent de celelalte (beton) clase.
Interfețele sunt un puternic instrument de a utiliza pentru decuplare. Clasele pot comunica prin interfețe, mai degrabă decât alte clasele de beton, și orice clasa poate fi de la celălalt capăt al comunicării pur și simplu prin punerea în aplicare a interfeței.
Exemplu de cuplaj strâns:
class CustomerRepository
{
private readonly Database database;
public CustomerRepository(Database database)
{
this.database = database;
}
public void Add(string CustomerName)
{
database.AddRow("Customer", CustomerName);
}
}
class Database
{
public void AddRow(string Table, string Value)
{
}
}
Exemplu de cuplaj slab:
class CustomerRepository
{
private readonly IDatabase database;
public CustomerRepository(IDatabase database)
{
this.database = database;
}
public void Add(string CustomerName)
{
database.AddRow("Customer", CustomerName);
}
}
interface IDatabase
{
void AddRow(string Table, string Value);
}
class Database : IDatabase
{
public void AddRow(string Table, string Value)
{
}
}
Un alt exemplu aici.
Pălăria este "slab cuplate" pentru organism. Acest lucru înseamnă că puteți lua cu ușurință pălăria, fără a face orice modificări la persoana/corp. Când poți face asta, atunci ai "cuplaj liber". Vezi mai jos pentru elaborarea.
Cred că de pielea ta. L's-a blocat la corpul tau. Se potriveste ca o manusa. Dar ce se întâmplă dacă ai vrut să-ți schimbi culoarea pielii din alb în negru? Vă puteți imagina cât de dureros ar fi să coaja de pe piele, vopsea, și apoi lipiți-l pe spate etc? Schimbarea pielea ta este dificil, pentru că este strâns cuplat la corpul tau. Tocmai ai poate't face modificări cu ușurință. Tu ar trebui să restructura fundamental o ființă umană, în scopul de a face acest lucru posibil.
Dumnezeu nu a fost bine orientat obiect programator.
Acum cred că de a se îmbrăca dimineața. Nu't, cum ar fi albastru? Nici o problema: poti pune o cămașă roșie în loc. Puteți face acest lucru cu ușurință și fără efort pentru că tricoul nu este într-adevăr conectat la corpul tau la fel ca si pielea ta. Camasa nu't pasă și știu despre ce corpul se întâmplă. Cu alte cuvinte, poți să-ți schimbi hainele, fara a schimba corpul tau.
Ca's conceptul de bază într-o coajă de nucă.
L's important, deoarece software-ul se schimbă tot timpul. În general vorbind doriți să fie capabil de a modifica cu ușurință cod, fără a schimba codul. Știu că sună ca un oximoron, dar vă rugăm să poarte cu mine.
CSV/JSON/DB Exemple: Dacă cineva dorește lor de ieșire într-un fișier CSV, mai degrabă decât JSON, etc., sau, dacă doriți să treceți de la MySQL PostGreSQL ar trebui să fie capabil de a face aceste modificări extrem de ușor în codul dvs., fără a fi nevoie să rescrie întreaga clasă etc. Cu alte cuvinte, nu vrei să strâns câteva aplicație cu o bază de date specifică de punere în aplicare (de exemplu Mysql) sau la o anumită ieșire (de exemplu, fișiere CSV). Pentru că, după cum este inevitabilă în software-ul, schimbările vor veni. Când vor veni, l's mult mai ușor dacă părți ale codului sunt slab cuplate.
Piese auto de Exemplu: Dacă cineva vrea masina lor în negru, nu ar trebui't au de a restructura întreaga mașină, în scopul de a face asta. O mașină și piese de schimb ar fi un exemplu perfect de arhitectură slab cuplate. Dacă doriți să înlocuiți motorul cu unul mai bun, ar trebui să fie capabil de a elimina pur și simplu motorul fără prea mult efort și să-l schimb cu unul mai bun. Dacă mașina funcționează numai cu Rolls Royce 1234 Motoare și nici alte motoare de - atunci masina va este strâns cuplată la motor (Rolls Royce 1234). Ar fi mai bine dacă ai schimbat design-ul de masina ta, astfel încât acesta va lucra cu orice ** motor, așa că este un pic mai slab cuplate cu l's componente. Chiar mai bine ar fi daca masina ta ar putea funcționa fără a avea nevoie de un motor, la toate! O anumită cantitate de cuplare se va întâmpla, dar ar trebui să lucreze pentru a reduce la fel de mult ca tine poate. De ce? Pentru că atunci când cerințele de schimbare ar trebui să fie încă în măsură să livreze bun software de calitate, foarte rapid și ne-au ajutat în acest scop de cuplaj slab.
Pe scurt, cuplarea face codul mai ușor de a schimba. Răspunsurile de mai sus furnizează un cod care este în valoare de lectură în acest moment.
Re: @TimoHuovinen comentarii - conceptul de libertate de cuplare merge mână-în-mână cu conceptele de polimorfism. Dacă vă apucați de bază analogia cu un tricou/piese auto, atunci va fi gata pentru a face sens de polimorfism. Cel mai bun mod, în acest moment este de a citi codul de probe oferite de my estimabile colegii din alte răspunsuri pe acest thread. Dacă mai spun s-ar putea obține supraîncărcat cu prea multe informatii.
În proiectare orientată obiect, cantitatea de cuplare se referă la cât de mult design-ul de o clasă depinde de design-o altă clasă. Cu alte cuvinte, cât de des schimbă în clasa vigoare modificările legate în clasa B? Cuplaj strâns, cele două clase de a schimba de multe ori împreună, cuplarea înseamnă că ei sunt în mare parte independente. În general, în vrac de cuplare este recomandat, deoarece's ușor pentru a testa și de a menține.
S-ar putea găsi această lucrare de Martin Fowler (PDF) de ajutor.
În general Strâns de Cuplare este rău în dar de cele mai multe ori, deoarece reduce flexibilitatea și re-utilizare de cod, face modificări mult mai dificil, se împiedică testabilitate etc.
Strâns Cuplate Obiect este un obiect trebuie să știți destul de un pic despre fiecare alte și sunt, de obicei, depinde foarte mult de fiecare alte interfețe. Schimbarea unui obiect într-un strâns cuplate aplicație necesită adesea modificări la o serie de alte obiecte, În mica aplicatie ne putem identifica cu ușurință modificările și există mai puține șanse să pierdeți nimic. Dar, în mare, aceste aplicații inter-dependențele nu sunt întotdeauna cunoscute de către fiecare programator sau șansă este să dor de schimbări. Dar fiecare set de obiecte slab cuplate nu sunt dependentă de alții.
Pe scurt, putem spune, cuplarea este un obiectiv de proiectare, care încearcă să reducă interdependențe între componentele unui sistem, cu scopul de a reduce riscul care se schimbă într-o singură componentă va necesita schimbări în orice altă componentă. Cuplarea este mult mai generic concept destinat pentru a crește flexibilitatea unui sistem, face mai mult de întreținut, și de a face întregul cadru mai 'stabil'.
Cuplare se referă la gradul de cunoaștere directă că un element are de altul. putem spune că un exemplu: a și B, numai B își schimbă comportamentul doar atunci când O schimbare în comportamentul său. Un slab cuplate sistem poate fi ușor de descompus în elemente definibile.
Atunci când două obiecte sunt slab cuplate, ei pot interacționa dar au foarte puține cunoștințe de fiecare alte.
Slab cuplate modele care ne permit să construim flexibil OO sisteme care se pot ocupa schimba.
Observator model de design este un bun exemplu pentru a face cursuri de slab cuplate, puteți avea o privire la în Wikipedia.
Un extras din blog pe de cuplare:
Ce este Cuplaj Strâns:-
Ca par definiția de mai sus o Strâns Cuplate Obiect este un obiect care trebuie să știți despre alte obiecte și, de obicei, sunt extrem de dependente una de alta's interfețe.
Când ne-am schimba un obiect într-un strâns cuplate cererii de multe ori este nevoie de modificări la o serie de alte obiecte. Nu există nici o problemă într-o mică aplicație, putem identifica cu ușurință schimbarea. Dar în cazul unei cereri mari aceste inter-dependențele nu sunt întotdeauna cunoscute de către fiecare consumator sau alți dezvoltatori sau există mai multe șanse de schimbări viitoare.
Să ia un coș de cumpărături demo de cod pentru a înțelege strâns de cuplare:
namespace DNSLooseCoupling
{
public class ShoppingCart
{
public float Price;
public int Quantity;
public float GetRowItemTotal()
{
return Price * Quantity;
}
}
public class ShoppingCartContents
{
public ShoppingCart[] items;
public float GetCartItemsTotal()
{
float cartTotal = 0;
foreach (ShoppingCart item in items)
{
cartTotal += item.GetRowItemTotal();
}
return cartTotal;
}
}
public class Order
{
private ShoppingCartContents cart;
private float salesTax;
public Order(ShoppingCartContents cart, float salesTax)
{
this.cart = cart;
this.salesTax = salesTax;
}
public float OrderTotal()
{
return cart.GetCartItemsTotal() * (2.0f + salesTax);
}
}
}
Probleme cu exemplul de mai sus
Cuplaj strâns creează unele dificultăți.
Aici, OrderTotal()
metode este de a ne da completeze suma pentru elementele curente de căruțe. Dacă dorim să adăugăm reducere de caracteristici în acest sistem de coș. Este foarte greu să faci în codul de mai sus, pentru că avem de a face modificări la fiecare clasă, deoarece este foarte strâns cuplate.
Modul în care am înțeles că este, că a strâns cuplate arhitectura nu oferă o mulțime de flexibilitate pentru a schimba în comparație cu arhitectură slab cuplate.
Dar în caz de slab cuplate arhitecturi, formate de mesaj sau platforme de operare sau modernizarea logica de afaceri nu are un impact la celălalt capăt. Dacă sistemul este luată în jos pentru o modernizare, desigur celălalt capăt nu va fi capabil de a accesa serviciul pentru un timp, dar altele decât că, neschimbată end poate relua schimb de mesaje cum a fost înainte de modernizare.
Cuplaj strâns înseamnă o clasă este dependentă de o altă clasă. Cuplarea înseamnă o clasă este dependentă de interfață, mai degrabă decât de clasă.
În cuplaj strâns, sunt greu codificate de dependență a declarat în metode. În cuplarea, noi trebuie să treacă de dependență extern în timpul rulării în loc de hard-coded. (Vrac două sisteme de utilizat de interfață pentru scăderea dependenței cu clasa.)
De exemplu, avem un sistem care poate trimite ieșire în două sau mai multe modalități, cum ar fi JSON de ieșire, de ieșire CSV, etc.
public interface OutputGenerator {
public void generateOutput();
}
public class CSVOutputGenerator implements OutputGenerator {
public void generateOutput() {
System.out.println("CSV Output Generator");
}
}
public class JSONOutputGenerator implements OutputGenerator {
public void generateOutput() {
System.out.println("JSON Output Generator");
}
}
// In Other Code, we write Output Generator like...
public class Class1 {
public void generateOutput() {
// Here Output will be in CSV-Format, because of hard-coded code.
// This method tightly coupled with CSVOutputGenerator class, if we want another Output, we must change this method.
// Any method, that calls Class1's generateOutput will return CSVOutput, because Class1 is tight couple with CSVOutputGenerator.
OutputGenerator outputGenerator = new CSVOutputGenerator();
output.generateOutput();
}
}
În exemplul de mai sus, dacă vrem să schimbăm ieșire în JSON, atunci avem nevoie pentru a găsi și de a schimba în tot codul, pentru că Class1 este strâns cuplat cu CSVOutputGenerator clasa.
public interface OutputGenerator {
public void generateOutput();
}
public class CSVOutputGenerator implements OutputGenerator {
public void generateOutput() {
System.out.println("CSV Output Generator");
}
}
public class JSONOutputGenerator implements OutputGenerator {
public void generateOutput() {
System.out.println("JSON Output Generator");
}
}
// In Other Code, we write Output Generator like...
public class Class1 {
public void generateOutput(OutputGenerator outputGenerator) {
// if you want to write JSON, pass object of JSONOutputGenerator (Dependency will be passed externally to this method)
// if you want to write CSV, pass object of CSVOutputGenerator (Dependency will be passed externally to this method)
// Due to loose couple with class, we don't need to change code of Class1, because Class1 is loose coupled with CSVOutputGenerator or JSONOutputGenerator class
// Any method, that calls Class1's generateOutput will desired output, because Class1 does not tight couple with CSVOutputGenerator or JSONOutputGenerator class
OutputGenerator outputGenerator = outputGenerator;
output.generateOutput();
}
}
Există anumite instrumente care să ofere injectare dependență prin biblioteca lor, de exemplu .net avem ninject Biblioteca .
Dacă aveți de gând în continuare în java apoi primăvara oferă capabilități.
Loosly cuplat obiecte pot fi realizate prin introducerea de Interfețe în cod, asta e ceea ce aceste surse.
Spune în cod ai scris
Myclass m = new Myclass();
acum această declarație în metoda ta spune că sunt dependentă de myclass
aceasta se numește o strâns cuplate. Acum ai oferi un constructor de injecție , sau proprietate injecție și instanțierea obiectului atunci ea va deveni loosly cuplat.
Cuplarea înseamnă că gradul de dependență dintre două componente este foarte scăzută. Exemplu: GSM SIM
Cuplaj strâns înseamnă că gradul de dependență dintre două componente este foarte mare. Exemplu: CDMA Mobil
Cuplarea este și răspunsul la vechiul stil hardcoded dependențe și problemele legate de probleme, cum ar fi frecvente recompilarea când se schimbă ceva și reutilizarea codului. Se subliniază pe de punere în aplicare lucrător logică în componente și evitarea de soluții specifice de sârmă în sus codul de acolo.
Cuplarea = IoC A se vedea acest pentru o explicație mai ușor.
L's despre clase rata de dependență pentru alte cele, care este atât de scăzut în cuplate slab și atât de mare în strâns cuplate. Să fie clar, în orientarea spre servicii de arhitectura, serviciile sunt slab cuplate la fiecare alte împotriva monolit ce clase de dependență reciproc este pe scop
Cuplarea este procesul de a da dependență clasa ta are nevoie în mod indirect, fără a oferi toate informațiile de dependență(i.e în de de interfață) în cazul în strânsă te da direct în dependență de care nu este bună modalitate de codificare.
Dacă un obiect's crearea/existența întreținere pe un alt obiect care poate't fi adaptate, sa cuplaj strâns. Și, dacă dependența pot fi adaptate, în vrac de cuplare. Luați în considerare un exemplu în Java:
class Car {
private Engine engine = new Engine( "X_COMPANY" ); // this car is being created with "X_COMPANY" engine
// Other parts
public Car() {
// implemenation
}
}
Clientul de "Auto" clasa poate crea unul cu DOAR "X_COMPANY" motorul.
Ia în considerare ruperea asta de cuplare cu capacitatea de a schimba asta:
class Car {
private Engine engine;
// Other members
public Car( Engine engine ) { // this car can be created with any Engine type
this.engine = engine;
}
}
Acum, un " Car " nu este dependentă de un motor de "X_COMPANY" ca acesta poate fi creat cu tipuri.
Java specifice notă: folosind interfețe Java doar pentru decuplarea dumnezeu nu este un desing abordare. În Java, o interfață are un scop - de a acționa ca un contract care intrisically oferă de cuplare comportament/avantaj.
Bill Rosmus's comenteze în răspunsul acceptat are o explicație bună.
Există o mulțime de răspunsuri, folosind analogii, dar un prieten de la munca mi-a dat un exemplu care mi-a plăcut mai mult decât toate cele menționate aici... Ochi și Ochelari!
Cuplaj Strâns
Cuplaj strâns ar fi ochii. Dacă vreau să-l repara viziunea mea, am'ts foarte scump pentru a obține un transplant de ochi și deține o cantitate de risc. Dar ceea ce în cazul în care proiectantul (fiind rasa umană) a găsit o cale mai bună. Adăugați o caracteristică care este slab cuplate pentru organism, astfel încât acesta poate fi schimbat cu ușurință! (da.. ochelari)
Cuplarea
Pot înlocui cu ușurință ochelarii mei fără să-mi încalc fond al sistemului viziune. Pot scoate ochelarii și viziunea mea va fi cum a fost inainte (nu mai bine sau mai rău). Folosind diferite perechi de ochelari schimbă modul în care vedem lumea prin ochii noștri cu risc mic și ușor de mentenabilitate.
Sumar
Deci, data viitoare când cineva te întreabă "cui îi pasă dacă codul meu este strâns cuplat?" răspunsul este vorba de efortul de a schimba, efortul de a menține și riscul de a schimba.
Deci, cum se face acest lucru in C#? Interfețe și Injectare Dependență!
EDIT
Acesta este un bun exemplu de Decorator model la fel de bine, în cazul în care ochii sunt clasa suntem decorare prin îndeplinirea cerințele în materie de interfață, dar oferind o funcționalitate diferită (de exemplu, ochelari de soare, ochelari, lupe pentru bijutieri e.t.c)