Refactoring Before/After Katalog

Refactoring wird greifbar, wenn man Ausgangscode und Zielcode nebeneinander sieht.

Before/AfterLegacyClean CodePattern
Refactoring Ablauf vom Verstehen bis Betrieb
Refactoring Ablauf vom Verstehen bis Betrieb

Vorgehen

  1. Ist-Verhalten messen.
  2. Tests um kritische Pfade legen.
  3. Fachlichen Slice wählen.
  4. Use Case extrahieren.
  5. Ports einführen.
  6. Adapter nacheinander ersetzen.

Monster Service

Vorher: Monster-Methode
public void createOrder(Map<String, Object> input) {
    // schlecht: Validierung, SQL, SOAP, Statuslogik und Eventing in einer Methode
    if (input.get("customer") == null) throw new RuntimeException("missing");
    jdbc.update("insert into orders ...");
    soapClient.reserveInvoice(input);
    jms.send("ORDER_CREATED", input);
}
Nachher: Use Case mit klarer Boundary
public OrderId handle(PlaceOrderCommand command) {
    return tx.required(() -> {
        Order order = Order.place(command.customerId(), command.lines());
        orders.save(order);
        outbox.appendAll(order.pullEvents());
        return order.id();
    });
}

JDBC Spaghetti

SQL darf im Adapter bleiben, aber nicht die Domain-Sprache ersetzen. Repository-Methoden sollen fachlich lesbar sein.

Mapping

Manuelles Ad-hoc-Mapping quer durch Services erzeugt Fehler. MapStruct oder explizite Mapper bündeln die Übersetzung.

Exception Handling

VorherNachher
RuntimeException ohne CodeDomainError + HTTP Problem Detail
Stacktrace im ResponseTraceId + maschinenlesbarer Fehlercode
Fehler verschluckenRetry/DLQ/Audit nach Fehlerart

Check

Ein Refactoring ist erst fertig, wenn Tests, Betriebsmetrik, Rollback-Plan und Dokumentation aktualisiert sind.
⌂ Cockpit