2009-03-02 6 views
7

Widersprechen sie?Entkopplung gegen YAGNI

Entkopplung ist etwas Großartiges und ziemlich schwer zu erreichen. Aber in den meisten Anwendungen brauchen wir es nicht wirklich, also kann ich hoch gekoppelte Anwendungen entwerfen und es wird fast nichts anderes als offensichtliche Nebenwirkungen wie "Sie können Komponenten nicht trennen", "Komponententests ist der Schmerz in der Arsch "usw.

Was denkst du? Versuchen Sie immer, sich vom Overhead abzukoppeln?

Antwort

7

Es scheint mir Entkopplung und YAGNI sind sehr komplementäre Tugenden. (Ich habe gerade Robs Antwort bemerkt, und es scheint, als wären wir auf der gleichen Seite.) Die Frage ist, wie viel Entkopplung Sie tun sollten, und YAGNI ist ein guter Grundsatz, um die Antwort zu bestimmen. (Für diejenigen, die von Komponententests sprechen - wenn Sie entkoppeln müssen, um Ihren Komponententest zu machen, dann gilt YAGNI offensichtlich nicht.)

Ich bezweifle aufrichtig die Leute, die sagen, dass sie "immer" entkoppeln. Vielleicht tun sie das immer, wenn sie daran denken. Aber ich habe noch nie ein Programm gesehen, bei dem keine zusätzlichen Ebenen der Abstraktion hinzugefügt werden konnten, und ich bezweifle ernsthaft, dass es ein nicht-triviales Beispiel für ein solches Programm gibt. Jeder zeichnet irgendwo eine Linie.

Aus meiner Erfahrung habe ich Code entkoppelt und habe dann nie die zusätzliche Flexibilität ausgenutzt, so oft ich den Code gekoppelt habe und dann zurückgehen und ihn später ändern musste. Ich bin mir nicht sicher, ob das bedeutet, dass ich in beiden Richtungen ausgewogen oder gleich gebrochen bin.

2

Ich (fast) immer entkoppeln. Jedes Mal, wenn ich das tat, fand ich es nützlich, und (fast) jedes Mal, wenn ich es nicht tat, musste ich es später tun. Ich habe auch einen guten Weg gefunden, die Anzahl der Fehler zu reduzieren.

0

Nun, YAGNI ist wenig mehr als eine falsche simple Phrase, die Leute herumwerfen. Entkopplung ist jedoch ein ziemlich gut verstandenes Konzept. YAGNI scheint zu implizieren, dass man eine Art von Hellseher ist. Es ist nur Programmieren nach Klischee, was nie eine gute Idee ist. Um ehrlich zu sein, muss man argumentieren, dass YAGNI wahrscheinlich überhaupt nichts mit Entkoppelung zu tun hat. Die Kopplung ist in der Regel "schneller" und "Wer weiß, ob Sie eine entkoppelte Lösung benötigen, Sie werden die X-Komponente sowieso nicht ändern!"

+0

YAGNI impliziert, dass man _nicht_ irgendeine Art von psychischen ist - siehe http://c2.com/cgi/wiki?YouArentGonnaNeedIt –

+0

Ich weiß genau, was es ist, aber Sie spielen nur ein Spiel damit. Aber Sie zeigen, warum es im Grunde eine alberne Phrase ist. Wenn Sie darüber diskutieren wollen, ob YAGNI psychisches Kauderwelsch oder nur Kurzsichtigkeit ist, werde ich es nicht tun, weil das eine langweilige, fruchtlose Diskussion ist. – BobbyShaftoe

2

Entkopplung zur Entkopplung kann schlecht sein. Der Aufbau von testbaren Komponenten ist jedoch sehr wichtig.

Der schwierige Teil der Geschichte ist zu wissen, wann und wie viel Entkopplung Sie brauchen.

+0

Warum sagen Sie, dass die Entkoppelung dafür schlecht sein kann? – tddmonkey

+1

Ich meine Abkopplung ohne wirklichen Nutzen, aber einfach dafür, auch wenn es länger dauert. – cherouvim

+0

Sehr gut. Und wenn Sie Test Oriented Development (Sie sollten!) Verwenden, ist die Entkopplung sofort erforderlich. – Offirmo

0

Wie Ihr Tag sagt, ist es sehr subjektiv. Es beruht völlig auf Ihrer eigenen technischen Weisheit, um zu entscheiden, was Sie "nicht brauchen werden". Möglicherweise müssen Sie in einem Fall Kopplung, aber Sie werden nicht in einem anderen Fall. Wer soll es erzählen? Sie, natürlich.

Für eine so subjektive Entscheidung kann es keine Leitlinie geben.

+0

