it-swarm.com.de

Was ist Entkopplung und auf welche Entwicklungsbereiche kann sie angewendet werden?

Ich habe kürzlich die Entkopplung als Thema in einer Frage bemerkt und möchte wissen, was es ist und wo es angewendet werden kann.

Mit "wo kann es gelten" meine ich:

Ist es nur relevant, wenn kompilierte Sprachen wie C und Java) beteiligt sind?

Sollte ich es als Webentwickler kennen/studieren?

22
user129679

'Kopplung' ist ein Begriff, der die Beziehung zwischen zwei Entitäten in einem Softwaresystem (normalerweise Klassen) beschreibt.

Wenn eine Klasse eine andere Klasse verwendet oder mit ihr kommuniziert, wird davon ausgegangen, dass sie von dieser anderen Klasse abhängt. Daher sind diese Klassen „gekoppelt“. Mindestens einer von ihnen "weiß" über den anderen Bescheid.

Die Idee ist, dass wir versuchen sollten, die Kopplung zwischen Klassen in unseren Systemen so "locker" wie möglich zu halten: daher "lose Kopplung" oder manchmal "Entkopplung" (obwohl "Entkopplung" auf Englisch "überhaupt keine Kopplung" bedeuten würde, Leute Verwenden Sie es häufig, um eine „lose Kopplung“ zwischen Entitäten zu implizieren.

Also: Was ist lose Kopplung gegenüber starker Kopplung in der Praxis und warum sollten wir Entitäten lose gekoppelt machen?


Die Kopplung beschreibt den Grad der Abhängigkeit zwischen einer Entität und einer anderen Entität. Oft Klassen oder Objekte.

Wenn ClassA stark von ClassB abhängt, ist die Wahrscheinlichkeit hoch, dass ClassA betroffen ist, wenn ClassB geändert wird. Dies ist eine starke Kopplung.

Wenn ClassA jedoch nur geringfügig von ClassB abhängt, ist die Wahrscheinlichkeit gering, dass ClassA in irgendeiner Weise von einer Änderung des Codes von ClassB betroffen ist. Dies ist eine lose Kopplung oder eine "entkoppelte" Beziehung.

Eine lose Kopplung ist gut, weil wir nicht möchten, dass die Komponenten unseres Systems stark voneinander abhängen. Wir möchten unser System modular halten, wo wir einen Teil sicher ändern können, ohne den anderen zu beeinflussen.

Wenn zwei Teile lose miteinander verbunden sind, sind sie unabhängiger voneinander und brechen weniger wahrscheinlich, wenn sich die anderen ändern.

Wenn Sie beispielsweise ein Auto bauen, möchten Sie nicht, dass eine interne Änderung des Motors das Lenkrad beschädigt.

Während dies beim Bau eines Autos niemals zufällig passieren würde, passieren Programmierern ständig ähnliche Dinge. Eine lose Kopplung soll das Risiko solcher Ereignisse verringern.

Eine starke Kopplung tritt normalerweise auf, wenn Entität A zu viel über Entität B weiß. Wenn Entität A zu viele Annahmen darüber trifft, wie Entität B funktioniert oder wie sie aufgebaut ist, besteht ein hohes Risiko, dass sich eine Änderung von Entität B auswirkt Entität A. Dies liegt daran, dass eine der Annahmen zu Entität B jetzt falsch ist.

Stellen Sie sich zum Beispiel vor, Sie würden als Fahrer bestimmte Annahmen darüber treffen, wie der Motor Ihres Autos funktioniert.

An dem Tag, an dem Sie ein neues Auto mit einem Motor kaufen, der anders funktioniert (oder aus irgendeinem Grund wurde Ihr Motor ersetzt), wären Ihre vorherigen Annahmen falsch. Wenn Sie Code in einem Computer wären, wären Sie jetzt falscher Code, der nicht richtig funktioniert.

Wenn jedoch alle Annahmen, die Sie als Fahrer über Autos gemacht haben, folgende sind: A- sie haben Lenkräder und B- sie haben Brems- und Gaspedale, dann werden Änderungen im Auto Sie nicht beeinflussen, solange Ihre wenigen Annahmen bleib korrekt. Dies ist eine lose Kupplung.


Eine wichtige Technik, um eine lose Kopplung zu erreichen, ist die Kapselung. Die Idee ist, dass eine Klasse ihre internen Details vor anderen Klassen verbirgt und eine streng definierte Schnittstelle für andere Klassen bietet, um mit ihr zu kommunizieren.

Wenn Sie beispielsweise eine Klasse Car definieren, ist ihre Schnittstelle (öffentliche Methoden) wahrscheinlich drive(), stop(), steerLeft(), steerRight(), getSpeed(). Dies sind die Methoden, die andere Objekte für Autoobjekte aufrufen können.

Alle anderen Details der Autoklasse: Funktionsweise des Motors, Art des verwendeten Kraftstoffs usw. sind anderen Klassen verborgen - damit sie nicht zu viel über das Auto wissen.

In dem Moment, in dem Klasse A zu viel über Klasse B weiß: Wir haben eine stark gekoppelte Beziehung, in der Klasse A zu stark von Klasse B abhängt und eine Änderung in Klasse B wahrscheinlich Klasse A betrifft. Das System ist schwer zu erweitern und pflegen.

Eine Beziehung zwischen zwei Entitäten, bei der sie wenig voneinander wissen (nur was erforderlich ist), ist eine lose gekoppelte oder entkoppelte Beziehung.

57
Aviv Cohn

Bei der Entkopplung geht es im Allgemeinen darum zu sehen, ob zwei Dinge eng zusammenarbeiten müssen oder weiter unabhängig gemacht werden können. Unabhängigkeit ist großartig, weil sie es einfach macht, diese Dinge zu ändern oder woanders zu verwenden. Die Entkopplung kann in vielen Bereichen angewendet werden, nicht nur in der Entwicklung. Dies gilt insbesondere für die zeitliche Entkopplung, die (in gewissem Umfang) sogar in Ihrem täglichen Leben angewendet werden kann. Beachten Sie auch, dass in der Softwareentwicklung viele Arten der Kopplung zu berücksichtigen sind und nicht alle in der Antwort behandelt werden. Sie müssen Ihre Forschung tun.

Zwei Dinge, A und B , sind gekoppelt, wenn zwischen ihnen eine Abhängigkeit besteht. Wenn A von B abhängt, können Sie B verwenden, ohne A zu berücksichtigen. Wenn Sie A verwenden möchten, müssen Sie auch B übertragen, da A davon abhängt.

In der Softwareentwicklung können Sie die Kopplung zwischen Komponenten normalerweise nicht vollständig entfernen. Entkopplung bedeutet in diesem Zusammenhang normalerweise das Lösen der vorhandenen Kopplung. Stellen Sie also sicher, dass jede Komponente so wenig wie möglich über die anderen Komponenten in ihrer Umgebung weiß.

Dies ist wahrscheinlich die häufigste Art der Kopplung in freier Wildbahn:

//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);
     ...
}

