Value Object
Das Value Object (auch Wertobjekt) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster. Wertobjekte sind unveränderbare Objekte, die einen speziellen Wert repräsentieren. Soll der Wert geändert werden, so muss ein neues Objekt generiert werden.[1] Das Entwurfsmuster wird dazu genutzt, Objektvergleiche auf deren Attributwerte zu beziehen, anstatt auf Objektidentität.[2]
Erklärung
[Bearbeiten | Quelltext bearbeiten ]Für spezielle Werte kann es sinnvoll sein, diese als Objekte einer eigenen Klasse zu verwenden. Häufig verwendet wird dieses Entwurfsmuster beispielsweise für Geldbeträge oder Datumsangaben. Bei diesen komplexeren Datentypen können den jeweiligen Klassen von Beginn an eigene Methoden und Eigenschaften mitgegeben werden, die das spätere Arbeiten mit dem Wertobjekt vereinfachen.
Wertobjekte haben, nach der Definition von Eric Evans[3] , drei fundamentale Eigenschaften:
- Wertobjekte haben keine Identität
- Wertobjekte sind nicht veränderbar
- Wertobjekte werden immer in einem gültigen Zustand erzeugt
Beispiele
[Bearbeiten | Quelltext bearbeiten ]Datum
[Bearbeiten | Quelltext bearbeiten ]Die Klasse "Datum" besitzt die Methoden "getYear()" und "getEuropeanDate()" – diese erleichtern den Umgang mit Objekten vom Typ "Datum".
Beispiel (Java)
[Bearbeiten | Quelltext bearbeiten ]- Wertobjekt-Klasse Money (Geld)
importjava.math.BigDecimal; importjava.util.Currency; importjava.util.Objects; publicfinalclass Money{ privatefinalBigDecimalamount; privatefinalCurrencycurrency; publicMoney(BigDecimalamount,Currencycurrency){ Objects.requireNonNull(amount,"amount should be not null"); Objects.requireNonNull(currency,"currency should be not null"); this.amount=amount; this.currency=currency; } publicBigDecimalgetAmount(){ returnthis.amount; } publicCurrencygetCurrency(){ returnthis.currency; } publicMoneyadd(Moneyother){ if(other==null||other.currency!=currency)thrownewIllegalArgumentException("Can't add "+other); returnnewMoney(amount.add(other.amount),currency); } @Override publicbooleanequals(Objectobj){ if(obj==null||getClass()!=obj.getClass()) returnfalse; Moneyother=(Money)obj; returnamount.equals(other.amount)&¤cy.equals(other.currency); } }
Weblinks
[Bearbeiten | Quelltext bearbeiten ]- Erklärung mit Beispielen (PDF; englisch)
- Erklärung mit Beispielen (deutsch)
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten ]- ↑ 4.4 Klassen von Werten und Klassen von Objekten. Rheinwerk Computing – Praxisbuch Objektorientierung; abgerufen am 31. August 2015
- ↑ Karl Eilebrecht, Gernot Starke: Patterns kompakt. 4. Auflage. Springer Vieweg Verlag, Berlin 2013, ISBN 978-3-642-34717-7, S. 195–197.
- ↑ heise.de - Einhaltung von Invarianten mit dem Value Object Pattern Abgerufen am 28. März 2016.
Abstrakte Fabrik | Erbauer | Fabrikmethode | Prototyp | Singleton | Multiton | Objektpool
Adapter | Brücke | Decorator | Fassade | Fliegengewicht | Kompositum | Stellvertreter
Beobachter | Besucher | Interpreter | Iterator | Kommando | Memento | Schablonenmethode | Strategie | Vermittler | Zustand | Zuständigkeitskette | Interceptor | Nullobjekt | Protokollstapel
relationale Abbildung
Datentransferobjekt | Table Data Gateway | Row Data Gateway | Active Record | Unit of Work | Identity Map | Lazy Loading | Identity Field | Dependent Mapping | Embedded Value | Serialized LOB | Inheritance Mapper | Metadata Mapping | Query Object | Command-Query-Responsibility-Segregation
übermittlungsmuster
File Transfer | Shared Database | Remote Procedure Invocation | Messaging
Message | Command Message | Document Message | Event Message | Request-Reply | Return Address | Correlation Identifier | Message Sequence | Message Expiration | Format Indicator
Message Endpoint | Messaging Gateway | Messaging Mapper | Transactional Client | Polling Consumer | Event-driven Consumer | Competing Consumers | Message Dispatcher | Selective Consumer | Durable Subscriber | Idempotent Receiver | Service Activator
Message Channel | Point-to-Point Channel | Publisher-Subscriber Channel | Datatype Channel | Invalid Message Channel | Dead Letter Channel | Guaranteed Delivery | Channel Adapter | Messaging Bridge | Message Bus
Pipes-and-Filters | Message Router | Content-based Router | Message Filter | Dynamic Router | Recipient List | Splitter | Aggregator | Resequencer | Composed Message Processor | Scatter-Gather | Routing Slip | Process Manager | Message Broker
Message Translator | Envelope Wrapper | Content Enricher | Content Filter | Claim Check | Normalizer | Canonical Data Model
Control Bus | Detour | Wire Tap | Message History | Message Store | Smart Proxy | Test Message | Channel Purger
Application Controller | Business Delegate | Data Access Object | Dependency Injection | Extension Interface | Fluent Interface | Inversion of Control (IoC) | Lock | Model View Controller (MVC) | Model View Presenter (MVP) | Model View Update (MVU) | Model View ViewModel (MVVM) | Page Controller | Registry | Remote Facade | Repository | Service Locator | Session State | Table Module | Template View | Threadpool | Transaction Script | Transform View | Two-Step View | Value Object