18.05.2017, DeveloperCamp 2017, Nürnberg
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.
Erkenntnistheoretische Beurteilung von Extreme Programming
Architektur und Code im Einklang [DeveloperCamp 2017]
1. Architektur und Code
im Einklang
Umsetzung von Architekturkonzepten
und Designvorgaben mit jQAssistant und
AsciiDoc direkt im Quellcode automatisiert
überprüfen
@feststelltaste feststelltaste.de talk@markusharrer.de
Markus Harrer
2. “If you think good architecture is
expensive, try bad architecture.”
Brian Foote
3. “If you think good architecture is
expensive, try undocumented and
non-validated architecture.”
Markus Harrer
7. jQAssistant Funktionsweise
• Scanne Softwarestrukturen
• Speichere diese in eine Datenbank
• Führe Abfragen aus
• Untersuche Zusammenhänge
• Ergänze Konzepte
• Validiere Regelverletzungen
• Generiere Berichte
8. jQAssistant Kernideen: Concepts
• Gescannte Elemente werden Konzepten
(„concepts“) zugeordnet, z. B.
• Maven Project = Modul
• Java Package = Schicht
• Mit @Entity annotierte Klasse = JPA-Entity
9. 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.“
10. jQAssistant Kernideen: Groups
• Alles wird in einer gemeinsamen
Dokumentation festgehalten, über Gruppen
(„groups“) strukturiert und beim Build
ausgeführt.
Ausschnitt:
21. Graph im Detail
Kanten
Typ einer Beziehung
DECLARES
EXTENDS
IMPLEMENTS
ANNOTATED_BY
DEPENDS_ON
...
22. Ein Graph
File Class TypeFile
key value
name “entity“
file “Entity.java”
fqn “jpa.thing.Entity”
key value
weight 3key value
name “Pet”
file “Pet.java”
fqn “foo.bar.Pet”
Labels
Properties
45. AsciiDoc
Markup Language
• Rendert zu
• DocBook
• HTML
• PDF
mit Cypher: ausführbare Spezifikation!
• Programmiervorgaben
• Design und Architektur
46. 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
----
47. 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
----
52. • 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