Refactoring-Labs
Refactoring-Labs
Diese Labs sind praxisorientiert. Sie sind so formuliert, dass du sie direkt mit dem Beispielprojekt bearbeiten kannst.
Lab 1: Legacy-Verantwortungen sichtbar machen
Ziel: Die Monster Method fachlich zerlegen, ohne sofort Code zu verändern.
Dateien:
beispielprojekt/01_before_refactoring_legacy/legacy-websphere-ear/src/main/java/com/seb4u/demo/claims/legacy/ejb/LegacyClaimFacadeBean.javabeispielprojekt/01_before_refactoring_legacy/legacy-websphere-ear/src/main/java/com/seb4u/demo/claims/legacy/integration/FraudRiskSoapClient.javabeispielprojekt/01_before_refactoring_legacy/legacy-websphere-ear/src/main/java/com/seb4u/demo/claims/legacy/integration/PaymentReleaseSoapClient.java
Aufgabe:
- Lies die Legacy-Facade.
- Markiere fachliche Entscheidungen, technische Zugriffe und Seiteneffekte.
- Erstelle eine Tabelle mit den Spalten: Verantwortung, Legacy-Stelle, Ziel-Baustein, Risiko.
Ergebnis:
- Eine Verantwortungskarte für spätere Refactoring-Schritte.
Lab 2: Characterization Test entwerfen
Ziel: Vorhandenes Verhalten dokumentieren.
Dateien:
beispielprojekt/02_refactoring_steps/02_golden_master/LegacyProcessClaimDecisionCharacterizationTest.javabeispielprojekt/02_refactoring_steps/02_golden_master/GoldenMasterSnapshot.java
Aufgabe:
- Definiere drei typische Claim-Szenarien.
- Beschreibe je Szenario erwartete Legacy-Ausgabe.
- Notiere alle Seiteneffekte, die nicht direkt im Return-Wert sichtbar sind.
Beispielszenarien:
- Claim mit vollständigen Dokumenten und niedrigem Fraud-Risk.
- Claim mit fehlenden Dokumenten.
- Claim mit hohem Fraud-Risk und Payment-Blockade.
Lab 3: Command Object bewerten
Ziel: Verstehen, warum Parameterlisten schlecht wartbar sind.
Dateien:
beispielprojekt/02_refactoring_steps/03_command_extraction/ProcessClaimDecisionCommand.javabeispielprojekt/03_after_refactoring_modular/claim-application/src/main/java/com/seb4u/demo/claims/application/command/ProcessClaimDecisionCommand.java
Aufgabe:
- Liste alle Eingabewerte des Use Cases.
- Ordne sie fachlich: Claim, Benutzer, Entscheidung, Kommentar, Kontext.
- Erkläre, welche Werte validiert werden sollten.
Lab 4: Policy statt if/else
Ziel: Statuslogik ins Domain-Modell verschieben.
Dateien:
beispielprojekt/03_after_refactoring_modular/claim-domain/src/main/java/com/seb4u/demo/claims/domain/ClaimTransitionPolicy.javabeispielprojekt/03_after_refactoring_modular/claim-domain/src/test/java/com/seb4u/demo/claims/domain/ClaimTransitionPolicyTest.java
Aufgabe:
- Ergänze gedanklich eine Regel: Ein bereits geschlossener Claim darf nicht erneut freigegeben werden.
- Beschreibe den Testfall.
- Begründe, warum die Regel nicht im REST Controller liegen soll.
Lab 5: Port extrahieren
Ziel: Technischen SOAP-Zugriff durch Port entkoppeln.
Dateien:
beispielprojekt/03_after_refactoring_modular/claim-application/src/main/java/com/seb4u/demo/claims/application/port/DocumentVerificationPort.javabeispielprojekt/03_after_refactoring_modular/claim-infrastructure/src/main/java/com/seb4u/demo/claims/infrastructure/document/DocumentVerificationSoapAdapter.java
Aufgabe:
- Beschreibe die fachliche Port-Signatur ohne SOAP-Begriffe.
- Erkläre, welche Fehler der Adapter übersetzen muss.
- Erstelle eine Liste möglicher Fake-Implementierungen für Tests.
Lab 6: Handler mit Fake Ports testen
Ziel: Application Handler ohne echte Infrastruktur testen.
Dateien:
beispielprojekt/03_after_refactoring_modular/claim-application/src/main/java/com/seb4u/demo/claims/application/handler/ProcessClaimDecisionHandler.javaREADME
Aufgabe:
- Definiere Fake Ports für Repository, Fraud, Coverage, Payment, Audit.
- Baue einen Testfall für erfolgreiche Freigabe.
- Prüfe, dass Audit und Payment nur dann ausgelöst werden, wenn Fachregeln erfüllt sind.
Lab 7: Outbox statt direkter Publizierung
Ziel: Transaktionsgrenze von Messaging entkoppeln.
Dateien:
OutboxDesignbeispielprojekt/03_after_refactoring_modular/claim-infrastructure/src/main/java/com/seb4u/demo/claims/infrastructure/outbox/JdbcOutboxAdapter.java
Aufgabe:
- Erkläre, warum direkte JMS-Publizierung in der Legacy-Methode riskant ist.
- Definiere ein Outbox-Event für
ClaimDecisionAccepted. - Beschreibe Retry- und Duplicate-Handling.
Lab 8: Read Model für Suche
Ziel: Query-/Reporting-Anforderungen getrennt vom Write-Modell betrachten.
Dateien:
beispielprojekt/03_after_refactoring_modular/claim-application/src/main/java/com/seb4u/demo/claims/application/port/ClaimSearchPort.javabeispielprojekt/03_after_refactoring_modular/claim-infrastructure/src/main/java/com/seb4u/demo/claims/infrastructure/adapter/jpa/JpaClaimRepository.java
Aufgabe:
- Definiere drei Suchfilter für Claims.
- Entscheide, welche Filter in ein Read Model gehören.
- Erkläre, warum Reporting nicht direkt das Aggregate missbrauchen sollte.
Lab 9: Strangler für UI
Ziel: Partner Portal und Backoffice schrittweise entkoppeln.
Dateien:
StranglerPlanbeispielprojekt/01_before_refactoring_legacy/legacy-claims-partner-portal/src/main/java/com/seb4u/demo/claims/legacy/portal/LegacyPartnerPortalServlet.javabeispielprojekt/01_before_refactoring_legacy/legacy-internal-claims-backoffice/src/main/java/com/seb4u/demo/claims/legacy/backoffice/InternalClaimsBackofficeBean.java
Aufgabe:
- Wähle eine UI-Funktion für die erste Entkopplung.
- Definiere eine moderne API-Grenze.
- Beschreibe einen Rollback-Pfad.
Lab 10: Architekturtest entwerfen
Ziel: Modulregeln automatisiert absichern.
Dateien:
Aufgabe:
- Formuliere drei Architekturregeln.
- Beispiel: Domain darf Infrastructure nicht importieren.
- Beschreibe, wie ein ArchUnit-Test diese Regel prüfen würde.