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

21

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

Mit "wo kann es angewendet werden" meine ich:

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

Soll ich es als Webentwickler kennen / studieren?


quelle
Es wäre hilfreich, wenn Sie ein wenig recherchieren und eine Frage stellen würden, die auf unklaren Teilen der Definition basiert.
JeffO
2
@JeffO - Ich denke, die Welt profitiert von vollständigen Konzeptfragen genauso wie von spezifischen Nuancen. "Warum ist der Himmel blau?" ermöglicht Antworten, die das Konzept selbst abdecken, ohne auf die Einzelheiten einzugehen. Deshalb habe ich meine Frage ohne Nachforschungen gestellt.
Was ist das spezifische Problem, das Sie haben? Ihre Frage ist aus heutiger Sicht viel zu weit gefasst. In dieser aktuellen Form ist die Antwort im Wesentlichen der gesamte Text von Structured Design: Grundlagen einer Disziplin für Computerprogramm- und Systemdesign von Edward Yourdon und Larry Constantine .
Jörg W Mittag
Ich denke, die Antworten hier liefern eine perfekte Beschreibung des Konzepts. Es ist so, als würde man fragen: "Was ist die Definition dieses Wortes im Verhältnis zur Programmierung?" - Wie ist es dann zu weit gefasst? @ GlenH7
1
@ jt0dd da müsste ich zustimmen. Nur weil Sie etwas mit einem Buch erklären können, heißt das nicht, dass eine prägnantere Antwort keinen Wert hat. In der Programmierliteratur werden Sie oft mit Details überhäuft, bevor Sie einen anständigen Überblick auf höherer Ebene erhalten. "Was ist OOP?" wäre viel zu breit. Aber dies ist ein einigermaßen spezifisches Thema, IMO.
Erik Reppen

Antworten:

57

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

Wenn eine Klasse eine andere Klasse verwendet oder mit ihr kommuniziert, wird gesagt, dass sie von dieser anderen Klasse abhängt, und daher werden diese Klassen gekoppelt. Mindestens einer von ihnen "kennt" sich aus.

Die Idee ist, dass wir versuchen sollten, die Kopplung zwischen Klassen in unseren Systemen so "lose" wie möglich zu halten: daher "lose Kopplung" oder manchmal "Entkopplung" (obwohl "Entkopplung" im Englischen "überhaupt keine Kopplung" bedeuten würde, Leute wird oft verwendet, um "lose Kopplung" zwischen Entitäten zu implizieren).

Also: Was ist lose Kopplung im Vergleich zu 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 zu einer anderen Entität. Oft Klassen oder Objekte.

Wenn ClassA stark von ClassB abhängt, ist die Wahrscheinlichkeit groß, dass ClassA bei einem Wechsel von ClassB beeinträchtigt wird. Dies ist eine starke Kopplung.

Wenn ClassA jedoch in geringem Maße von ClassB abhängt, ist die Wahrscheinlichkeit gering, dass ClassA durch eine Änderung des ClassB-Codes in irgendeiner Weise beeinträchtigt wird. Dies ist eine lose Kopplung oder eine "entkoppelte" Beziehung.

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, sodass wir einen Teil sicher wechseln können, ohne den anderen zu beeinträchtigen.

Wenn zwei Teile lose miteinander verbunden sind, sind sie unabhängiger voneinander und brechen weniger leicht, wenn sich das andere ändert.

Wenn Sie beispielsweise ein Auto bauen, möchten Sie nicht, dass durch eine interne Änderung des Motors etwas im Lenkrad kaputt geht.

Während dies beim Bau eines Autos niemals zufällig passieren würde, passieren Programmierern ständig ähnliche Dinge. Lose Kopplung soll das Risiko verringern, dass solche Dinge passieren.

Eine starke Kopplung erfolgt in der Regel , wenn Entität A zu viel über Entität B. weiß Wenn Unternehmen A zu viele Annahmen über macht , wie Einheit B arbeitet oder , wie es gebaut ist, als es ein hohes Risiko besteht darin , dass eine Änderung in der Einheit B Einheit A. beeinflussen Diese liegt daran, dass eine seiner Annahmen über 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 Ihr Motor ersetzt wurde), stimmen Ihre vorherigen Annahmen nicht. Wenn Sie Code in einem Computer wären, wäre dies jetzt ein falscher Code, der nicht richtig funktioniert.

Wenn jedoch alle Annahmen, die Sie als Fahrer über Autos gemacht haben, die folgenden sind: A - Sie haben Lenkräder und B - Sie haben Bremsen und Gaspedale, dann werden Sie Änderungen am Auto nicht beeinträchtigen, solange Sie nur wenige Annahmen treffen bleib richtig. Dies ist eine lose Kopplung.


