SlideShare ist ein Scribd-Unternehmen logo
1 von 29
Downloaden Sie, um offline zu lesen
Java Code Quality


Regeln für gute Java-Programme



Treffpunkt Semicolon, 22.02.2011, GFU Cyrus AG
Jens Seekamp, GEDOPLAN GmbH
Java Code Quality – ein ganzheitlicher Ansatz

Agenda

  Software-Qualität
  Regel 1: System-Dekomposition und Build-Prozess
  Regel 2: Schichten-Architektur
  Regel 3: Modell-getriebene Entwicklung
  Regel 4: inkrementelle Entwicklung
  Regel 5: Richtlinien und statische Code-Analyse
  Regel 6: integrierter, automatisierter Test
  Regel 7: Refactoring und Regressionstest


                                                    2
Software-Qualität

  Strukturierung (System, Komponente, Schicht, Paket, Klasse, Methode,
  Anweisung)
  Einheitlichkeit (Generierung, Muster)
  Richtlinien-Konformität (statische Programm-Analyse)
  Verständlichkeit (Funktionalität / Logik der Software-Elemente)
  Lesbarkeit (Bezeichner, Formatierung, ...)
  Dokumentation, Kommentare (JavaDoc)
  Korrektheit und Stabilität (funktionaler Programm-Test)
  Leistungsfähigkeit (Performanz, Last), Benutzerfreundlichkeit
  Wartbarkeit (Fehlerbehebung, Change Requests)
  Erweiterbarkeit (neue Anforderungen)

                                                                         3
Regel 1: System-Dekomposition und Build-Prozess

  System-Dekomposition
     Zerlegung des Software-Systems in Komponenten
     eine Komponente kapselt einen Funktionsbereich (Schnittstelle
     vs. Rumpf)
     eine Komponente basiert oftmals auf einer Implementierungs-
     Technologie (z. B. EJB)
     eine Komponente ist i. d. R. ausführbar




                                                                     4
Architektur einer „kleinen“ Java-EE-Anwendung

                                            Projekt PRAGSYS:
                                            Prüfsystem für Statistiken
                                            der GKV




                                                                         5
Architektur einer „großen“ Java-EE-Anwendung
                                         Projekt BDE:
                                         Betriebsdatenerfassung für
                                         Fertigungsindustrie




                                                                      6
Regel 1: System-Dekomposition und Build-Prozess

  Build-Prozess
     „Bauen“ des Software-Systems aus seinen kompilierten
     Komponenten
     dabei wird je Komponente ein Build-Artefakt erstellt

  Werkzeuge für den Build-Prozess
    Build-Prozess wird vollständig mit Maven 3.x durchgeführt
    Java-Compiler der IDE ist (theoretisch) überflüssig
    Continuous Integration wird mit Hudson realisiert (z. B. Nightly
    Build)


                                                                   7
Maven-Multi-Projekt für Java-EE-Anwendung
<project>

<groupId>de.gedoplan.bde</groupId>                  <project>
<artifactId>bde</artifactId>
<version>1.0.0</version>                            <parent>
                                                      <groupId>de.gedoplan.bde</groupId>
<modules>                                             <artifactId>bde</artifactId>
  <module>bde-common</module>                         <version>1.0.0</version>
  <module>bde-comp-mitarbeiter</module>             </parent>
  <module>bde-comp-zeiterfassung</module>
  <module>bde-web</module>                          <artifactId>bde-comp-mitarbeiter</artifactId>
  <module>bde-ear</module>                          <packaging>ejb</packaging>
</modules>


                                                                <project>
       <project>
                                                                <parent> ...
       <parent> ...
                                                                <artifactId>bde-web</artifactId>
       <artifactId>bde-ear</artifactId>                         <packaging>war</packaging>
       <packaging>ear</packaging>

       <dependencies>
         ... <artifactId>bde-comp-mitarbeiter ...
         ... <artifactId>bde-web ...


                                                                                                    8
Regel 2: Schichten-Architektur

  Zerlegung in 3-Schichten-Architektur
      Präsentations-Schicht (GUI)
      Fachlogik-Schicht (Geschäftsfälle, Dienste, Fachklassen)
      Datenhaltungs-Schicht (Speicherung der Objekte, RDBMS)
  zusätzlich oftmals „übergreifende“ Schichten
      fachliches Klassenmodell (Entitäten)
      Basis-Dienste und –Klassen (z. B. Ausnahmen, Meldungen)

  Schichten-Zerlegung ist möglich
     auf Ebene des Software-Systems
     auf Ebene der Komponenten
                                                                 9
Schichten-Architektur einer Java-EE-Anwendung




                                                10
Sicherstellung der Schichten-Architektur

  häufige Verletzungen der Schichten-Architektur
     „Überspringen“ einer Schicht (Präsentation Datenhaltung)
     „umgekehrte“ benutzt-Beziehung (Datenhaltung Fachlogik)
     falsche Zuordnung von Implementierung
        Realisierung von fachlicher Logik in Dialogklassen
        erkennbar in Benutzung von Fachklassen anstelle von Dienst-Schnittstelle


  Sicherstellung durch Spezifikation von
     erlaubten benutzt-Beziehungen
     nicht erlaubten benutzt-Beziehungen


                                                                              11
Sicherstellung mit Checkstyle-Modul „Import Control“




                                                       12
Regel 3: Modell-getriebene Entwicklung

  aus einem „Modell“ generierter Java-Code ist
     strukturiert
     einheitlich
     korrekt und stabil

  Code-Generierung steigert außerdem
     die Effizienz der Software-Entwicklung
     die Wartbarkeit des Software-Systems




                                                 13
