Architekturregeln mit falschem und richtigem Code

Diese Datei zeigt Architekturregeln nicht abstrakt, sondern mit Gegenbeispiel und Korrektur.

← Zurueck zum Index

Regel 1: Domain darf Spring nicht importieren

Warum

Domain wird frameworkabhaengig

Falsch

import org.springframework.stereotype.Service;

@Service
public class Order { }

Richtig

public final class Order {
    // keine Framework-Annotationen
}

Pruefung

grep -R "org.springframework" maven-project/domain/src || true
Regel 2: Application kennt keine JDBC-Klassen

Warum

Use Case wird Infrastrukturcode

Falsch

public class AcceptOrderUseCase {
    private JdbcTemplate jdbc;
}

Richtig

public class AcceptOrderUseCase {
    private final OrderRepository orders;
}

Pruefung

grep -R "org.springframework" maven-project/domain/src || true
Regel 3: Adapter implementiert Port

Warum

Infrastruktur wird austauschbar

Falsch

public class JdbcOrderRepository { }

Richtig

public final class JdbcOrderRepository implements OrderRepository {
    public void save(Order order) { }
}

Pruefung

grep -R "org.springframework" maven-project/domain/src || true
Regel 4: Runtime ist Composition Root

Warum

Verdrahtung verteilt sich nicht in Domain

Falsch

new JdbcOrderRepository(new JdbcTemplate())

Richtig

@Bean
AcceptOrderUseCase useCase(OrderRepository repo) {
    return new AcceptOrderUseCase(repo);
}

Pruefung

grep -R "org.springframework" maven-project/domain/src || true
Regel 5: Events brauchen Idempotency

Warum

Consumer verarbeitet doppelt

Falsch

public void onEvent(String payload) {
    createInvoice(payload);
}

Richtig

if (processedEvents.markIfNew(eventId)) {
    createInvoice(payload);
}

Pruefung

grep -R "org.springframework" maven-project/domain/src || true
Regel 6: API Fehler brauchen stabile Codes

Warum

Client sieht zufaellige Exceptions

Falsch

throw new RuntimeException("boom");

Richtig

throw new BusinessException("ORDER_PAYMENT_TIMEOUT");

Pruefung

grep -R "org.springframework" maven-project/domain/src || true
Regel 7: Secrets gehoeren nicht in Git

Warum

Passwoerter landen im Repository

Falsch

password: supersecret

Richtig

password: ${POSTGRES_PASSWORD}

Pruefung

grep -R "org.springframework" maven-project/domain/src || true
Regel 8: Health Checks muessen aussagekraeftig sein

Warum

Pod ist gruen, obwohl DB tot

Falsch

return UP;

Richtig

return dbReachable ? UP : DOWN;

Pruefung

grep -R "org.springframework" maven-project/domain/src || true