351 Stimmen

Was ist der Unterschied zwischen loser und enger Kopplung im objektorientierten Paradigma?

Kann jemand den genauen Unterschied zwischen loser Kopplung und enger Kopplung im objektorientierten Paradigma beschreiben?

431voto

Jonathan Punkte 30894

Eine enge Kopplung liegt vor, wenn eine Gruppe von Klassen in hohem Maße voneinander abhängig ist.

Dieses Szenario tritt auf, wenn eine Klasse zu viele Verantwortlichkeiten übernimmt oder wenn ein Anliegen auf viele Klassen verteilt wird, anstatt eine eigene Klasse zu haben.

Lose Kopplung wird durch ein Design erreicht, das die Einzelverantwortung und die Trennung von Belangen fördert.

Eine lose gekoppelte Klasse kann unabhängig von anderen (konkreten) Klassen konsumiert und getestet werden.

Schnittstellen sind ein leistungsfähiges Werkzeug für die Entkopplung. Klassen können über Schnittstellen und nicht über andere konkrete Klassen kommunizieren, und jede Klasse kann am anderen Ende dieser Kommunikation stehen, indem sie einfach die Schnittstelle implementiert.

Beispiel für eine enge Kopplung:

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)
    {
    }
}

Beispiel für lose Kopplung:

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 implements IDatabase
{
    public void AddRow(string Table, string Value)
    {
    }
}

Ein weiteres Beispiel ici .

278voto

BenKoshy Punkte 29349

Erläuterung ohne Code

Eine einfache Analogie zur Erklärung des Konzepts. Der Code kann später kommen.

Zusammenfassung Beispiel einer losen Kopplung:

The Hat is "loosely coupled" to the body. This means you can easily take then hat off without making any changes to the the person/body. Picture Attribution: https://pixabay.com/en/greeting-cylinder-chapeau-dignity-317250/

In der Abbildung oben ist der Hut "lose" mit dem Körper verbunden. Das bedeutet, dass Sie den Hut einfach abnehmen können, ohne die Person/den Körper verändern zu müssen. Wenn das möglich ist, spricht man von "loser Kopplung". Siehe unten für weitere Erläuterungen.

Ausführliches Beispiel

Denken Sie an Ihre Haut. Sie klebt an deinem Körper. Sie passt wie ein Handschuh. Aber was wäre, wenn Sie Ihre Hautfarbe ändern wollten, zum Beispiel von weiß zu schwarz? Kannst du dir vorstellen, wie schmerzhaft es wäre, deine Haut abzuziehen, sie zu färben und sie dann wieder aufzukleben? Es ist schwierig, die Haut zu verändern, weil sie fest mit dem Körper verbunden ist. Man kann sie nicht so einfach verändern. Man müsste einen Menschen grundlegend umgestalten, um dies zu ermöglichen.

  • Schlüsselpunkt Nr. 1 : Mit anderen Worten, wenn man die Haut ändern will, MUSS man auch das Design des Körpers ändern auch deshalb, weil die beiden eng miteinander verbunden sind.

Gott war kein guter objektorientierter Programmierer.

Lose Kopplung (Detailliertes Beispiel)

Stellen Sie sich nun vor, Sie ziehen sich morgens an. Du magst kein Blau? Kein Problem: Sie können stattdessen ein rotes Hemd anziehen. Das geht leicht und mühelos, denn das Hemd ist nicht so sehr mit Ihrem Körper verbunden wie Ihre Haut. Das Hemd weiß nicht, auf welchem Körper es getragen wird, und es kümmert sich auch nicht darum. . Mit anderen Worten: Sie können Ihre Kleidung wechseln, ohne Ihren Körper wirklich zu verändern.

  • Das ist der Schlüsselpunkt Nr. 2. Wenn du dein Hemd wechselst, bist du nicht gezwungen, deinen Körper zu wechseln. - Wenn Sie das können, dann haben Sie eine lose Kopplung. Wenn man das nicht kann, dann hat man eine enge Kopplung.

