Wykorzystanie ArchUnit w projektach Java umożliwia precyzyjne definiowanie zależności między różnymi komponentami aplikacji. Dzięki temu możemy zadbać o to, aby architektura systemu była nie tylko spójna, ale również zgodna z naszymi założeniami projektowymi. Zdefiniowanie reguł dotyczących zależności jest pierwszym krokiem do zapewnienia wysokiej jakości kodu oraz łatwiejszego zarządzania jego ewolucją.

ArchUnit pozwala na definiowanie reguł w prosty sposób za pomocą ich własnego DSL (Domain-Specific Language).Oto kilka kluczowych konceptów, które warto uwzględnić:

  • Pakiety i ich struktura: Możesz zdefiniować, które pakiety mogą komunikować się ze sobą i w jaki sposób.
  • Rodzaje zależności: Możesz kontrolować zależności między klasami (np. z jakich klas mogą korzystać kontrolery).
  • Modyfikacje reguł: Dzięki elastyczności ArchUnit, łatwo jest modyfikować reguły w miarę rozwoju aplikacji.

Przykładowa reguła, która może być zdefiniowana w ArchUnit, to zakaz korzystania z konkretnego pakietu w klasach z niskiej warstwy aplikacji. Oto jak to zrobić:


import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;

classes().that().resideInAPackage("..controller..")
    .should().notDependOnClassesThat().resideInAPackage("..service..");

Kolejnym sposobem na definiowanie zależności jest określenie, które klasy mogą być używane tylko przez specyficzne pakiety. To pozwala na skuteczne ograniczenie nieświadomego łamania architektury naszej aplikacji.

Typ zależnościPrzykład zastosowania
Końcowe pakietyLogika biznesowa powinna zależeć tylko od usług, nie odwrotnie
Użycie interfejsówKlasy implementujące interfejsy nie mogą zależeć od ich szczegółów implementacji

Pamiętaj, że dobrze zdefiniowane reguły zależności w projekcie nie tylko pomagają w utrzymaniu spójności architektury, ale również zwiększają zrozumienie kodu w zespole, ułatwiają refaktoryzację oraz pomagają w eliminacji technicznego długu.