$30 off During Our Annual Pro Sale. View Details »

Werkzeuge für wartbaren und fehlerarmen Code

Werkzeuge für wartbaren und fehlerarmen Code

Verständlichen und fehlerarmen Code zu schreiben ist eine Kunst: Dabei gilt es Namenskonventionen einzuhalten, defensiv zu programmieren, problematische APIs zu umschiffen und genutzte Ressourcen im richtigen Moment wieder freizugeben.

Der Vortrag stellt für jeden Bereich die Konzepte anhand praktischer Code-Beispiele vor. Dazu zeigt er Open-Source-Werkzeuge, die problematische Code-Stellen identifizieren können. Da sie in den Build integriert werden und ohne zusätzliche serverseitigen Komponenten auskommen, sind sie auch für kleinere Teams geeignet. Eine defensive Konfiguration vermeidet Fehlalarme und sorgt für eine Akzeptanz im Team.

Es geht um Werkzeuge wie EditorConfig, Checkstyle, Error Prone, ArchUnit, Animal Sniffer und Policeman's Forbidden API Checker.
Dieser Vortrag richtet sich an Einsteiger in das Thema, aber auch erfahrene Programmierer werden das eine oder andere Neue entdecken können.

Alexander Schwartz

August 28, 2019
Tweet

More Decks by Alexander Schwartz

Other Decks in Technology