Das ist das Grundkonzept in Kurzform.

Warum ist das alles so wichtig?

Beim Schreiben von Software sind Veränderungen unvermeidlich. Wenn wir im Voraus wissen, dass an einer bestimmten Stelle eine Änderung ansteht, dann sollten wir dafür sorgen, dass unsere Software an diesem Punkt lose gekoppelt ist, denn das würde es uns ermöglichen, diese Änderungen einfach und schnell vorzunehmen, ohne Bugs.....so, was bedeutet das? Betrachten Sie einige Beispiele:

Lose Kopplung in Software:

  • CSV/JSON-Beispiele: Am Anfang meiner Laufbahn sagte mein Vorgesetzter: "Geben Sie mir die Ergebnisse als CSV-Datei". Na toll. Ich hackte mich durch und entwickelte eine Routine, die wunderbar funktionierte. Dann, ein oder zwei Wochen später, sagte er: "Eigentlich möchte ich die Ausgabe für einen anderen Kunden in JSON".

Was für eine Qual. Ich musste die ganze Sache neu schreiben. Ich habe das Ganze mit Hilfe von Schnittstellen neu geschrieben - ein lose gekoppeltes Entwurfsmuster - und jetzt ist es viel einfacher, neue Ausgabeformate hinzuzufügen oder Dinge zu ändern. Ich kann die JSON-Teile bearbeiten, ohne befürchten zu müssen, dass ich meine CSV-Ausgabe zerstöre. Der andere wichtige Punkt: Veränderungen in Software sind normal. Koppeln Sie die Punkte, die sich ändern, lose.

  • DB-Beispiele: wenn Sie einfach von sqlLite zu PostGreSQL wechseln wollen - lose gekoppelter Code macht es wirklich einfach zu wechseln (d.h. ein rotes Hemd statt eines blauen Hemdes anzuziehen). Die ActiveRecord-Bibliothek von Rails ist lose an ihre Datenbankimplementierung gekoppelt. Dies macht es super einfach für jemanden, seine eigene Datenbank-Implementierung zu verwenden, während Sie die gleiche Code-Basis!

  • Beispiele für Cloud-Anbieter: Oder wenn Sie AWS nutzen und das Unternehmen aufgrund seiner Marktdominanz zu hohe Gebühren verlangt, sollten Sie relativ einfach zu Google oder Azure usw. wechseln können. Das ist genau der Grund, warum es Bibliotheken wie Active Storage gibt - sie bieten den Nutzern eine gesunde Gleichgültigkeit gegenüber dem jeweils verwendeten Cloud-Anbieter (Azure, AWS S3, GCS usw.). Der Wechsel des Cloud-Anbieters ist mit nur einer Zeile Code möglich. Die Implementierungsdetails der Cloud-Speicheranbieter sind lose gekoppelt.

  • Prüfung Wenn Sie Ihre Software mit vorgegebenen Ausgaben und Eingaben testen wollen - wie werden Sie das tun? Mit lose gekoppelter Software ist das ein Kinderspiel: Sie können Ihre Tests ausführen und auch Ihren Produktionscode bereitstellen, und das alles in derselben Codebasis. Bei eng gekoppeltem Code ist das Testen des Produktionscodes fast unmöglich.

Müssen wir alles "lose gekoppelt" machen? Wahrscheinlich nicht. Wir müssen unser Urteilsvermögen einsetzen. Ein gewisses Maß an Kopplung ist unvermeidlich. Aber man sollte sie minimieren wenn Sie im Voraus wissen wo sie sich verändern wird. Ich würde auch davon abraten raten wo sich die Dinge ändern werden, und eine lose Kopplung von allem. Koppeln Sie nur dann lose, wenn Sie es müssen.

Zusammenfassung

Kurz gesagt: Lose Kopplung macht den Code leichter änderbar.

