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.

5f528a3f6814d28b583f31842e3e8d9e?s=128

Alexander Schwartz

August 28, 2019
Tweet

Transcript

  1. .consulting .solutions .partnership Werkzeuge für wartbaren und fehlerarmen Code Alexander

    Schwartz, Principal IT Consultant Java User Group Frankfurt, 2019-08-28
  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
  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
  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
  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 
  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
  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
  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 <!-- pom.xml --> <project> <properties> <encoding>UTF-8</encoding> </properties> ... # .gitattributes * text=auto eol=lf *.sh text eol=lf /mvnw text eol=lf /gradlew text eol=lf *.cmd text eol=crlf
  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 <module name="Checker"> <property name="charset" value="UTF-8"/> <module name="SuppressWarningsFilter"/> <module name="TreeWalker"> <module name="NeedBraces"/> <module name="SuppressWarningsHolder"/> <module name="MissingSwitchDefault"/> <module name="DefaultComesLastCheck"/> <module name="FallThroughCheck"/> <module name="UpperEll"/> </module> <module name="SuppressionFilter"> <property name="file" value="${config_loc}/suppressions.xml"/> </module> </module>
  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? <module name="NoWhitespaceAfter"> <property name="tokens" value="DOT"/> <property name="allowLineBreaks" value="false"/> </module> list. add(); // vs. list .add();
  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();
  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);
  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
  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
  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
  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);
  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);
  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
  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
  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
  21. .consulting .solutions .partnership Alexander Schwartz Principal IT Consultant +49 171

    5625767 alexander.schwartz@msg.group @ahus1de msg systems ag (Headquarters) Robert-Buerkle-Str. 1, 85737 Ismaning Germany www.msg.group