Hier arbeitet DisplayFriends unnötig manuell mit der Verbindung hinter dem Facebook-Client, um das zu bekommen, was es braucht. Die Klasse von DisplayFriends ist sowohl an FacebookClient als auch an Connection gekoppelt. Wenn FacebookClient plötzlich die Art der verwendeten Verbindung ändert, kann die App die Facebook-Freunde nicht mehr erreichen. Wir können die Kopplung zwischen der Klasse von DisplayFriends und Connection entfernen, indem wir FacebookClient bitten, das bereitzustellen, was wir für uns benötigen.

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

Jetzt ist es uns egal, wie FacebookClient unsere Freunde bekommt. Alles, was uns wirklich wichtig ist, ist die Tatsache, dass es sie bekommt. Jede Änderung des internen Verhaltens schadet unserer eigenen Klasse nicht.

Diese Art der Entkopplung kann leicht erreicht werden, indem das Demeter-Gesetz für Funktionen befolgt wird, das besagt (unter Angabe von Wikipedia):

Das Demeter-Gesetz für Funktionen verlangt, dass eine Methode m eines Objekts O nur die Methoden der folgenden Arten von Objekten aufrufen darf:

  • O selbst
  • m Parameter
  • Alle innerhalb von m erstellten/instanziierten Objekte
  • O's direkte Komponentenobjekte
  • Eine globale Variable, auf die O im Bereich von m zugreifen kann

Da ich am Anfang der Antwort die zeitliche Kopplung erwähnt habe, werde ich sie kurz beschreiben.

Die zeitliche Kopplung wird normalerweise beim Entwerfen von Anwendungen berücksichtigt, die Algorithmen parallel ausführen. Betrachten Sie zwei ausführbare Einheiten (seien es tatsächliche Anweisungen, Methoden oder was auch immer Sie als Einheit betrachten möchten), A und B. Wir sagen, A ist zeitlich mit B gekoppelt, wenn B ausgeführt werden muss, bevor A ausgeführt wird. Wenn A nicht zeitlich an B gekoppelt ist, können A und B gleichzeitig ausgeführt werden. Bauen Sie Ihr eigenes Beispiel für dieses: Denken Sie an die üblichen Dinge, die Sie in Ihrem täglichen Leben tun. Gibt es zwei Dinge, die Sie nacheinander tun, die Sie aber gleichzeitig tun könnten?

Um Ihr letztes Bit zu beantworten:

Sollte ich es als Webentwickler kennen/studieren?

Ja. Bei einem der beliebtesten Entwurfsmuster für die Webentwicklung (MVC) geht es beispielsweise um die Entkopplung.

3
user52800

Die anderen Antworten beschreiben gut, was Entkopplung ist. Ich wollte Ihre letzte Frage diskutieren.

Sollte ich es als Webentwickler kennen/studieren?

Die Antwort ist ein klares Ja. Es spielt keine Rolle, welche Art von Entwickler Sie sind. Sie können ein Webentwickler oder ein Entwickler eingebetteter Systeme sein.

Angenommen, Sie haben eine Klasse, die benutzerdefinierte URLs generiert, die auf Ihrer Webseite platziert werden. Sie könnten versucht sein, die Klasse die URLs direkt auf die Seite schreiben zu lassen und sie in die href eines Tags zu setzen. Dies mag zunächst einfacher erscheinen. Aber was passiert, wenn Sie eine Änderung vornehmen müssen, um die Links in eine E-Mail einzufügen und an einen Benutzer zu senden? Ihr aktueller Code würde nicht funktionieren, da Ihr URL-Generator eng mit dem von Ihnen verwendeten Webframework verbunden ist.

Die bessere Option wäre eine URL-Generatorklasse, die die URL als Zeichenfolge zurückgibt. Dies kann von Ihrem Webcode und auch von Ihrem E-Mail-Code verwendet werden. Es mag wie mehr Arbeit im Voraus erscheinen, Code entkoppelt zu haben, aber der Aufwand macht sich im Laufe der Zeit bezahlt.

Durch modularisierten und entkoppelten Code wird Ihr Code verständlicher, testbarer und wartbarer, unabhängig davon, in welcher Programmierdomäne Sie arbeiten.

1
epotter