Die obigen Antworten enthalten einige lesenswerte Codes.

Fortgeschrittene Themen

Lose Kopplung geht Hand in Hand mit Polymorphismus und Schnittstellen. Wenn Sie Karikaturen und Analogien mögen, schauen Sie sich einige andere Beiträge an, die ich geschrieben habe:

Bild Zuweisung .

78voto

Don Kirkby Punkte 46803

Im objektorientierten Design bezieht sich der Grad der Kopplung darauf, wie sehr das Design einer Klasse vom Design einer anderen Klasse abhängt. Mit anderen Worten: Wie oft erzwingen Änderungen in Klasse A entsprechende Änderungen in Klasse B? Enge Kopplung bedeutet, dass sich die beiden Klassen häufig gemeinsam ändern, lose Kopplung bedeutet, dass sie weitgehend unabhängig sind. Im Allgemeinen wird eine lose Kopplung empfohlen, weil sie einfacher zu testen und zu warten ist.

Sie finden vielleicht dieses Papier von Martin Fowler (PDF) hilfreich.

19voto

Milan Vaghasiya Punkte 151

Feste Kopplung bedeutet, dass eine Klasse von einer anderen Klasse abhängig ist.
Lose Kopplung bedeutet, dass eine Klasse eher von der Schnittstelle als von der Klasse abhängig ist.

En enge Kopplung gibt es hart kodierte Abhängigkeiten, die in Methoden deklariert sind.
Unter lose Kopplung müssen wir die Abhängigkeit extern zur Laufzeit übergeben, anstatt sie hart zu kodieren. (Lose Kopplungssysteme verwenden Schnittstellen, um die Abhängigkeit von Klassen zu verringern).

Wir haben z. B. ein System, das Ausgaben auf zwei oder mehr Arten senden kann, wie JSON-Ausgabe, CSV-Ausgabe usw.

Eng gekoppelt

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();
    }
}

Wenn wir im obigen Beispiel die Ausgabe in JSON ändern wollen, müssen wir den gesamten Code suchen und ändern, da Klasse1 eng mit der Klasse CSVOutputGenerator gekoppelt ist.

Lose gekoppelt

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();
    }
}

16voto

Jom George Punkte 1069

Generell ist Tight Coupling aber meistens schlecht, weil es die Flexibilität und Wiederverwendbarkeit des Codes einschränkt, Änderungen erschwert, die Testbarkeit behindert usw.

Tightly Coupled Object ist ein Objekt müssen ziemlich viel über einander wissen und sind in der Regel stark abhängig von einander Schnittstellen. Die Änderung eines Objekts in einer eng gekoppelten Anwendung erfordert oft Änderungen an einer Reihe anderer Objekte. In kleinen Anwendungen können wir die Änderungen leicht erkennen und es besteht eine geringe Chance, etwas zu verpassen. In großen Anwendungen sind diese Abhängigkeiten jedoch nicht immer jedem Programmierer bekannt, oder es besteht die Möglichkeit, dass Änderungen übersehen werden. Aber jeder Satz von lose gekoppelten Objekten ist nicht von den anderen abhängig.

Zusammenfassend lässt sich sagen, dass lose Kopplung ein Entwurfsziel ist, das darauf abzielt, die Abhängigkeiten zwischen den Komponenten eines Systems zu reduzieren, um das Risiko zu verringern, dass Änderungen an einer Komponente Änderungen an einer anderen Komponente erfordern. Lose Kopplung ist ein sehr viel allgemeineres Konzept, das die Flexibilität eines Systems erhöhen, es wartungsfreundlicher machen und den gesamten Rahmen "stabiler" gestalten soll.

Die Kopplung bezieht sich auf den Grad der direkten Kenntnis, die ein Element von einem anderen hat: A und B, nur B ändert sein Verhalten nur, wenn A sein Verhalten ändert. Ein lose gekoppeltes System kann leicht in definierbare Elemente zerlegt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X