Eine wichtige Technik zum Erreichen einer losen Kopplung ist die Verkapselung. Die Idee ist, dass eine Klasse ihre internen Details vor anderen Klassen verbirgt und eine genau definierte Schnittstelle bietet, über die andere Klassen mit ihr kommunizieren können.

So zum Beispiel, wenn Sie eine Klasse Auto wurden definiert, es die Schnittstelle (öffentliche Methoden) wäre wahrscheinlich drive(), stop(), steerLeft(), steerRight(), getSpeed(). Dies sind die Methoden, die andere Objekte für Car-Objekte aufrufen können.

Alle anderen Details der Car-Klasse: Wie der Motor funktioniert, welche Art von Kraftstoff verwendet wird usw. sind vor anderen Klassen verborgen, um zu verhindern, dass sie zu viel über Car 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 von Klasse B wahrscheinlich Klasse A beeinflusst. Das System lässt sich nur schwer erweitern und warten.

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

Aviv Cohn
quelle
3

Bei der Entkopplung geht es im Allgemeinen darum, zu sehen, ob zwei Dinge eng zusammenarbeiten müssen oder ob sie weiter voneinander 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, und dies gilt insbesondere für die zeitliche Entkopplung, die (teilweise) sogar in Ihrem täglichen Leben angewendet werden kann. Es ist auch anzumerken, dass bei der Softwareentwicklung viele Arten von Kopplungen zu berücksichtigen sind, und nicht alle werden in der Antwort behandelt. Sie müssen Ihre Forschung tun.

Zwei Dinge, A und B , sind gekoppelt, wenn eine Abhängigkeit zwischen ihnen 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 normalerweise die Kopplung zwischen Komponenten nicht vollständig entfernen. Entkoppeln bedeutet in diesem Zusammenhang normalerweise das Lösen der vorhandenen Kupplung. Stellen Sie also sicher, dass jede Komponente so wenig wie möglich über die anderen Komponenten in ihrer Umgebung Bescheid weiß.

Dies ist wahrscheinlich die häufigste Art der Kupplung 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ötigerweise manuell mit der Verbindung hinter dem Facebook-Client, um das zu bekommen, was es benötigt. DisplayFriendsDie Klasse von ist an beide FacebookClientund gekoppelt Connection. Wenn FacebookClient plötzlich die Art der verwendeten Verbindung ändert, kann die App die Facebook-Freunde nicht mehr abrufen. Wir können die Kopplung zwischen der DisplayFriends-Klasse und Connection aufheben, indem wir FacebookClient bitten, uns das Nötige zur Verfügung zu stellen.

//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 erreicht. Alles, was uns wirklich wichtig ist, ist die Tatsache, dass es sie bekommt. Jede Änderung an seinem internen Verhalten wird unserer eigenen Klasse keinen Schaden zufügen.

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

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

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

Da ich zu Beginn der Antwort auf die zeitliche Kopplung eingegangen bin, 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 für eine Einheit halten 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 mit B gekoppelt ist, können A und B gleichzeitig ausgeführt werden. Bauen Sie Ihr eigenes Beispiel dafür: Denken Sie an die üblichen Dinge, die Sie in Ihrem täglichen Leben tun. Gibt es zwei Dinge, die Sie nacheinander tun, aber gleichzeitig tun könnten?

Zum Schluss, um Ihr letztes Bit zu beantworten:

Soll ich es als Webentwickler kennen / studieren?

Ja. Bei einem der beliebtesten Entwurfsmuster für die Webentwicklung (MVC) dreht sich beispielsweise alles um das Entkoppeln.


quelle
1

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

Soll ich es als Webentwickler kennen / studieren?

Die Antwort ist ein klares Ja. Es ist egal, was für ein 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 URLs von der Klasse 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 Änderungen vornehmen müssen, um die Links in eine E-Mail einzufügen und sie an einen Benutzer zu senden? Ihr aktueller Code funktioniert nicht, da Ihr URL-Generator eng an das von Ihnen verwendete Webframework gekoppelt ist.

Die bessere Option wäre eine URL-Generator-Klasse, die die URL als Zeichenfolge zurückgibt. Dies könnte von Ihrem Webcode verwendet werden und es könnte auch von Ihrem E-Mail-Code verwendet werden. Es mag im Vorfeld wie mehr Arbeit erscheinen, entkoppelten Code zu haben, aber der Aufwand zahlt sich mit der Zeit aus.

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

Epotter
quelle
Nach dieser und den beiden anderen Antworten verstehe ich das wirklich und sehe, wie ich es verwenden kann.