Arten von Objekten
Lassen Sie uns zu Zwecken unserer Diskussion unsere Objekte in drei verschiedene Arten unterteilen:
Dies sind die Objekte, die die Arbeit erledigen. Sie transferieren Geld von einem Girokonto auf ein anderes, erfüllen Aufträge und alle anderen Aktionen , die von Unternehmenssoftware erwartet werden.
Domänenlogikobjekte erfordern normalerweise keine Accessoren (Getter und Setter). Stattdessen erstellen Sie das Objekt, indem Sie die Abhängigkeiten über einen Konstruktor übergeben und das Objekt dann über Methoden bearbeiten (Tell, Don't Ask).
Datenübertragungsobjekte sind reine Zustände. Sie enthalten keine Geschäftslogik. Sie werden immer Accessoren haben. Sie können Setter haben oder auch nicht, je nachdem, ob Sie sie unveränderlich schreiben oder nicht . Sie werden entweder Ihre Felder im Konstruktor festlegen und deren Werte werden sich während der Lebensdauer des Objekts nicht ändern, oder Ihre Zugriffsmethoden werden gelesen / geschrieben. In der Praxis sind diese Objekte normalerweise veränderbar, sodass ein Benutzer sie bearbeiten kann.
Ansichtsmodellobjekte enthalten eine anzeigbare / bearbeitbare Datendarstellung. Sie können Geschäftslogik enthalten, die normalerweise auf die Datenüberprüfung beschränkt ist. Ein Beispiel für ein View Model-Objekt kann ein InvoiceViewModel sein, das ein Customer-Objekt, ein Invoice Header-Objekt und Rechnungsposten enthält. View Model-Objekte enthalten immer Accessoren.
Die einzige Art von Objekt, die in dem Sinne "rein" ist, dass sie keine Feldzugriffsmethoden enthält, ist das Domain Logic-Objekt. Durch die Serialisierung eines solchen Objekts wird sein aktueller "Berechnungsstatus" gespeichert, sodass er später abgerufen werden kann, um die Verarbeitung abzuschließen. Ansichtsmodelle und DTOs können frei serialisiert werden, aber in der Praxis werden ihre Daten normalerweise in einer Datenbank gespeichert.
Serialisierung, Abhängigkeiten und Kopplung
Zwar entstehen durch die Serialisierung Abhängigkeiten in dem Sinne, dass Sie eine Deserialisierung für ein kompatibles Objekt durchführen müssen, doch müssen Sie die Serialisierungskonfiguration nicht unbedingt ändern. Gute Serialisierungsmechanismen sind allgemeine Zwecke. Es ist ihnen egal, ob Sie den Namen einer Eigenschaft oder eines Mitglieds ändern, solange sie den Mitgliedern noch Werte zuordnen können. In der Praxis bedeutet dies nur, dass Sie die Objektinstanz erneut serialisieren müssen, um die Serialisierungsdarstellung (xml, json usw.) mit Ihrem neuen Objekt kompatibel zu machen. Es sollten keine Konfigurationsänderungen am Serializer erforderlich sein.
Es ist richtig, dass sich Objekte nicht damit befassen sollten, wie sie serialisiert werden. Sie haben bereits eine Möglichkeit beschrieben, wie solche Bedenken von den Domänenklassen abgekoppelt werden können: Reflexion. Der Serialisierer sollte sich jedoch Gedanken darüber machen, wie er Objekte serialisiert und deserialisiert. das ist schließlich seine Funktion. Sie können Ihre Objekte vom Serialisierungsprozess entkoppeln, indem Sie die Serialisierung zu einer Allzweckfunktion machen , die für alle Objekttypen geeignet ist .
Verwirrung stiftet unter anderem, dass die Entkopplung in beide Richtungen erfolgen muss. Es tut nicht; es muss nur in eine richtung funktionieren . In der Praxis kann man sich niemals vollständig entkoppeln. es gibt immer eine Kopplung. Das Ziel der losen Kopplung besteht darin, die Pflege des Codes zu vereinfachen und nicht alle Abhängigkeiten zu beseitigen.