2015-05-12 23 views
6

Często widzę w DDD termin Invariants. Here Dino Esposito mówi o tym. Jeśli spojrzę na bibliotekę .NET, widzę klasę ValidationAttribute. Czy zmienne Invariants i są takie same? Na przykład, czy mogę powiedzieć: 50% rabatu jest dostępne tylko, jeśli suma zamówień przekracza 250 USD jest niezmiennikiem?Jaka jest różnica między niezmiennikami a regułami sprawdzania poprawności?

A może są one różne w przypadku, gdy niezmienniki mają chronić obiekt przed utratą ważności, a sprawdzanie poprawności ma na celu sprawdzenie poprawności obiektu, nawet po zmianie jego stanu (może to być stan ważny lub nieprawidłowy)? W powyższym przykładzie, jeśli używam niezmienników, sprawdzam dla niezmiennika przed aktualizacją rabatu, a w przypadku sprawdzania poprawności stosuję 50% rabatu, a następnie sprawdzam jego ważność (obiekt jest już w stanie niepoprawnym).

Odpowiedz

8

Absolutnie, walidacja to proces zatwierdzania danego stanu obiektu, podczas gdy niezmienne wykonanie ma miejsce zanim ten stan zostanie osiągnięty.

Następstwem tego jest fakt, że niezmienne egzekwowanie jest najlepiej wykonywane przez rzecz, która jest mutowana (lub tworzona) sama, jak odruch samoobrony, podczas gdy walidacja jest zwykle wykonywana przez osobę trzecią.

Szkoła myśli Always valid zaleca stosowanie niezmienników przez walidację. Myślę, że idealnie pasuje do DDD i Aggregates.

+3

Istnieje jednak kilka osób, które nie będą uznawać podstawowych zasad sprawdzania poprawności za niezmienniki domeny, ponieważ są to reguły zwykle związane z ograniczeniami technicznymi. Na przykład, maksymalna długość adresu e-mail nie może być uważana za niezmienną przez niektórych praktyków DDD, ponieważ firma nie dba o długość wiadomości e-mail, ale jest praktycznym ograniczeniem technicznym (np. 'varchar (500)' w DB, ponieważ nie można użyć 'varchar (max)' dla każdego pola lub maksymalny rozmiar wiersza każdego DB byłby przepełniony). – plalx

+0

Dlatego można argumentować, że 'email.length <= 500' nie jest niezmiennikiem i może zdecydować o przekazaniu czeku do bazy danych. Jednak większość bloków danych nie wskaże nawet, która kolumna została przepełniona, co może być argumentem za egzekwowaniem reguły w domenie. – plalx

+0

Ponieważ to rozróżnienie jest wyraźne między "niezmiennikami" i "zatwierdzeniem", czy "niezmienniki" można również nazwać "specyfikacjami"? Myślę raczej o testowaniu obiektów domenowych przeciwko "niezmiennikom". –