{"id":61,"date":"2018-03-27T15:42:46","date_gmt":"2018-03-27T13:42:46","guid":{"rendered":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/?p=61"},"modified":"2022-12-01T15:43:13","modified_gmt":"2022-12-01T14:43:13","slug":"werkzeuge-zur-erhaltung-der-softwarearchitektur-checkstyle-teil-9","status":"publish","type":"post","link":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/?p=61","title":{"rendered":"Werkzeuge zur Erhaltung der Softwarearchitektur &#8211; Checkstyle &#8211; Teil 9"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Checkstyle<\/h2>\n\n\n\n<p>In diesem und den kommenden Posts stelle ich die &#8222;magischen drei&#8220; im Bereich der statischen Code-Analyse vor.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Checkstyle<\/li>\n\n\n\n<li>PMD<\/li>\n\n\n\n<li>Findbugs<\/li>\n<\/ul>\n\n\n\n<p>Ohne diese Werkzeuge mit geeigneten Regelwerken sollte keine Entwicklungsarbeit mehr erfolgen. Sie sind die Basis f\u00fcr die dauerhafte Einhaltung der Architekturvorgaben und ebenso die Basis f\u00fcr die Vermeidung technischer Schulden. Die einzelnen Werkzeuge kann man inhaltlich nicht klar von einander abgrenzen, da sie gr\u00f6\u00dfere Schnittmengen haben. Jedes Tool hat seine St\u00e4rken in einem anderen Bereich, deckt aber auch vieles anderes ab. Erst die Kombination alle Tools ergibt ein gutes Grundniveau.<\/p>\n\n\n\n<p>Checkstyle ist besonders stark im Bereich der Einhaltung der Kodierungsrichtlinien. Es schafft somit die Basis f\u00fcr das Verstehen von Code, das wie fr\u00fcher schon erw\u00e4hnt h\u00e4ufig deutlich mehr als 50% unserer Arbeit ausmacht.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Was wird analysiert?<\/h3>\n\n\n\n<p>Checkstyle analysiert den Quellcodes des Projekts &#8211; also keinen Bytecode.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Besonderheiten<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Code-Konsistenz \/ Struktur \/ Codestyle<\/li>\n\n\n\n<li>Dokumentation (Javadoc)<\/li>\n\n\n\n<li>in Teilen Komplexit\u00e4t<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Integration<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IDE<\/li>\n\n\n\n<li>In die \u00dcbernahme in SVN\/Git durch die Verwendung von Pre-Commit Hooks<\/li>\n\n\n\n<li>Maven-Build (Ausf\u00fchrung und Erzeugen von Basisdaten)<\/li>\n\n\n\n<li>Jenkins (GUI und Grenze f\u00fcr ung\u00fcltige Artefakte)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">False Positive Behandlung<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Parametrisierung bzw. Reduzierung der verwendeten Regeln<\/li>\n\n\n\n<li>Codestellen ignorieren: \u00fcber Annotationen oder einen Kommentar; Konfiguration im SuppressionFilter<\/li>\n\n\n\n<li>Ausschluss von Paketen bei der Pr\u00fcfung: insbesondere auch bei der Verwendung von Pre-Commit Hooks<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Regelerweiterung<\/h3>\n\n\n\n<p>Die Erweiterung der Regeln ist aus meiner Sicht hier und bei den anderen Werkzeugen lange Zeit nicht notwendig, da die Basisregeln eine gute Basis bieten. Sind alle diese Regeln erf\u00fcllt, ist das Projekt im Bereich QS schon einen weiten Weg gegangen. Anpassungen sind m\u00f6glich \u00fcber<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Java<\/li>\n\n\n\n<li>http:\/\/checkstyle.sourceforge.net\/writingchecks.htm<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Beispielkonfiguration<\/h3>\n\n\n\n<p>Das folgende Beispiel zeigt eine Whitelist &#8211; also eine Beschreibung der Regeln, die angewendet werden sollen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?>\n&lt;!DOCTYPE module PUBLIC \"-\/\/Puppy Crawl\/\/DTD Check Configuration 1.3\/\/EN\" \n  \"http:\/\/www.puppycrawl.com\/dtds\/configuration_1_3.dtd\">\n&lt;module name=\"Checker\">\n    &lt;property name=\"severity\" value=\"warning\" \/>\n    &lt;property name=\"localeCountry\" value=\"DE\" \/>\n    &lt;property name=\"localeLanguage\" value=\"de\" \/>\n\n    &lt;module name=\"JavadocPackage\">\n        &lt;property name=\"allowLegacy\" value=\"true\" \/>\n    &lt;\/module>\n    &lt;module name=\"TreeWalker\">\n        &lt;!-- Klassen und Importe -->\n        &lt;module name=\"AbstractClassName\">\n            &lt;property name=\"format\" value=\"^Abstract.*$\" \/>\n        &lt;\/module>\n        &lt;module name=\"AvoidStarImport\" \/>\n        &lt;module name=\"PackageName\" \/>\n        &lt;module name=\"RedundantImport\" \/>\n...\n    &lt;\/module>\n&lt;\/module><\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Pre-Commit Hook<\/h3>\n\n\n\n<p>Ein Pre-Commit Hook ist ein Python oder Shell Skript, das vor dem Einchecken auf dem Server ausgef\u00fchrt wird. In diesem wird das Change Set im SCM ermittelt und auf diesem Checkstyle mit einem geeigneten Regelwerk angewendet. Sind Regeln nicht erf\u00fcllt, wird die \u00dcbernahme in das SCM System mit einer entsprechenden Fehlermeldung verweigert.<\/p>\n\n\n\n<p>Auf diese Weise bekommt der Entwickler sehr schnelles Feedback und es wird &#8222;schlechter&#8220; Code gar nicht erst in das SCM aufgenommen<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Checkstyle In diesem und den kommenden Posts stelle ich die &#8222;magischen drei&#8220; im Bereich der statischen Code-Analyse vor. Ohne diese Werkzeuge mit geeigneten Regelwerken sollte keine Entwicklungsarbeit mehr erfolgen. Sie sind die Basis f\u00fcr die dauerhafte Einhaltung der Architekturvorgaben und ebenso die Basis f\u00fcr die Vermeidung technischer Schulden. Die einzelnen Werkzeuge kann man inhaltlich nicht [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-61","post","type-post","status-publish","format-standard","hentry","category-softwarearchitektur"],"_links":{"self":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/61","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=61"}],"version-history":[{"count":1,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":62,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=\/wp\/v2\/posts\/61\/revisions\/62"}],"wp:attachment":[{"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.schoenberg-solutions.de\/arndtblog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}