Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Architektur und Code im Einklang (DeveloperCamp 2017)

Markus Harrer
May 18, 2017
28

Architektur und Code im Einklang (DeveloperCamp 2017)

Umsetzung von Architekturkonzepten und Designvorgaben mit jQAssistant direkt im Quellcode überprüfen

jQAssistant ist ein Werkzeug zur statischen Analyse von Softwareartefakten. Mit jQAssistant ist es möglich, Architektur- und Designkonzepte als einen Satz von Regeln zu definieren. Die Einhaltung dieser Regeln kann anschließend bei jedem Bau einer Software automatisiert überprüft werden. Dadurch kann sichergestellt werden, dass eine vorgegebene Architektur sowie Designvorgaben auch wirklich im Quellcode umgesetzt wurden.

In meinem Vortrag stelle ich die Grundlagen von jQAssistant vor und zeige an einem Beispiel, wie sich mit dem Werkzeug eine sich selbst prüfende Architekturdokumentation erstellen lässt.

Markus Harrer

May 18, 2017
Tweet

More Decks by Markus Harrer

Transcript

  1. Architektur und Code im Einklang Umsetzung von Architekturkonzepten und Designvorgaben

    mit jQAssistant und AsciiDoc direkt im Quellcode automatisiert überprüfen @feststelltaste feststelltaste.de [email protected] Markus Harrer
  2. “If you think good architecture is expensive, try undocumented and

    non-validated architecture.” Markus Harrer
  3. jQAssistant Funktionsweise • Scanne Softwarestrukturen • Speichere diese in eine

    Datenbank • Führe Abfragen aus • Untersuche Zusammenhänge • Ergänze Konzepte • Validiere Regelverletzungen • Generiere Berichte
  4. jQAssistant Kernideen: Concepts • Gescannte Elemente werden Konzepten („concepts“) zugeordnet,

    z. B. • Maven Project = Modul • Java Package = Schicht • Mit @Entity annotierte Klasse = JPA-Entity
  5. jQAssistant Kernideen: Constraints • Regeln werden auf Basis der Konzepte

    textuell formuliert, z. B. „Alle JPA-Entitäten müssen sich in der Persistenz-Schicht befinden“ • Abweichungen von den Regeln („constraints“) werden geprüft, z. B. „Gib mir alle JPA-Entities, die sich nicht in der Persistenzschicht befinden.“
  6. jQAssistant Kernideen: Groups • Alles wird in einer gemeinsamen Dokumentation

    festgehalten, über Gruppen („groups“) strukturiert und beim Build ausgeführt. Ausschnitt:
  7. Scanner *.class RDBMS Schema Git JaCoCo FindBugs CheckStyle JAR, WAR,

    EAR ZIP application.xml web.xml MANIFEST.M F beans.xml pom.xml surefire-reports.xml GZ *.properties *.xsd M2 Repository *.yaml *.xml
  8. Scanner *.class RDBMS Schema Git JaCoCo FindBugs CheckStyle JAR, WAR,

    EAR ZIP application.xml web.xml MANIFEST.M F beans.xml pom.xml surefire-reports.xml GZ *.properties *.xsd M2 Repository *.yaml *.xml
  9. Scanner *.class RDBMS Schema Git JaCoCo FindBugs CheckStyle JAR, WAR,

    EAR ZIP application.xml web.xml MANIFEST.M F beans.xml pom.xml surefire-reports.xml GZ *.properties *.xsd M2 Repository *.yaml *.xml
  10. Scanner *.class RDBMS Schema Git JaCoCo FindBugs CheckStyle JAR, WAR,

    EAR ZIP application.xml web.xml MANIFEST.M F beans.xml pom.xml surefire-reports.xml GZ *.properties *.xsd M2 Repository *.yaml *.xml
  11. Scanner *.class RDBMS Schema Git JaCoCo FindBugs CheckStyle JAR, WAR,

    EAR ZIP application.xml web.xml MANIFEST.M F beans.xml pom.xml surefire-reports.xml GZ *.properties *.xsd M2 Repository *.yaml *.xml
  12. Scanner *.class RDBMS Schema Git JaCoCo FindBugs CheckStyle JAR, WAR,

    EAR ZIP application.xml web.xml MANIFEST.M F beans.xml pom.xml surefire-reports.xml GZ *.properties *.xsd M2 Repository *.yaml *.xml
  13. Ein Graph File Class Type File key value name “entity“

    file “Entity.java” fqn “jpa.thing.Entity” key value weight 3 key value name “Pet” file “Pet.java” fqn “foo.bar.Pet” Labels Properties
  14. Graph im Detail Properties Eigenschaften eines Knotens fqn name visibility

    abstract static final ... key value name “Pet” file “Pet.java” fqn “foo.bar.Pet”
  15. AsciiDoc Markup Language • Rendert zu • DocBook • HTML

    • PDF mit Cypher: ausführbare Spezifikation! • Programmiervorgaben • Design und Architektur
  16. Definition eines Concepts == JPA Entities [[jpa2:Entity]] .Labels all types

    annotated with @javax.persistence.Entity with Jpa and Entity. [source,cypher,role=concept] ---- MATCH (t:Type)-[:ANNOTATED_BY]->()-[:OF_TYPE]->(a:Type) WHERE a.fqn ="javax.persistence.Entity" SET t:Jpa:Entity RETURN t AS Entity ----
  17. Definition eines Constraints [[model:JpaEntityInModelPackage]] .All JPA entities must be located

    in packages named "model". [source,cypher,role=constraint,requiresConcepts="jpa2:Entity"] ---- MATCH (package:Package)-[:CONTAINS]->(entity:Jpa:Entity) WHERE package.name <> "model" RETURN entity AS EntityInWrongPackage ----
  18. • jQAssistant bietet schnelle und flexible Sichten auf eine Vielzahl

    von Softwarestrukturen • Zusammenhänge können explorativ über die Graphdatenbank Neo4j erkundet werden • Definition von Spielregeln über Concepts und Constraints in Cypher / AsciiDoc Automatisierte Überprüfung von • Architekturkonzepten und • Designvorgaben • direkt im Code Zusammenfassung
  19. Links • jQAssistant • http://jqassistant.org • Ausführliches Video • https://www.youtube.com/watch?v=kQr2c7yWbEA

    • Spring PetClinic Beispielprojekt • Repo: http://github.com/buschmais/spring-petclinic • Output: https://buschmais.github.io/spring-petclinic/ • Meine Erfahrungen soweit • https://www.feststelltaste.de/my-experiences-with- jqassistant-so-far/
  20. Credits Einige Beispiele wurden aus Dirk Mahlers Vortrag “jQAssistant -

    Verify Your Design And Architecture” übernommen • https://jqassistant.org/wp-content/uploads/2016/06/ jQAssistant-Verify-Your-Design-And-Architecture.pdf Bilder • https://de.wikipedia.org/wiki/Datei:Yin_yang.svg • https://commons.wikimedia.org/wiki/File:Achitecture_time.jpg • https://commons.wikimedia.org/wiki/File:Adelaide_Street_aba ndoned_house.jpg