Danke für die Antwort, ich bin nicht auf der Suche nach einer Leitlinie wie gesagt Ich bin neugierig auf was andere Leute tun. Was ist deine Idee zu dem Thema und wann/in welchen Fällen bist du so gefallen und fühlst dich nicht danach. Entschuldigung, wenn das in der Frage nicht klar war. –

2

Ich würde sagen, sie nicht. Bei der Entkopplung geht es darum, unnötige Abhängigkeiten im Code zu reduzieren und Zugriffe durch saubere, klar definierte Schnittstellen zu straffen. "Sie werden es nicht brauchen" ist ein nützliches Prinzip, das generell von einer zu großen Erweiterbarkeit und einer zu breiten Architektur einer Lösung abrät, in der es keinen offensichtlichen und aktuellen Anwendungsfall gibt.

Das praktische Ergebnis davon ist, dass Sie ein System haben, wo es viel einfacher ist, einzelne Komponenten zu refaktorieren und zu warten, ohne unbeabsichtigt einen Welleneffekt über die gesamte Anwendung zu verursachen, und wo es keine unnötig komplizierten Aspekte gibt einfach, wie es erforderlich ist, um die aktuellen Anforderungen zu erfüllen.

0

YAGNI das Durcheinander :) ... wirklich, wir müssen nicht den ganzen Code gemischt haben, um "schneller" zu gehen.

Die Komponententests helfen wirklich zu fühlen, wenn es gekoppelt ist (vorausgesetzt, man versteht gut, was ist ein Komponententest im Vergleich zu anderen Arten von Tests). Wenn Sie es stattdessen mit der Denkweise "Sie können keine Komponenten trennen" tun, können Sie leicht Dinge hinzufügen, die Sie nicht brauchen :)

Ich würde sagen, dass YAGNI kommt, wenn Sie beginnen, Verdrehen und Ändern der Logik alle über die tatsächlichen Nutzungsszenarien hinaus, die die aktuelle Implementierung erfordert. Sagen wir, Sie haben Code, der einige externe Zahlungsanbieter verwendet, die beide mit Weiterleitungen zu einer externen Site arbeiten. Es ist in Ordnung, ein Design zu haben, das alles sauber hält, aber ich denke nicht, dass es in Ordnung ist, an Anbieter zu denken, von denen wir nicht wissen, ob sie jemals unterstützt werden, die die Integration und die damit verbundenen Probleme unterschiedlich behandeln Arbeitsablauf.

1

Wenn "Unit Testing ist ein Schmerz in den Arsch" dann würde ich sagen, dass Sie tun brauchen es. Die meiste Zeit kann die Entkopplung mit praktisch Null Kosten erreicht werden, also warum möchten Sie es nicht tun?

Des Weiteren einer meiner größten bugbears, wenn sie auf einer neuen Code-Basis arbeitet mit dem Code zu entkoppeln, bevor ich Unit-Tests zu schreiben beginnen, wenn die Einführung einer Schnittstelle irgendwo oder Injektion Verwendung von Abhängigkeits viel Zeit sparen könnte

+0

Wie würden Sie die Entkopplung praktisch ohne Kosten erreichen? Das ist mir fast unmöglich. Ich bin neugierig, weil ich glaube, dass die meisten Leute der Meinung sind, dass eine Entkopplung ziemlich schwer zu erreichen ist. Besonders wenn selbst einfachste Dinge wie das Lesen einer Konfiguration dep erfordern. Injektion –

+0

Die Abhängigkeitsinjektion sollte als eine Selbstverständlichkeit durchgeführt werden (und wird sein, wenn Sie Unit-Tests richtig durchführen). Sie benötigen keinen DI-Container, um dies zu erreichen, sehen jedoch, dass Sie einen Standardcode schreiben, um dies zu erreichen. Guice gibt Dir DI mit sehr wenig Setup und lässt sich recht einfach nachrüsten – tddmonkey

4

YAGNI ist eine Faustregel (keine Religion). Entkopplung ist mehr oder weniger eine Technik (auch keine Religion). Sie sind also nicht wirklich verwandt, noch widersprechen sie sich.

YAGNI ist über Pragmatismus. Angenommen, du brauchst nichts, bis du es tust.

Normalerweise angenommen, YAGNI führt zur Entkopplung. Wenn Sie dieses Messer überhaupt nicht anwenden, gehen Sie davon aus, dass Sie Klassen brauchen, die alles über das Verhalten des anderen wissen, bevor Sie bewiesen haben, dass das wahr ist.

"Decouple" (oder "lose paar") ist ein Verb, so dass es Arbeit erfordert. YAGNI ist eine Vermutung, für die Sie sich anpassen, wenn Sie feststellen, dass es nicht mehr wahr ist.

Verwandte Themen