Jak powinna wyglądać encja

Nie jest idealna bo to by zależało od kontekstu, ale omówię kilka elementów i opiszę dlaczego “właśnie tak”.

To jest obiektowy język Java + annotacje pozwalające korzystać z ORM.

@Entity(name = "traders")
public class Trader {

    @Getter
    @EmbeddedId
    TraderId id;

    @Getter
    @NotNull
    String fullName;

    // default constructor for Hibernate
    protected Trader() {
    }

    private Trader(TraderId id, String newFullName) {
        // validate not null, non blank

        this.id = id;
        this.fullName = newFullName;
    }

    public static Trader create(String fullName) {
        TraderId traderId = TraderId.createNew();
        return new Trader(traderId, fullName);
    }

    void updateFullName(String newFullName) {
        this.fullName = newFullName;
    }

}

Annotacje ORMa w kodzie encji

Niektórzy uważają że tak nie jest “czysto”, ja nie uważam tego za problem, przyspiesza kodowanie, nie sprawia problemów.

Używanie getterów explicite

Można by ustawić @Getter na całej klasie, ale uważam to za złe podejście. To nie jest torba na propertiesy tylko świadomie udostępniamy rzeczy.

Explicite statyczne metody tworzące obiekt

(jak to ^ lepiej nazwać?)

public static Trader create(String fullName)

pozwala nam nie myśleć o konstruktorze i ukryć część detali związanych z budowaniem obiektu.

Takich metod może być kilka w zależności od potrzeb.

Explicite konstructor z walidacjami

Gdzieś trzeba to wszystko zwalidować. Najlepiej w jednym wspólnym miejscu.

Metody zmieniające stan

updateFullName()

Nie używamy setterów z lombocka. Będą sytuację, kiedy trzeba zrobić zmiany w kilku zależnych polach, np

void updateRange(Date from, Date to) {
    // check if (from < to) and throw exception if not
    // ...
}

(Zauważyłeś, że to może być Value Object “DateRange” - to dobrze)

Albo zmienić tylko jedno pole, ale najpierw trzeba zwalidować stan obiektu.

Written on April 24, 2024