Transcript

  1. .consulting .solutions .partnership
    Werkzeuge für wartbaren und fehlerarmen Code
    Alexander Schwartz, Principal IT Consultant
    Java User Group Frankfurt, 2019-08-28

    View Slide

  2. Weniger vermeidbare Fehler
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 2
    Jedes Projekt kann profitieren
    1
    Entwickler abholen
    2
    Fehler und wie wir sie vermeiden
    3
    Defensive Automatisieren
    4

    View Slide

  3. Jedes Projekt kann profitieren
    Je weniger ich mir merken muss, desto …
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 3
    … kürzere Check-Listen in Code Reviews
    … geringere Einarbeitungszeit
    … mehr Fokus auf Fachlichkeit und technisches Design
    … weniger vermeidbare Fehler in Produktion

    View Slide

  4. Weniger vermeidbare Fehler
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 4
    Jedes Projekt kann profitieren
    1
    Entwickler abholen
    2
    Fehler und wie wir sie vermeiden
    3
    Defensive Automatisieren
    4

    View Slide

  5. Entwickler abholen
    Was funktioniert in Projekten?
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 5
    IDE und lokale Build-Tools
    Lokale Prüfungen, Code first
    Automatisierung

    Dashboards
    Server Installationen
    Checklisten

    View Slide

  6. Entwickler abholen
    Was funktioniert in Projekten?
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 6
    Je mehr Probleme
    das Werkzeug meldet,
    desto besser!
    weniger falsche Alarme
    größer ist die Akzeptanz

    View Slide

  7. Weniger vermeidbare Fehler
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 7
    Jedes Projekt kann profitieren
    1
    Entwickler abholen
    2
    Fehler und wie wir sie vermeiden
    3
    Defensive Automatisieren
    4

    View Slide

  8. Fehler und wie wir sie vermeiden
    Encoding und Whitespace EditorConfig et. al.
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 8
    • IDE zeigt im Diff Zeilen an,
    die gar nicht geändert
    wurden
    • Umlautprobleme
    • Letzte Zeile in einem Script
    wird nicht ausgeführt
    • Konvertierung CR/LF
    # .editorconfig
    [*]
    indent_style = space
    indent_size = 4
    continuation_indent_size = 8
    end_of_line = lf
    charset = utf-8
    trim_trailing_whitespace = true
    insert_final_newline = true
    [*.properties]
    charset = latin1
    [*.{cmd, bat}]
    end_of_line = crlf



    UTF-8

    ...
    # .gitattributes
    * text=auto eol=lf
    *.sh text eol=lf
    /mvnw text eol=lf
    /gradlew text eol=lf
    *.cmd text eol=crlf

    View Slide

  9. Fehler und wie wir sie vermeiden
    Klammern und Flüchtigkeitsfehler
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 9
    • Klammern nach dem if
    vergessen
    • switch ohne default und
    break
    • Leeres catch
    • 991 vs. 99l vs. 99L












    value="${config_loc}/suppressions.xml"/>


    View Slide

  10. Fehler und wie wir sie vermeiden
    Von besseren Diffs und nervigen Checks
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 10
    • Imports
    • Whitespace
    • Reihenfolge Modifier
    • Redundant Modifier
    • NewlineAtEndOfFile
    • OperatorWrap
    • Punkt nach dem ersten Satz bei JavaDoc
    • @author für Klassen
    • JavaDoc… für public Klassen?
    Als Alternative?




    list.
    add();
    // vs.
    list
    .add();

    View Slide

  11. Fehler und wie wir sie vermeiden
    Vermeidbare Fehler mit Error Prone
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 12
    • Vergessene Return-Werte
    • Subtile Konvertierungen
    • Nicht geschlossene Ressourcen
    • …
    // AssertJ
    Assertions.assertThat(epochMillis.equals(...));
    // vs.
    Assertions.assertThat(epochMillis).isEqualTo(...);
    Path[] paths = Files.list(Path.of("/")).sorted();
    // .toArray(Path[]::new);
    int[] entries = {1, 2, 16};
    Assertions.assertThat(Arrays.asList(entries)
    .contains(1)).isTrue();

    View Slide

  12. Fehler und wie wir sie vermeiden
    Lessons Learned im Projekt
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 13
    • APIs die nicht wie erwartet
    funktionieren // Spring Data
    @Modifying
    @Query("delete from Ship s where s.type = ?1")
    void deleteInBulkByType(String type);

    View Slide

  13. Fehler und wie wir sie vermeiden
    Verbotene Klassen
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz
    “You should not use java.util.logging!”
    @ArchTest
    ArchRule shouldNotUseJavaUtilLogging =
    GeneralCodingRules.NO_CLASSES_SHOULD_USE_JAVA_UTIL_LOGGING
    .because("we use log4j2");
    Eigene Begründung
    hinzufügen
    Vordefiniterte Regel
    in ArchUnit
    14

    View Slide

  14. Fehler und wie wir sie vermeiden
    1. https://www.infoq.com/news/2014/10/ddd-onion-architecture
    Paketabhängigkeiten
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz
    “In einer Zwiebelschalenarchitektur dürfen äußere Schichten auf
    die inneren zugreifen aber nicht umgekehrt. Adapter dürfen nicht
    voneinander abhängig sein.”
    Ziele (Auszug):
    • Unabhängig testbare Domänenklassen und Adapter
    • Adapter können bei Bedarf hinzugefügt und versioniert
    werden
    Umgesetzt durch:
    • Dependency Injection für Interfaces, die in der Domäne
    definiert sind
    • Eigene Pakete für jeden Teil
    Core
    Domain
    Application
    Adapter 1
    Adapter 2
    Adapter 3
    Adapter n
    15

    View Slide

  15. Fehler und wie wir sie vermeiden
    Paketabhängigkeiten
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz
    “In einer Zwiebelschalenarchitektur dürfen äußere Schichten auf die inneren zugreifen aber nicht
    umgekehrt. Adapter dürfen nicht voneinander abhängig sein.
    @ArchTest
    ArchRule adaptersShouldNotDependOnEachOther =
    SlicesRuleDefinition.slices().matching("..adapter.(*)..")
    .should().notDependOnEachOther();
    @ArchTest
    ArchRule onionArchitecture =
    Architectures.layeredArchitecture()
    .layer("adapter").definedBy("..adapter..")
    .layer("domain").definedBy("..domain..")
    .layer("application").definedBy("..application..")
    .whereLayer("adapter").mayNotBeAccessedByAnyLayer()
    .whereLayer("application").mayOnlyBeAccessedByLayers("adapter");
    16

    View Slide

  16. Fehler und wie wir sie vermeiden
    Default Locale/Timezone by Policeman's Forbidden API checker
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 17
    Entwickler
    !=
    CI-Server
    !=
    Produktion
    !=
    Nutzer
    Assertions.assertThat("ä".getBytes())
    .hasSize(1);
    Assertions.assertThat(
    Year.now().get(ChronoField.YEAR)
    ).isEqualTo(2019);

    View Slide

  17. Fehler und wie wir sie vermeiden
    JDK API Änderungen tracken by Animal Sniffer
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 18
    Entwickler
    (Java 9+)
    vs.
    Produktion
    (Java 8)
    // JDK 9+ only
    HttpClient client = HttpClient.newHttpClient();
    // JDK 9+ only
    Stream.ofNullable(null);

    View Slide

  18. Weniger vermeidbare Fehler
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 19
    Jedes Projekt kann profitieren
    1
    Entwickler abholen
    2
    Fehler und wie wir sie vermeiden
    3
    Defensive Automatisieren
    4

    View Slide

  19. Defensive Automatisieren
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 20
    • Integrierbar über Maven
    oder Gradle
    • Läuft lokal beim Entwickler
    • IDE-Support meist vorhanden
    • Bei Verstößen ist der Build rot
    Werkzeug Einsatz
    EditorConfig Encoding, Zeilenumbrüche, Dateiende,
    Einrückung, …
    Checkstyle Klammern, Whitespace, Exception-
    Handling, …
    ArchUnit Projektspezifische Konventionen zu
    Annotationen, Klassennamen,
    Paketnamen, Abhängigkeiten, …
    ErrorProne Stolpersteine Java Programmierung
    Animal Sniffer API-Kompatibilität (insbes. JDK)
    Forbidden API Checker Default Locale/Timezone

    View Slide

  20. Links
    © msg | August 2019 | Weniger vermeidbare Fehler - Werkzeuge für wartbaren und fehlerarmen Code | Alexander Schwartz 21
    Checkstyle
    https://checkstyle.sourceforge.io
    EditorConfig
    https://editorconfig.org/
    Animal Sniffer
    https://www.mojohaus.org/animal-sniffer/
    ArchUnit
    https://www.archunit.org/
    @ahus1de
    Policeman's Forbidden API checker
    https://github.com/policeman-tools/forbidden-apis
    Error Prone
    https://github.com/google/error-prone
    Dotfiles for crossplatform projects
    https://www.ahus1.de/post/dotfiles-for-crossplatform-projects

    View Slide

  21. .consulting .solutions .partnership
    Alexander Schwartz
    Principal IT Consultant
    +49 171 5625767
    [email protected]
    @ahus1de
    msg systems ag (Headquarters)
    Robert-Buerkle-Str. 1, 85737 Ismaning
    Germany
    www.msg.group

    View Slide