Refactoring im domänengesteuerten Design [geschlossen]

10

Ich habe gerade angefangen, an einem Projekt zu arbeiten, und wir verwenden domänengesteuertes Design (wie von Eric Evans in Domain -gesteuertes Design definiert : Komplexität im Herzen von Software angehen . Ich glaube, dass unser Projekt sicherlich ein Kandidat für dieses Design ist Muster, wie Evans es in seinem Buch beschreibt.

Ich kämpfe mit der Idee, ständig umzugestalten.

Ich weiß, dass Refactoring in jedem Projekt eine Notwendigkeit ist und unvermeidlich sein wird, wenn sich die Software ändert. Nach meiner Erfahrung tritt Refactoring jedoch auf, wenn sich die Anforderungen des Entwicklungsteams ändern, und nicht, wenn sich das Verständnis der Domäne ändert ("Refactoring zu größeren Einsichten", wie Evans es nennt). Ich bin am meisten besorgt über Durchbrüche beim Verständnis des Domänenmodells. Ich verstehe kleine Änderungen, aber was ist, wenn eine große Änderung im Modell erforderlich ist?

Was ist ein effektiver Weg, um sich (und andere) davon zu überzeugen, dass Sie einen Refactor durchführen sollten, nachdem Sie ein klareres Domain-Modell erhalten haben? Schließlich könnte das Refactoring zur Verbesserung der Codeorganisation oder -leistung völlig unabhängig davon sein, wie aussagekräftig der allgegenwärtige Sprachcode ist. Manchmal scheint es einfach nicht genug Zeit zu geben, um umzugestalten.

Glücklicherweise eignet sich SCRUM für das Refactoring. Die iterative Natur von SCRUM macht es einfach, ein kleines Stück zu bauen und es zu ändern. Aber mit der Zeit wird dieses Stück größer und was ist, wenn Sie einen Durchbruch haben, nachdem dieses Stück so groß ist, dass es zu schwierig ist, es zu ändern?

Hat jemand an einem Projekt mit domänengesteuertem Design gearbeitet? Wenn ja, wäre es großartig, einen Einblick in diese zu bekommen. Ich würde besonders gerne einige Erfolgsgeschichten hören, da es sehr schwierig zu sein scheint, DDD richtig zu machen.

Vielen Dank!

Andrew Whitaker
quelle
Wenn Sie Code schreiben, von dem Sie nicht glauben, dass Sie ihn jemals ändern können, unabhängig von der Größe, hören Sie auf.
JeffO
@ Jeff: Es geht nicht darum, es nicht ändern zu können, es geht um die Zeit und die Ressourcen, die erforderlich sind, um es zu ändern, wenn Code hinzugefügt wird.
Andrew Whitaker
2
Wenn Sie Code hinzufügen und wissen, dass der vorhandene Code überarbeitet werden muss, und dies nicht tun, gehen Sie ein Risiko ein. Das heißt nicht, dass es nicht funktionieren wird.
JeffO

Antworten:

9

Ich bin seit einiger Zeit ein großer Fan von DDD (mit und ohne Sicherheitsnetz eines Test-Frameworks).

Das gesamte Konzept und der Lebenszyklus des Refactorings ändern sich nicht, da Sie jetzt eine neue Entwurfsmethode verwenden. Wenn es viel Zeit in Anspruch nimmt, muss es einen proportionalen Nutzen für das Projekt haben, um diese Zeit vom Management zu erhalten.

In Bezug darauf: In einem Fall nahm ich an einem dreimonatigen umfassenden Refactoring teil, weil das Verständnis des Domain-Modells „ durchgebrochen“ war . Es waren Tests erforderlich, um das aktuelle Verhalten zu überprüfen, Tests, um das erwartete Verhalten zu überprüfen, und Änderungen am aufrufenden Code. Die Vorteile waren jedoch erheblich und ermöglichten es dem Unternehmen, viele weitere Dinge zu tun, die es zuvor tun musste, aber einfach nicht konnte. Im Wesentlichen war das Refactoring im Wesentlichen ein „Merkmal“.

Steven Evers
quelle
Ich bin froh zu hören, dass es Ihnen gelungen ist, einen so großen Refactor zu bauen. Es ist auch gut zu hören, dass Sie zunächst eine so große Änderung vornehmen mussten. Dies ist die Art von Refactor, von der ich spreche. Monate lang mit großer Wirkung.
Andrew Whitaker
Refactoring als Feature ist eines, an das ich mich erinnern werde.
Filip Dupanović
5

Refactoring in Domain Driven Design basiert meiner Meinung nach auf einem Bedürfnis, nicht auf einem "netten" Refactor. Sobald Sie ein falsches Domänenmodell identifizieren, repräsentiert der Code / das System nicht das Problem der realen Welt.

In diesem Fall haben wir kürzlich an einer Anwendung mit angemessener Domänenkomplexität gearbeitet. Es war ein Abrechnungs- / Vertragssystem, und wir führten eine neue Art von Tarif ein. Wir verwendeten einen agilen Prozess, 2 Wochen Scrums um genau zu sein.

Zunächst stellten wir im Modell fest, dass die beiden Sätze völlig getrennt waren und keine Beziehung hatten, außer durch den Vertrag. Als wir jedoch mehr Geschichten fertigstellten, stellten wir fest, dass sie tatsächlich gleich waren, insbesondere als wir anfingen, die neue Rate als alte zu verpacken, nur um sie zum Laufen zu bringen. Dies war das erste Warnzeichen.

Um die Geschichte kurz zu machen, wir konnten 90% der Geschichten mit dem falschen Modell erstellen, aber wir kamen zu dem Punkt, an dem wir in jedem Teil des Codes entweder die neue Rate als alte verpackten und / oder Erstellen, wenn newRate sonst oldRate JEDER wo. Wir schlugen unsere Köpfe gegen die sprichwörtliche Mauer. Wir waren in der Mitte dieses Teils des Projekts und wussten, dass die Zeit bis zur Fertigstellung exponentiell oder mit dem falschen Domänenmodell nicht umsetzbar sein wird. Also haben wir die Kugel gebissen, eine Geschichte in acht andere Geschichten aufgeteilt und das Domain-Modell überarbeitet.

Als wir das Projekt abgeschlossen hatten, wussten wir im Nachhinein, dass es das Richtige und das EINZIGE war, um es richtig zu machen.

Hat es einige Zeit gedauert? Ja, aber wenn wir es nicht getan hätten, hätte es mehr Zeit gedauert. Wurde DDD richtig gemacht? Komischerweise wussten wir damals noch nichts über DDD, aber kurz nachdem wir einen DDD-Workshop von Eric Evans besucht hatten, konnten ich und meine Kollegen nur den Weg durchnicken. Ich denke, wenn wir DDD kennen würden, hätten wir den Refactor viel früher abgeholt und dadurch mehr Zeit gespart.

SBasir
quelle
Gute Antwort. Wir machen alle paar Monate etwas Ähnliches durch. Schön zu wissen, dass wir nicht alleine sind!
Andrew Whitaker
3

Wenn im Domain-Modell etwas nicht stimmt, ist es wichtig, es zu korrigieren. Nach meiner Erfahrung haben wir ein wenig übersehen, wie sich das Domänenmodell mit den verschiedenen Entitäten verbindet, als wir einige davon implementiert haben.

Dies führte dazu, dass die Leute früher so modellierten, wie es nicht beabsichtigt war, und so andere Teile des Modells brachen, um zu versuchen, "es zum Laufen zu bringen".

Sobald Sie feststellen, dass im Domain-Modell etwas nicht stimmt, ändern Sie es so schnell wie möglich. Je länger es dauert, bis Sie es umgestalten, desto schwieriger wird es, Änderungen in Bezug auf die Benutzer vorzunehmen, deren mentale Modelle jetzt angepasst werden.

Morten
quelle
3

Für einige Teile des Codes ist kontinuierliches Refactoring übertrieben. Für einen anderen Teil des Codes (in DDD ist die sogenannte Core Domain ) eine Notwendigkeit. Wenn Sie verstehen, dass der Code nicht so ist, wie er sein sollte, wird der Entwickler zusätzlich kognitiv belastet (der Unterschied zwischen unserem Verständnis der Domäne und der aktuellen Implementierung), was weitere Entwicklungen schwieriger und / oder teurer macht.

Die Frage ist: "Werden diese Entwicklungen benötigt?". In der Kerndomäne (dem Bereich, der einen geschäftlichen Unterschied macht) lautet die Antwort "Ja!". Weil dies der Trank der Domäne ist, um die sich das Unternehmen mehr kümmert und der für die Stakeholder einen Unterschied macht. Dies ist der Ort, an dem Sie Ihren Code in perfekter Form halten möchten, um die nächste Anforderung aufgrund der Flexibilität Ihres Domänenmodells mit minimalem Aufwand zu implementieren.

Dies wird jedoch teuer, wenn es auf den gesamten Anwendungscode angewendet wird . Bereiche, die für das Unternehmen nicht so wichtig sind ( unterstützende oder generische Subdomains im DDD-Jargon), erfordern möglicherweise einen weniger ausgefeilten Ansatz als den für den Kern reservierten.

ZioBrando
quelle