„klassische“ Modell-getriebene Entwicklung

Generierung                        @Entity
                                   public class Land
  des fachlichen Klassenmodells    {
                                     @Id
  (Entitäten)                        private String isoCode;
                                     private String name;

  als POJO-Klassen mit JPA-            public Land()

  Annotationen                         {}

                                       public String getIsoCode()
  aus UML-Klassenmodell (z. B.         { return this.isoCode; }

  Enterprise Architect)                public void setIsoCode(String code)
                                       { this.isoCode = code; }

                                       public String getName()
                                       { return this.name; }

                                       public void setName(String name)
                                       { this.name = name; }
                                   }




                                                                          14
Generierung von XML-Zugriffsklassen (1)

Generierung
  für die Umwandlung Java-Objekte      XML-Dokumente
  (Marshalling / Unmarshalling)
  als POJO-Klassen mit JAXB-Annotationen
  aus XML-Schema (z. B. XMLSPY)
  mit dem JAXB-Schema-Compiler (Java Architecture for XML
  Binding)




                                                            15
Generierung von XML-Zugriffsklassen (2)

                                              XJC




                            @XmlAccessorType(XmlAccessType.FIELD)
                            @XmlType(name = "Satzart_Ctp", propOrder =
                              {"verfahren", "zeitraumAb", "zeitraumBis"})

                            public class Satzart implements Serializable
                            {
                              @XmlElement(name = "Verfahren", required = true)
                              private String verfahren;

                              public String getVerfahren()
                              { return verfahren; }

                              public void setVerfahren(String daten)
                              { verfahren = daten; }




                                                                            16
Generierung eines Formel-Parser
Generierung
  eines Parser für arithmetisch-logische Formeln
  aus einer kontextfreien Grammatik
  mit dem Parser-Generator JavaCC (Java Compiler Compiler)
 TOKEN: {
 | < PLUS: "+" >                                                  12 * x + 5 ...
 | < MINUS: "-" >
 }

 void Addition():
 { Token t = null;
   StringBuilder sb = new StringBuilder();
 }                                                                              +
 { Multiplikation()
   ( ( t = <PLUS> Multiplikation() ) { sb.append(t.image); }
     | ( t = <MINUS> Multiplikation() ) { sb.append(t.image); }         *           5
   )*
   { jjtThis.jjtSetValue(sb.toString()); }
 }                                                                 12       x



                                                                                        17
Regel 4: inkrementelle Entwicklung - Randbedingungen




   package de.aoksystems.pragsys.service.pruefkern;

   import de.aoksystems.pragsys.bo.statistik.Statistik;
   import de.aoksystems.pragsys.bo.pruefung.Pruefergebnis;

   @Stateless
   public class PruefServiceBean implements PruefService
   {
     /**
      * Diese Methode prüft eine Statistik, die an das Prüfsystem
      * übergeben wurde, und liefert das Prüfergebnis zurück.
      */
     public Pruefergebnis pruefeStatistik(Statistik s)
     {...}
   }




                                                                    18
Regel 4: inkrementelle Entwicklung - Tipps

  Implementierung: konkret beginnen und schrittweise verfeinern
  erst „in die Tiefe“, später „in die Breite“ implementieren (Prototyping,
  depth-first)
  möglichst frühe Rückkopplung
     gleichzeitige Erstellung von Unit-Tests
     Review durch Projekt-Kollegen
     Demonstration für Benutzer
  Grundsätze beachten (vgl. http://www.clean-code-developer.de)
     immer objektorientiert und „sauber“
     möglichst einfach (KISS), redundanzfrei (DRY), ...
  „Software ist (fast) nie fertig.“ (evolutionäre Entwicklung, TODOs)

                                                                        19
Regel 5: Richtlinien und statische Code-Analyse

  ein Team von SW-Entwicklern ist heterogen (Berufs-/Projekterfahrung,
  Programmierstil)
  für einheitlichen, lesbaren, kommentierten usw. Java-Code sind
  Entwicklungs-Richtlinien unabdingbar
  Richtlinien-Katalog zusammengefasst im Entwickler-Handbuch
      Beschreibung der Richtlinie (ggf. mit Motivation, Zielsetzung)
      Positiv- und ggf. Negativ-Beispiele (Do‘s and Dont‘s)
  Umfang des Programm-Code und Anzahl der Richtlinien erfordern
  automatisierte Überwachung
  Werkzeuge für die statische Code-Analyse
      z. B. Checkstyle, FindBugs, SonarJ

                                                                     20
Regel 5: Richtlinien-Katalog (Beispiele)

  Standard-Konventionen für Java der Firma Sun
  deutsche Bezeichner für Klassen, Attribute, Methoden etc.
  verwenden
  Konstanten bestehen nur aus Großbuchstaben, Ziffern und dem
  Unterstrich "_"
  anstatt null ein Array der Länge 0 zurück geben
  falls eine Exception geworfen wird, muss sie protokolliert
  werden
  mehrmals benötigte Programmlogik wird in eine separate Methode
  bzw. Klasse ausgelagert
  Reflection darf nicht verwendet werden

                                                               21
Regel 5: Werkzeuge für statische Code-Analyse

  Idealfall: für jede Richtlinie gibt es eine aktivierte Analyse-Regel
  und umgekehrt
  für „kleine“ Projekte sollte ein Code-Analyse-Werkzeug reichen
  für „große“ Projekte und Vollständigkeit müssen ggf. mehrere Code-
  Analyse-Werkzeuge parallel eingesetzt werden
     erhöhter Konfigurationsaufwand
     Problem der Mehrfach-Meldung von Verletzungen
  Standardisierung / Wiederverwendung des Richtlinien-Kataloges und
  der Werkzeug-Konfiguration (über Projekt- und Abteilungsgrenzen)
  Werkzeuge machen Reviews durch Software-Architekten oder
  erfahrene Entwickler nicht überflüssig


                                                                   22
Beispiel: Code-Bereinigung mittels Checkstyle / Review
               (5)   Import-Organisation, Formatierung
               (4)   Namenskonventionen, Bezeichner, for
               (3)   JavaDoc, Anweisungs-Struktur, Kommentare
               (2)   try-catch, Parameterprüfung
               (1)   Ausnahmebehandlung, Logging
                     „Nice“




                                                                23
Regel 6: integrierter, automatisierter Test

  Software-Test hat zwei Zielsetzungen
      im Java-Code möglichst viele Fehler aufdecken
      Korrektheit der Anwendung demonstrieren
  Test ist integraler Bestandteil der Software-Entwicklung, und nicht
  nur nachgelagert (vgl. testgetriebene Entwicklung, test-first)
  Test dient zum Nachweis der dynamischen, funktionalen Korrektheit
  des Java-Code (dies ist mit statischer Code-Analyse nicht möglich)
  Fokus liegt auf der Realisierung von automatisierten Tests
  dafür Einsatz von Java-Test-Frameworks und –Werkzeugen




                                                                  24
Regel 6: Test-Konzeption für Java-(EE)-Anwendungen

  Schritt 1: Entwicklertest für wichtige Klassen und Methoden
     „Standard“-Framework JUnit 4.x
  Schritt 2: Realisierung einer Testdaten-Verwaltung
     Nutzung dedizierter Test-Datenbank(en)
     explizite Testdaten-Erzeugung mittels Java (DBUnit, XMLUnit)
  Schritt 3: Integrationstest der Service-Schicht
     per JUnit-Testclient gegen den Application-Server (remote)
     mittels z. B. OpenEJB innerhalb der IDE (embedded)
  Schritt 4: „automatisierter Abnahmetest“ der GUI-Clients
     Werkzeug abhängig von GUI-Technologie und –Bibliothek
     z. B. QF-Test (alle), Selenium (Web), Abbot (Swing)
  Schritt 5: Test nicht-funktionaler Anforderungen (Performanz, Last)

                                                                        25
Regel 6: Bibliothek der automatisierten Testfälle

  Zusammenfassung aller automatisierten Testfälle aus Schritt 1 bis 5
  zu einer Test-Bibliothek
                                            als Test-Suites gemäß JUnit
                                            (JUnit-Integration aller Werkzeuge /
                                            Frameworks vorausgesetzt)
                                            hierarchische Strukturierung
                                            der Test-Suites
                                            gesamte Test-Bibliothek auf
                                            Entwicklungsrechner lokal
                                            ausführbar




                                                                            26
Regel 7: Refactoring und Regressionstest
  Fehler und Qualitätsmängel des Java-Code werden laufend
  festgestellt durch
      werkzeuggestützte, automatisierte Tests
      werkzeuggestützte, statische Code-Analyse
  direkte Notwendigkeit für Fehlerbehebung und Mängelbeseitigung
  bedingt oftmals Refactoring, d. h. weitergehende, strukturelle
  „Umbau-Arbeiten“
  nach einem Refactoring
      ist der Java-Code fehlerbereinigt und / oder qualitativ besser
      ist die Gesamt-Funktionalität unverändert


                                                                   27
Beispiel: Redundanz-Beseitigung und Kapselung
                   Aufdecken von redundantem Java-Code mit
                   Checkstyle-Modul „Strict Duplicate Code“
                   Auslagern der Code-Redundanz in eine separate
                   Klasse
                   dadurch gleichzeitig Kapselung der Verwendung
                   des JAXB-Framework




                                                                   28
Regel 7: Regressionstest im Rahmen der CI

  Wahrung der funktionalen Korrektheit nach Refactorings wird durch
  den Regressionstest sichergestellt
  Regressionstest ist der Test des gesamten Java-Code auf Basis der
  Test-Bibliothek
  Zusammenfassung aller automatisierten, qualitätssichernden
  Maßnahmen in der Continuous Integration (Hudson):
     Integrations-Build (Subversion, Maven)
     Generierung der Programm-Dokumentation (JavaDoc)
     statische Code-Analyse (Checkstyle, ...)
     Regressionstest (JUnit, ...) auf Basis der Test-Bibliothek
     Messung der Test-Überdeckung (Cobertura)
     Deployment auf QS-Umgebung (für manuelle Tests)

                                                                  29

Weitere ähnliche Inhalte

Was ist angesagt?

javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsgedoplan
 
Von Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenVon Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenQAware GmbH
 
Objektvalidierung mit dem Bean Validation Api
Objektvalidierung mit dem Bean Validation ApiObjektvalidierung mit dem Bean Validation Api
Objektvalidierung mit dem Bean Validation Apigunnarmorling
 
Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018Torsten Kleiber
 
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...GFU Cyrus AG
 
Test Management mit Visual Studio 2012
Test Management mit Visual Studio 2012Test Management mit Visual Studio 2012
Test Management mit Visual Studio 2012Nico Orschel
 
Web-GUIs mit Vaadin
 Web-GUIs mit Vaadin Web-GUIs mit Vaadin
Web-GUIs mit Vaadingedoplan
 
Anforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenAnforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenChristian Baranowski
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Torsten Kleiber
 
Implementierung der Knowledge Engineering Workbench in myCBR
Implementierung der Knowledge Engineering Workbench in myCBRImplementierung der Knowledge Engineering Workbench in myCBR
Implementierung der Knowledge Engineering Workbench in myCBRAlexander Hundt
 
Anforderungsanalyse - Grundlagen und Prototyping
Anforderungsanalyse - Grundlagen und PrototypingAnforderungsanalyse - Grundlagen und Prototyping
Anforderungsanalyse - Grundlagen und PrototypingChristian Baranowski
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsThorsten Kamann
 
Javamagazin 1.2016 jdk9_ea_b83_jigsaw
Javamagazin 1.2016 jdk9_ea_b83_jigsawJavamagazin 1.2016 jdk9_ea_b83_jigsaw
Javamagazin 1.2016 jdk9_ea_b83_jigsawWolfgang Weigend
 
Configuration Management (Fokus: Version-Controlling) – Best Pracitces
Configuration Management (Fokus: Version-Controlling) – Best PracitcesConfiguration Management (Fokus: Version-Controlling) – Best Pracitces
Configuration Management (Fokus: Version-Controlling) – Best Pracitceskaftanenko
 
Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020Torsten Kleiber
 
Prozesse im Spiegel des Projektalltags
Prozesse im Spiegel des ProjektalltagsProzesse im Spiegel des Projektalltags
Prozesse im Spiegel des ProjektalltagsmicroTOOL GmbH
 
Java für eingebettete Systeme
Java für eingebettete SystemeJava für eingebettete Systeme
Java für eingebettete Systemerdmeyer
 

Was ist angesagt? (20)

javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
 
Von Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenVon Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 Minuten
 
Objektvalidierung mit dem Bean Validation Api
Objektvalidierung mit dem Bean Validation ApiObjektvalidierung mit dem Bean Validation Api
Objektvalidierung mit dem Bean Validation Api
 
Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018
 
CDI
CDICDI
CDI
 
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
 
Test Management mit Visual Studio 2012
Test Management mit Visual Studio 2012Test Management mit Visual Studio 2012
Test Management mit Visual Studio 2012
 
Web-GUIs mit Vaadin
 Web-GUIs mit Vaadin Web-GUIs mit Vaadin
Web-GUIs mit Vaadin
 
Anforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenAnforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML Grundlagen
 
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
Plsql drum test automatisiere, wer sich sich ewig bindet! - DOAG 2017
 
Implementierung der Knowledge Engineering Workbench in myCBR
Implementierung der Knowledge Engineering Workbench in myCBRImplementierung der Knowledge Engineering Workbench in myCBR
Implementierung der Knowledge Engineering Workbench in myCBR
 
Softwarequalität Entwicklung - Test - Wartung
Softwarequalität Entwicklung -  Test - WartungSoftwarequalität Entwicklung -  Test - Wartung
Softwarequalität Entwicklung - Test - Wartung
 
Anforderungsanalyse - Grundlagen und Prototyping
Anforderungsanalyse - Grundlagen und PrototypingAnforderungsanalyse - Grundlagen und Prototyping
Anforderungsanalyse - Grundlagen und Prototyping
 
Vortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development EnvironmentsVortragsreihe Dortmund: Unified Development Environments
Vortragsreihe Dortmund: Unified Development Environments
 
Javamagazin 1.2016 jdk9_ea_b83_jigsaw
Javamagazin 1.2016 jdk9_ea_b83_jigsawJavamagazin 1.2016 jdk9_ea_b83_jigsaw
Javamagazin 1.2016 jdk9_ea_b83_jigsaw
 
Systementwurf mit UML
Systementwurf mit UMLSystementwurf mit UML
Systementwurf mit UML
 
Configuration Management (Fokus: Version-Controlling) – Best Pracitces
Configuration Management (Fokus: Version-Controlling) – Best PracitcesConfiguration Management (Fokus: Version-Controlling) – Best Pracitces
Configuration Management (Fokus: Version-Controlling) – Best Pracitces
 
Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020
 
Prozesse im Spiegel des Projektalltags
Prozesse im Spiegel des ProjektalltagsProzesse im Spiegel des Projektalltags
Prozesse im Spiegel des Projektalltags
 
Java für eingebettete Systeme
Java für eingebettete SystemeJava für eingebettete Systeme
Java für eingebettete Systeme
 

Ähnlich wie Java Code Quality: Gute Software braucht guten Code - Regeln für verständliche und wartbare Java-Programme

Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Joachim Baumann
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit antroskakori
 
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter SystemeSOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter SystemeMario Rodler
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAOliver Belikan
 
MicroProfile-Anwendungen mit Quarkus
MicroProfile-Anwendungen mit QuarkusMicroProfile-Anwendungen mit Quarkus
MicroProfile-Anwendungen mit Quarkusgedoplan
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeldgedoplan
 
Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus gedoplan
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir seincodepitbull
 
Einfacher bauen
Einfacher bauenEinfacher bauen
Einfacher bauenjohofer
 
Real Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
Real Application Testing - DOAG SIG Database 2010 - Simon DickmeißReal Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
Real Application Testing - DOAG SIG Database 2010 - Simon DickmeißOPITZ CONSULTING Deutschland
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heutePhilipp Burgmer
 
Scala - OSGi Bundles from Outer (Java) Space
Scala - OSGi Bundles from Outer (Java) SpaceScala - OSGi Bundles from Outer (Java) Space
Scala - OSGi Bundles from Outer (Java) SpaceOliver Braun
 
JEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine EinführungJEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine Einführunggedoplan
 
Article - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der EntwicklerArticle - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der EntwicklerWolfgang Weigend
 

Ähnlich wie Java Code Quality: Gute Software braucht guten Code - Regeln für verständliche und wartbare Java-Programme (20)

Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)
 
Python builds mit ant
Python builds mit antPython builds mit ant
Python builds mit ant
 
Java EE 5
Java EE 5Java EE 5
Java EE 5
 
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter SystemeSOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
Backbase Intro
Backbase IntroBackbase Intro
Backbase Intro
 
Workshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GAWorkshop zu Hibernate 3.2.2 GA
Workshop zu Hibernate 3.2.2 GA
 
MicroProfile-Anwendungen mit Quarkus
MicroProfile-Anwendungen mit QuarkusMicroProfile-Anwendungen mit Quarkus
MicroProfile-Anwendungen mit Quarkus
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeld
 
Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Mögen die Tests mit dir sein
Mögen die Tests mit dir seinMögen die Tests mit dir sein
Mögen die Tests mit dir sein
 
Einfacher bauen
Einfacher bauenEinfacher bauen
Einfacher bauen
 
Real Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
Real Application Testing - DOAG SIG Database 2010 - Simon DickmeißReal Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
Real Application Testing - DOAG SIG Database 2010 - Simon Dickmeiß
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heute
 
Scala - OSGi Bundles from Outer (Java) Space
Scala - OSGi Bundles from Outer (Java) SpaceScala - OSGi Bundles from Outer (Java) Space
Scala - OSGi Bundles from Outer (Java) Space
 
GWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der PraxisGWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der Praxis
 
JEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine EinführungJEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine Einführung
 
Article - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der EntwicklerArticle - JDK 8 im Fokus der Entwickler
Article - JDK 8 im Fokus der Entwickler
 

Mehr von GFU Cyrus AG

Social Media im Unternehmen
Social Media im UnternehmenSocial Media im Unternehmen
Social Media im UnternehmenGFU Cyrus AG
 
Clean Code Developer
Clean Code DeveloperClean Code Developer
Clean Code DeveloperGFU Cyrus AG
 
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...GFU Cyrus AG
 
SharePoint 2010 - Was ist neu, was wird besser!
SharePoint 2010 - Was ist neu, was wird besser!SharePoint 2010 - Was ist neu, was wird besser!
SharePoint 2010 - Was ist neu, was wird besser!GFU Cyrus AG
 
Java Persistence 2.0
Java Persistence 2.0Java Persistence 2.0
Java Persistence 2.0GFU Cyrus AG
 
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...GFU Cyrus AG
 
Liferay Portal - ein Webportal für viele Unternehmensanforderungen
Liferay Portal - ein Webportal für viele UnternehmensanforderungenLiferay Portal - ein Webportal für viele Unternehmensanforderungen
Liferay Portal - ein Webportal für viele UnternehmensanforderungenGFU Cyrus AG
 
PostgreSQL im Produktivbetrieb
PostgreSQL im ProduktivbetriebPostgreSQL im Produktivbetrieb
PostgreSQL im ProduktivbetriebGFU Cyrus AG
 
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...GFU Cyrus AG
 
Wieviel Web2.0 braucht Ihr Unternehmen?
Wieviel Web2.0 braucht Ihr Unternehmen?Wieviel Web2.0 braucht Ihr Unternehmen?
Wieviel Web2.0 braucht Ihr Unternehmen?GFU Cyrus AG
 
Das Java-Spring-Framework in der Praxis
Das Java-Spring-Framework in der PraxisDas Java-Spring-Framework in der Praxis
Das Java-Spring-Framework in der PraxisGFU Cyrus AG
 
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer SeminarverwaltungAgile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer SeminarverwaltungGFU Cyrus AG
 
Wissensmanagement bei Volkswagen
Wissensmanagement bei VolkswagenWissensmanagement bei Volkswagen
Wissensmanagement bei VolkswagenGFU Cyrus AG
 
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalkGrenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalkGFU Cyrus AG
 
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...GFU Cyrus AG
 
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...GFU Cyrus AG
 
E-Learning mit Moodle
E-Learning mit MoodleE-Learning mit Moodle
E-Learning mit MoodleGFU Cyrus AG
 
LINQ - Einheitlicher Datenzugriff in .NET
LINQ - Einheitlicher Datenzugriff in .NETLINQ - Einheitlicher Datenzugriff in .NET
LINQ - Einheitlicher Datenzugriff in .NETGFU Cyrus AG
 
Java oberflächlich betrachtet - Welche GUI ist die richtige?
Java oberflächlich betrachtet - Welche GUI ist die richtige?Java oberflächlich betrachtet - Welche GUI ist die richtige?
Java oberflächlich betrachtet - Welche GUI ist die richtige?GFU Cyrus AG
 
Oracle 11g - Neuerungen im Überblick
Oracle 11g - Neuerungen im ÜberblickOracle 11g - Neuerungen im Überblick
Oracle 11g - Neuerungen im ÜberblickGFU Cyrus AG
 

Mehr von GFU Cyrus AG (20)

Social Media im Unternehmen
Social Media im UnternehmenSocial Media im Unternehmen
Social Media im Unternehmen
 
Clean Code Developer
Clean Code DeveloperClean Code Developer
Clean Code Developer
 
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
 
SharePoint 2010 - Was ist neu, was wird besser!
SharePoint 2010 - Was ist neu, was wird besser!SharePoint 2010 - Was ist neu, was wird besser!
SharePoint 2010 - Was ist neu, was wird besser!
 
Java Persistence 2.0
Java Persistence 2.0Java Persistence 2.0
Java Persistence 2.0
 
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
 
Liferay Portal - ein Webportal für viele Unternehmensanforderungen
Liferay Portal - ein Webportal für viele UnternehmensanforderungenLiferay Portal - ein Webportal für viele Unternehmensanforderungen
Liferay Portal - ein Webportal für viele Unternehmensanforderungen
 
PostgreSQL im Produktivbetrieb
PostgreSQL im ProduktivbetriebPostgreSQL im Produktivbetrieb
PostgreSQL im Produktivbetrieb
 
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
 
Wieviel Web2.0 braucht Ihr Unternehmen?
Wieviel Web2.0 braucht Ihr Unternehmen?Wieviel Web2.0 braucht Ihr Unternehmen?
Wieviel Web2.0 braucht Ihr Unternehmen?
 
Das Java-Spring-Framework in der Praxis
Das Java-Spring-Framework in der PraxisDas Java-Spring-Framework in der Praxis
Das Java-Spring-Framework in der Praxis
 
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer SeminarverwaltungAgile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
 
Wissensmanagement bei Volkswagen
Wissensmanagement bei VolkswagenWissensmanagement bei Volkswagen
Wissensmanagement bei Volkswagen
 
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalkGrenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
 
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
 
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
 
E-Learning mit Moodle
E-Learning mit MoodleE-Learning mit Moodle
E-Learning mit Moodle
 
LINQ - Einheitlicher Datenzugriff in .NET
LINQ - Einheitlicher Datenzugriff in .NETLINQ - Einheitlicher Datenzugriff in .NET
LINQ - Einheitlicher Datenzugriff in .NET
 
Java oberflächlich betrachtet - Welche GUI ist die richtige?
Java oberflächlich betrachtet - Welche GUI ist die richtige?Java oberflächlich betrachtet - Welche GUI ist die richtige?
Java oberflächlich betrachtet - Welche GUI ist die richtige?
 
Oracle 11g - Neuerungen im Überblick
Oracle 11g - Neuerungen im ÜberblickOracle 11g - Neuerungen im Überblick
Oracle 11g - Neuerungen im Überblick
 

Java Code Quality: Gute Software braucht guten Code - Regeln für verständliche und wartbare Java-Programme

  • 1. Java Code Quality Regeln für gute Java-Programme Treffpunkt Semicolon, 22.02.2011, GFU Cyrus AG Jens Seekamp, GEDOPLAN GmbH
  • 2. Java Code Quality – ein ganzheitlicher Ansatz Agenda Software-Qualität Regel 1: System-Dekomposition und Build-Prozess Regel 2: Schichten-Architektur Regel 3: Modell-getriebene Entwicklung Regel 4: inkrementelle Entwicklung Regel 5: Richtlinien und statische Code-Analyse Regel 6: integrierter, automatisierter Test Regel 7: Refactoring und Regressionstest 2
  • 3. Software-Qualität Strukturierung (System, Komponente, Schicht, Paket, Klasse, Methode, Anweisung) Einheitlichkeit (Generierung, Muster) Richtlinien-Konformität (statische Programm-Analyse) Verständlichkeit (Funktionalität / Logik der Software-Elemente) Lesbarkeit (Bezeichner, Formatierung, ...) Dokumentation, Kommentare (JavaDoc) Korrektheit und Stabilität (funktionaler Programm-Test) Leistungsfähigkeit (Performanz, Last), Benutzerfreundlichkeit Wartbarkeit (Fehlerbehebung, Change Requests) Erweiterbarkeit (neue Anforderungen) 3
  • 4. Regel 1: System-Dekomposition und Build-Prozess System-Dekomposition Zerlegung des Software-Systems in Komponenten eine Komponente kapselt einen Funktionsbereich (Schnittstelle vs. Rumpf) eine Komponente basiert oftmals auf einer Implementierungs- Technologie (z. B. EJB) eine Komponente ist i. d. R. ausführbar 4
  • 5. Architektur einer „kleinen“ Java-EE-Anwendung Projekt PRAGSYS: Prüfsystem für Statistiken der GKV 5
  • 6. Architektur einer „großen“ Java-EE-Anwendung Projekt BDE: Betriebsdatenerfassung für Fertigungsindustrie 6
  • 7. Regel 1: System-Dekomposition und Build-Prozess Build-Prozess „Bauen“ des Software-Systems aus seinen kompilierten Komponenten dabei wird je Komponente ein Build-Artefakt erstellt Werkzeuge für den Build-Prozess Build-Prozess wird vollständig mit Maven 3.x durchgeführt Java-Compiler der IDE ist (theoretisch) überflüssig Continuous Integration wird mit Hudson realisiert (z. B. Nightly Build) 7
  • 8. Maven-Multi-Projekt für Java-EE-Anwendung <project> <groupId>de.gedoplan.bde</groupId> <project> <artifactId>bde</artifactId> <version>1.0.0</version> <parent> <groupId>de.gedoplan.bde</groupId> <modules> <artifactId>bde</artifactId> <module>bde-common</module> <version>1.0.0</version> <module>bde-comp-mitarbeiter</module> </parent> <module>bde-comp-zeiterfassung</module> <module>bde-web</module> <artifactId>bde-comp-mitarbeiter</artifactId> <module>bde-ear</module> <packaging>ejb</packaging> </modules> <project> <project> <parent> ... <parent> ... <artifactId>bde-web</artifactId> <artifactId>bde-ear</artifactId> <packaging>war</packaging> <packaging>ear</packaging> <dependencies> ... <artifactId>bde-comp-mitarbeiter ... ... <artifactId>bde-web ... 8
  • 9. Regel 2: Schichten-Architektur Zerlegung in 3-Schichten-Architektur Präsentations-Schicht (GUI) Fachlogik-Schicht (Geschäftsfälle, Dienste, Fachklassen) Datenhaltungs-Schicht (Speicherung der Objekte, RDBMS) zusätzlich oftmals „übergreifende“ Schichten fachliches Klassenmodell (Entitäten) Basis-Dienste und –Klassen (z. B. Ausnahmen, Meldungen) Schichten-Zerlegung ist möglich auf Ebene des Software-Systems auf Ebene der Komponenten 9
  • 11. Sicherstellung der Schichten-Architektur häufige Verletzungen der Schichten-Architektur „Überspringen“ einer Schicht (Präsentation Datenhaltung) „umgekehrte“ benutzt-Beziehung (Datenhaltung Fachlogik) falsche Zuordnung von Implementierung Realisierung von fachlicher Logik in Dialogklassen erkennbar in Benutzung von Fachklassen anstelle von Dienst-Schnittstelle Sicherstellung durch Spezifikation von erlaubten benutzt-Beziehungen nicht erlaubten benutzt-Beziehungen 11
  • 12. Sicherstellung mit Checkstyle-Modul „Import Control“ 12
  • 13. Regel 3: Modell-getriebene Entwicklung aus einem „Modell“ generierter Java-Code ist strukturiert einheitlich korrekt und stabil Code-Generierung steigert außerdem die Effizienz der Software-Entwicklung die Wartbarkeit des Software-Systems 13
  • 14. „klassische“ Modell-getriebene Entwicklung Generierung @Entity public class Land des fachlichen Klassenmodells { @Id (Entitäten) private String isoCode; private String name; als POJO-Klassen mit JPA- public Land() Annotationen {} public String getIsoCode() aus UML-Klassenmodell (z. B. { return this.isoCode; } Enterprise Architect) public void setIsoCode(String code) { this.isoCode = code; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } } 14
  • 15. Generierung von XML-Zugriffsklassen (1) Generierung für die Umwandlung Java-Objekte XML-Dokumente (Marshalling / Unmarshalling) als POJO-Klassen mit JAXB-Annotationen aus XML-Schema (z. B. XMLSPY) mit dem JAXB-Schema-Compiler (Java Architecture for XML Binding) 15
  • 16. Generierung von XML-Zugriffsklassen (2) XJC @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "Satzart_Ctp", propOrder = {"verfahren", "zeitraumAb", "zeitraumBis"}) public class Satzart implements Serializable { @XmlElement(name = "Verfahren", required = true) private String verfahren; public String getVerfahren() { return verfahren; } public void setVerfahren(String daten) { verfahren = daten; } 16
  • 17. Generierung eines Formel-Parser Generierung eines Parser für arithmetisch-logische Formeln aus einer kontextfreien Grammatik mit dem Parser-Generator JavaCC (Java Compiler Compiler) TOKEN: { | < PLUS: "+" > 12 * x + 5 ... | < MINUS: "-" > } void Addition(): { Token t = null; StringBuilder sb = new StringBuilder(); } + { Multiplikation() ( ( t = <PLUS> Multiplikation() ) { sb.append(t.image); } | ( t = <MINUS> Multiplikation() ) { sb.append(t.image); } * 5 )* { jjtThis.jjtSetValue(sb.toString()); } } 12 x 17
  • 18. Regel 4: inkrementelle Entwicklung - Randbedingungen package de.aoksystems.pragsys.service.pruefkern; import de.aoksystems.pragsys.bo.statistik.Statistik; import de.aoksystems.pragsys.bo.pruefung.Pruefergebnis; @Stateless public class PruefServiceBean implements PruefService { /** * Diese Methode prüft eine Statistik, die an das Prüfsystem * übergeben wurde, und liefert das Prüfergebnis zurück. */ public Pruefergebnis pruefeStatistik(Statistik s) {...} } 18
  • 19. Regel 4: inkrementelle Entwicklung - Tipps Implementierung: konkret beginnen und schrittweise verfeinern erst „in die Tiefe“, später „in die Breite“ implementieren (Prototyping, depth-first) möglichst frühe Rückkopplung gleichzeitige Erstellung von Unit-Tests Review durch Projekt-Kollegen Demonstration für Benutzer Grundsätze beachten (vgl. http://www.clean-code-developer.de) immer objektorientiert und „sauber“ möglichst einfach (KISS), redundanzfrei (DRY), ... „Software ist (fast) nie fertig.“ (evolutionäre Entwicklung, TODOs) 19
  • 20. Regel 5: Richtlinien und statische Code-Analyse ein Team von SW-Entwicklern ist heterogen (Berufs-/Projekterfahrung, Programmierstil) für einheitlichen, lesbaren, kommentierten usw. Java-Code sind Entwicklungs-Richtlinien unabdingbar Richtlinien-Katalog zusammengefasst im Entwickler-Handbuch Beschreibung der Richtlinie (ggf. mit Motivation, Zielsetzung) Positiv- und ggf. Negativ-Beispiele (Do‘s and Dont‘s) Umfang des Programm-Code und Anzahl der Richtlinien erfordern automatisierte Überwachung Werkzeuge für die statische Code-Analyse z. B. Checkstyle, FindBugs, SonarJ 20
  • 21. Regel 5: Richtlinien-Katalog (Beispiele) Standard-Konventionen für Java der Firma Sun deutsche Bezeichner für Klassen, Attribute, Methoden etc. verwenden Konstanten bestehen nur aus Großbuchstaben, Ziffern und dem Unterstrich "_" anstatt null ein Array der Länge 0 zurück geben falls eine Exception geworfen wird, muss sie protokolliert werden mehrmals benötigte Programmlogik wird in eine separate Methode bzw. Klasse ausgelagert Reflection darf nicht verwendet werden 21
  • 22. Regel 5: Werkzeuge für statische Code-Analyse Idealfall: für jede Richtlinie gibt es eine aktivierte Analyse-Regel und umgekehrt für „kleine“ Projekte sollte ein Code-Analyse-Werkzeug reichen für „große“ Projekte und Vollständigkeit müssen ggf. mehrere Code- Analyse-Werkzeuge parallel eingesetzt werden erhöhter Konfigurationsaufwand Problem der Mehrfach-Meldung von Verletzungen Standardisierung / Wiederverwendung des Richtlinien-Kataloges und der Werkzeug-Konfiguration (über Projekt- und Abteilungsgrenzen) Werkzeuge machen Reviews durch Software-Architekten oder erfahrene Entwickler nicht überflüssig 22
  • 23. Beispiel: Code-Bereinigung mittels Checkstyle / Review (5) Import-Organisation, Formatierung (4) Namenskonventionen, Bezeichner, for (3) JavaDoc, Anweisungs-Struktur, Kommentare (2) try-catch, Parameterprüfung (1) Ausnahmebehandlung, Logging „Nice“ 23
  • 24. Regel 6: integrierter, automatisierter Test Software-Test hat zwei Zielsetzungen im Java-Code möglichst viele Fehler aufdecken Korrektheit der Anwendung demonstrieren Test ist integraler Bestandteil der Software-Entwicklung, und nicht nur nachgelagert (vgl. testgetriebene Entwicklung, test-first) Test dient zum Nachweis der dynamischen, funktionalen Korrektheit des Java-Code (dies ist mit statischer Code-Analyse nicht möglich) Fokus liegt auf der Realisierung von automatisierten Tests dafür Einsatz von Java-Test-Frameworks und –Werkzeugen 24
  • 25. Regel 6: Test-Konzeption für Java-(EE)-Anwendungen Schritt 1: Entwicklertest für wichtige Klassen und Methoden „Standard“-Framework JUnit 4.x Schritt 2: Realisierung einer Testdaten-Verwaltung Nutzung dedizierter Test-Datenbank(en) explizite Testdaten-Erzeugung mittels Java (DBUnit, XMLUnit) Schritt 3: Integrationstest der Service-Schicht per JUnit-Testclient gegen den Application-Server (remote) mittels z. B. OpenEJB innerhalb der IDE (embedded) Schritt 4: „automatisierter Abnahmetest“ der GUI-Clients Werkzeug abhängig von GUI-Technologie und –Bibliothek z. B. QF-Test (alle), Selenium (Web), Abbot (Swing) Schritt 5: Test nicht-funktionaler Anforderungen (Performanz, Last) 25
  • 26. Regel 6: Bibliothek der automatisierten Testfälle Zusammenfassung aller automatisierten Testfälle aus Schritt 1 bis 5 zu einer Test-Bibliothek als Test-Suites gemäß JUnit (JUnit-Integration aller Werkzeuge / Frameworks vorausgesetzt) hierarchische Strukturierung der Test-Suites gesamte Test-Bibliothek auf Entwicklungsrechner lokal ausführbar 26
  • 27. Regel 7: Refactoring und Regressionstest Fehler und Qualitätsmängel des Java-Code werden laufend festgestellt durch werkzeuggestützte, automatisierte Tests werkzeuggestützte, statische Code-Analyse direkte Notwendigkeit für Fehlerbehebung und Mängelbeseitigung bedingt oftmals Refactoring, d. h. weitergehende, strukturelle „Umbau-Arbeiten“ nach einem Refactoring ist der Java-Code fehlerbereinigt und / oder qualitativ besser ist die Gesamt-Funktionalität unverändert 27
  • 28. Beispiel: Redundanz-Beseitigung und Kapselung Aufdecken von redundantem Java-Code mit Checkstyle-Modul „Strict Duplicate Code“ Auslagern der Code-Redundanz in eine separate Klasse dadurch gleichzeitig Kapselung der Verwendung des JAXB-Framework 28
  • 29. Regel 7: Regressionstest im Rahmen der CI Wahrung der funktionalen Korrektheit nach Refactorings wird durch den Regressionstest sichergestellt Regressionstest ist der Test des gesamten Java-Code auf Basis der Test-Bibliothek Zusammenfassung aller automatisierten, qualitätssichernden Maßnahmen in der Continuous Integration (Hudson): Integrations-Build (Subversion, Maven) Generierung der Programm-Dokumentation (JavaDoc) statische Code-Analyse (Checkstyle, ...) Regressionstest (JUnit, ...) auf Basis der Test-Bibliothek Messung der Test-Überdeckung (Cobertura) Deployment auf QS-Umgebung (für manuelle Tests) 29