2013-05-23 10 views
15

Fowlers Buch Refactoring listet "Data Class" als Code-Geruch auf. Wenn jedoch eine Einheit eine Methode testet, werden Wertobjekte, z. Datenübertragungsobjekte, machen das Testen viel einfacher, als zu versuchen, den Zustand innerhalb einer Klasse einzurichten oder zu untersuchen.Ist "Datenklasse" wirklich ein Code-Geruch?

Es fällt mir auf, dass die Test Driven Development-Methode auf der Idee beruht, dass einfach zu schreibende Tests ein Hinweis darauf sind, dass die Schnittstelle sauber und die Methode kohärent ist. Rein idempotente Methoden sind am einfachsten zu testen und am einfachsten wiederzuverwenden. Warum ist eine Datenklasse also eine schlechte Sache? Die empfohlene Lösung besteht darin, das Verhalten in die Datenklasse zu verschieben, aber warum sollte ein Wertobjekt ein Verhalten benötigen?

Antwort

10

Ich glaube nicht, dass die Datenklassen die gleichen wie Wertobjekte sind. Wertobjekte sind normalerweise unveränderlich - wie Länge oder Geld. Die "Datenklassen", auf die sich Fowler bezieht, sehen aus wie anämische Domänenmodelle - d. H. Taschen von Gettern und Setter.

Daher ist es in Ordnung, ein Wertobjekt an eine Methode zu übergeben, aber definitiv keine anämischen Domänenmodelle. Dies liegt daran, dass die Methode einen unangemessenen Vorteil hat, mehrere Dinge zu mutieren - und höchstwahrscheinlich das Muster der einfachen Verantwortlichkeit verletzen würde.

Der Fall mit unveränderbaren Datenklassen:

In einem solchen Fall würde ich empfehlen, eine Mapper Schicht, die die gemeinsam genutzten Einrichtungen zu einem reichen Domain-Modell und umgekehrt abbilden würde. Ihr Code wird sich hauptsächlich mit den Rich-Domain-Modellen befassen. Die Idee besteht nicht darin, Ihre Serviceklassen mit zu viel Geschäftslogik zu überlasten, da dies der Wiederverwendung und Testbarkeit von Code abträglich wäre. Natürlich ist Design mehr eine Kunst - und es gibt nicht nur ein Schwarz und ein Weiß. Datenklassen sind unverzichtbar als DTOs oder gemeinsame nicht veränderbare Einheiten, wie Sie gesagt haben. Ein robustes domänengesteuertes Design würde diese jedoch sparsam einsetzen und ihren Footprint auf der Codebasis minimieren.

+0

Was ist, wenn mein Domänenmodell nicht ausschließlich meine Domäne ist? Damit meine ich, dass ich mit Entitäten aus einem Unternehmensdatenmodell arbeiten muss, die aus einer Datenbank abgerufen werden. Sollte eine Datenklasse, die die Entität repräsentiert, kein eigenes Verhalten haben, anstatt diese Verantwortung an Serviceobjekte zu delegieren, die ich zur Verfügung stelle? –

+1

Die Antwort ist ein bisschen lang, also habe ich die Antwort bearbeitet. Übrigens ausgezeichnete Frage. – aquaraga

Verwandte Themen