Obiekt wartościowy

W informatyce obiekt wartości to mały obiekt reprezentujący prostą jednostkę , której równość nie jest oparta na tożsamości : tj. dwa obiekty wartości są równe , gdy mają tę samą wartość , niekoniecznie będąc tym samym obiektem .

Przykładami obiektów wartości są obiekty reprezentujące kwotę pieniędzy lub zakres dat.

Będąc małym, można mieć wiele kopii tego samego obiektu wartości, które reprezentują tę samą jednostkę : często łatwiej jest utworzyć nowy obiekt niż polegać na pojedynczej instancji i używać do niej odniesień.

Obiekty wartości powinny być niezmienne : jest to wymagane w przypadku niejawnej umowy, zgodnie z którą dwa utworzone obiekty wartości powinny pozostać równe. Przydatne jest również, aby obiekty wartości były niezmienne, ponieważ kod klienta nie może ustawić obiektu wartości w nieprawidłowym stanie ani wprowadzić błędnego zachowania po utworzeniu instancji.

Obiekty wartości są jednymi z elementów składowych DDD .

Realizacja

Ze względu na niuanse różnych obiektowych języków programowania , każdy z nich ma swoje własne metody i wzorce implementacji i wykorzystania obiektów wartości.

C#

W języku C # klasa jest typem referencyjnym , podczas gdy struktura (koncepcja wywodząca się ze struktury w języku C ) jest typem wartościowym. Dlatego instancja wywodząca się z definicji klasy jest obiektem, podczas gdy instancja wywodząca się z definicji struktury jest obiektem wartości (a dokładniej, struktura może być niezmienna, aby reprezentować obiekt wartości deklarujący atrybuty jako tylko do odczytu ) .

Można wykonać następującą procedurę, aby dodać właściwości obiektu wartości do klasy języka C#:

  1. Zastąp metodę Object.Equals , aby upewnić się, że obiekt jest porównywany przy użyciu logiki biznesowej
  2. Operator przeciąża domyślne zachowanie == i != , aby użyć metody Equals .
  3. Zastąp metodę Object.GetHashCode i upewnij się, że skrót jest taki sam dla obiektów, które mają taką samą równość.
  4. Uczyń klasę niezmienną, usuwając wszelkie metody ustawiające właściwości i przekazując tylko wartości składowe przez konstruktory.

C++

W C++ obiekt wartości można zbudować, przeciążając operator przypisania i stosując odpowiednie ograniczenia constness na polach (które zostaną ocenione raz przez listę inicjalizacyjną konstruktora) oraz na metodach klasy.

Jeśli jednak same pola są zadeklarowane jako const (zamiast używać pól innych niż stałe, ujawniając tylko akcesory „pobierające”), nie będzie możliwe pełne zastąpienie takiego obiektu wartości innym obiektem (obiekt1 = obiekt2 ) .

Jawa

W przeciwieństwie do C# i C++ Java nie obsługuje niestandardowych typów wartości na poziomie języka. Każdy typ niestandardowy jest typem referencyjnym, a zatem ma semantykę tożsamości i referencyjną, chociaż rozważane jest rozszerzenie obsługi niestandardowych typów wartości.

Dlatego programiści Javy emulują obiekty wartości, tworząc niezmienne obiekty, ponieważ jeśli stan obiektu się nie zmienia, przekazywanie referencji jest semantycznie równoważne z kopiowaniem obiektów wartości.

Klasę można uczynić niezmienną, deklarując wszystkie atrybuty blank final i deklarując, że wszystkie atrybuty są typu niezmiennego (takiego jak String , Integer lub dowolnego innego typu zadeklarowanego zgodnie z tymi regułami), a nie typu zmiennego, takiego jak ArrayList lub nawet Data . _ Powinni także zdefiniować equals i hashCode, aby porównywać wartości, a nie referencje.

Termin „VALJO” (VALue Java Object) został ukuty w odniesieniu do bardziej rygorystycznego zestawu reguł niezbędnych dla prawidłowo zdefiniowanego obiektu wartości niezmiennych.

Obiekty wartości są dostępne od wersji Java 14 jako rekordy danych

Przykład

  

        
    
          
          
    

          
          
 public  class  AdresUlicy  {  publiczny  AdresUlicy  (  string  ulica  ,  string  miasto  )  {  Ulica  =  ulica  ;  miasto  =  miasto  ;  }  publiczny  ciąg  końcowy  Ulica  {  get  ;  }  publiczny  ciąg  końcowy  Miasto  {  get  ;  }  } 

Zobacz też