{"id":85,"date":"2015-04-26T14:00:22","date_gmt":"2015-04-26T12:00:22","guid":{"rendered":"http:\/\/ccd.ralfw.domainfactory-kunde.de\/?page_id=85"},"modified":"2024-10-18T11:08:19","modified_gmt":"2024-10-18T09:08:19","slug":"grado-verde","status":"publish","type":"page","link":"https:\/\/clean-code-developer.de\/es\/die-grade\/gruener-grad\/","title":{"rendered":"Grado verde"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"85\" class=\"elementor elementor-85\" data-elementor-post-type=\"page\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-205363d elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"205363d\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2b13bfa\" data-id=\"2b13bfa\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1bcbc8b elementor-toc--minimized-on-tablet elementor-widget elementor-widget-table-of-contents\" data-id=\"1bcbc8b\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;headings_by_tags&quot;:[&quot;h2&quot;,&quot;h3&quot;],&quot;exclude_headings_by_selector&quot;:[],&quot;marker_view&quot;:&quot;numbers&quot;,&quot;no_headings_message&quot;:&quot;Es wurden keine \\u00dcberschriften auf dieser Seite gefunden.&quot;,&quot;minimize_box&quot;:&quot;yes&quot;,&quot;minimized_on&quot;:&quot;tablet&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"table-of-contents.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__header\">\n\t\t\t\t\t\t<h4 class=\"elementor-toc__header-title\">\n\t\t\t\tInhaltsverzeichnis\t\t\t<\/h4>\n\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--expand\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__1bcbc8b\" aria-expanded=\"true\" aria-label=\"Inhaltsverzeichnis \u00f6ffnen\"><i aria-hidden=\"true\" class=\"fas fa-chevron-down\"><\/i><\/div>\n\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--collapse\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__1bcbc8b\" aria-expanded=\"true\" aria-label=\"Inhaltsverzeichnis schlie\u00dfen\"><i aria-hidden=\"true\" class=\"fas fa-chevron-up\"><\/i><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<div id=\"elementor-toc__1bcbc8b\" class=\"elementor-toc__body\">\n\t\t\t<div class=\"elementor-toc__spinner-container\">\n\t\t\t\t<i class=\"elementor-toc__spinner eicon-animation-spin eicon-loading\" aria-hidden=\"true\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-de90de1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"de90de1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-29635a7\" data-id=\"29635a7\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a35bc28 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"a35bc28\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<i aria-hidden=\"true\" class=\"icon icon-Prinzip\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-a7c1be6\" data-id=\"a7c1be6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-123d53d elementor-widget elementor-widget-heading\" data-id=\"123d53d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Prinzipien<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ccfefa1 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ccfefa1\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c8795f2\" data-id=\"c8795f2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2c1e0af elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"2c1e0af\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6ca1613 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6ca1613\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-3a6e168\" data-id=\"3a6e168\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a1167d4 elementor-widget elementor-widget-image\" data-id=\"a1167d4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_29_open-closed-principle-qvqeb70lcrmzad60fiuqi8qzlknp6kkbh1l0htsd4w.png\" title=\"Open Closed Principle (OCP)\u200b\" alt=\"Open Closed Principle (OCP)\u200b\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-d2d7890\" data-id=\"d2d7890\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-288149b elementor-widget elementor-widget-heading\" data-id=\"288149b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Open Closed Principle (OCP)<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-306c381 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"306c381\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c5c0258\" data-id=\"c5c0258\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4952d75 elementor-widget elementor-widget-text-editor\" data-id=\"4952d75\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Weil das Risiko, durch neue Features ein bisher fehlerfreies System zu instabilisieren, so gering wie m\u00f6glich gehalten werden sollte.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Single Developer<\/th><\/tr><\/tbody><\/table><\/div><p>Das <i>Open Closed Principle<\/i> (<a title=\"OCP\" href=\"https:\/\/en.wikipedia.org\/wiki\/Open%E2%80%93closed_principle\" target=\"_blank\" rel=\"noopener noreferrer\">OCP<\/a>) besagt, dass eine Klasse offen f\u00fcr Erweiterungen sein muss, jedoch geschlossen gegen\u00fcber Modifikationen. Es ist ein weiteres der <a title=\"SOLID\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/solid\/\">SOLID<\/a>\u00a0Prinzipien. Folgendes Codebeispiel soll verdeutlichen, wo das Problem liegt, wenn das Prinzip nicht befolgt wird:<\/p><pre>public double Preis() {\n    const decimal StammkundenRabatt = 0.95m;\n    switch(kundenart) {\n        case Kundenart.Einmalkunde:\n            return menge * einzelpreis;\n        case Kundenart.Stammkunde:\n            return menge * einzelpreis * StammkundenRabatt;\n        default:\n            throw new ArgumentOutOfRangeException();\n    }\n}\n<\/pre><p>Das problematische an dieser Form der Implementierung ist, dass die Klasse modifiziert werden muss, wenn eine weitere Art der Preisberechnung erforderlich wird. Die Gefahr dabei ist, dass bei dieser Modifikation Fehler gemacht werden und die bisher schon vorhandenen Funktionen nicht mehr ordnungsgem\u00e4\u00df funktionieren. Auch wenn automatisierte Unit Tests und Integrationstests vorhanden sind besteht das Risiko, neue Bugs zu hinterlassen, weil man keine hundertprozentige Testabdeckung erreichen kann. Gesucht ist also generell ein Verfahren, welches die Klasse erweiterbar macht, ohne dass dazu die Klasse selbst modifiziert werden muss. Dies kann z.B. mit Hilfe des\u00a0<i>Strategy Patterns<\/i> erreicht werden:<\/p><pre>public interface IPreisRechner {\n    double Preis(int menge, double einzelpreis);\n}\n\nprivate IPreisRechner preisRechner;\n\npublic double Preis() {\n    return preisRechner.Preis(menge, einzelpreis);\n}\n\npublic class Einmalkunde : IPreisRechner {\n    public double Preis(int menge, double einzelpreis) {\n        return menge * einzelpreis;\n    }\n}\n\npublic class Stammkunde : IPreisRechner {\n    const decimal StammkundenRabatt = 0.95m;\n    \n    public double Preis(int menge, double einzelpreis) {\n        return menge * einzelpreis * StammkundenRabatt;\n    }\n}\n<\/pre><p>Die konkrete Berechnung des Preises wird \u00fcber ein Interface in andere Klassen ausgelagert. Dadurch ist es m\u00f6glich, jederzeit neue Implementierungen des Interfaces zu erg\u00e4nzen. Damit ist die Klasse offen f\u00fcr Erweiterungen, gleichzeitig aber geschlossen gegen\u00fcber Modifikationen. Bestehender Code kann z.B. mit dem Refactoring <a title=\"Replace Conditional with Strategy\" href=\"http:\/\/www.industriallogic.com\/xp\/refactoring\/conditionalWithStrategy.html\" target=\"_blank\" rel=\"noopener noreferrer\">Replace Conditional with Strategy<\/a> so umgestaltet werden, dass das Open Closed Principle eingehalten wird.<\/p><h4>Quellen<\/h4><table><thead><tr><th>Quelle<\/th><th>Autor<\/th><th>Kurzbeschreibung<\/th><\/tr><\/thead><tbody><tr><td>\u00a0<\/td><td>Robert C. Martin<\/td><td>Artikel zum Open Closed Principle von 1996 ver\u00f6ffentlicht f\u00fcr The C++ Report<\/td><\/tr><\/tbody><\/table>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9df8d33 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"9df8d33\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f889d7f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f889d7f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-231e3e3\" data-id=\"231e3e3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6f34bb9 elementor-widget elementor-widget-image\" data-id=\"6f34bb9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_42_tell-dont-ask-qvqee8zpkdtj0qq9lce33yzx3nln75oww5wtn79aww.png\" title=\"Tell, don&#8217;t ask\" alt=\"Tell, don&#039;t ask\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-d6c9758\" data-id=\"d6c9758\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b372974 elementor-widget elementor-widget-heading\" data-id=\"b372974\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Tell, don't ask<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5829a55 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5829a55\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5266137\" data-id=\"5266137\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a9a32cc elementor-widget elementor-widget-text-editor\" data-id=\"a9a32cc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Hohe Koh\u00e4sion und lose Kopplung sind Tugenden. \u00d6ffentliche Zustandsdetails einer Klasse widersprechen dem.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Single Developer<\/th><\/tr><\/tbody><\/table><\/div><p>Etwas provokant formuliert, sollten Klassen keine Property Getter haben. Diese verf\u00fchren den Verwender einer Klasse dazu, anhand von Werten, die ein Objekt liefert, Entscheidungen zu treffen. Statt also dem Objekt mitzuteilen, was es tun soll, wird es befragt, um dann von au\u00dfen Betrachtungen \u00fcber den internen Zustand des Objektes anzustellen.<\/p><p>Eines der Kernprinzipien der Objektorientierten Programmierung lautet <i>Information Hiding<\/i> (siehe dazu auch im <a title=\"Gelber Grad\" href=\"http:\/\/clean-code-developer.de\/die-grade\/gelber-grad\/\">gelben Grad<\/a>). Keine Klasse soll Details nach au\u00dfen tragen, aus denen hervorgeht, wie sie intern implementiert ist. Ben\u00f6tigt eine Klasse f\u00fcr ihre Arbeit einen internen Zustand, wird dieser typischerweise in einem internen Feld abgelegt. Wenn nun dieser Wert auch nach au\u00dfen sichtbar ist, werden Verwender verleitet, diesen eigentlich internen Zustand des Objektes f\u00fcr eigene Entscheidungen heranzuziehen. Dadurch wird die Klasse schnell zur reinen Datenhaltung degradiert. Eine Implementierung, bei der einem Objekt mitgeteilt wird, was es tun soll, ist in jedem Fall vorzuziehen. Dadurch muss es den Verwender nicht mehr interessieren, wie die Klasse die Aufgabe intern bewerkstelligt.<\/p><p>Als Ergebnis des <a title=\"Tell don't ask\" href=\"http:\/\/www.pragprog.com\/articles\/tell-dont-ask\" target=\"_blank\" rel=\"noopener noreferrer\">Tell don&#8217;t ask<\/a> Prinzips entstehen Objekte mit Verhalten statt &#8222;dummer&#8220; Datenhaltungsobjekte. Das Zusammenspiel der Objekte ist lose gekoppelt, da die Objekte keine Annahmen \u00fcber die kollaborierenden Objekte machen m\u00fcssen. Aber nicht nur das! Wenn Objekte ihren Zustand nicht ver\u00f6ffentlichen, behalten sie die Entscheidungshoheit. Die Koh\u00e4sion des entscheidenden Codes w\u00e4chst damit, weil er an einem Ort zusammengelegt wird.<\/p><p>Ein typisches Codebeispiel ist im folgenden zu sehen. Statt hier zun\u00e4chst zu fragen, ob im Logging die Tracemeldungen aktiviert sind (Ask), sollte die Logging Bibliothek direkt angewiesen werden, die Tracemeldung auszugeben (Tell). Die Bibliothek soll dann intern selbst entscheiden, ob die Meldung geloggt wird oder nicht.<\/p><p>if (_logger.Trace()) {<br \/>_logger.TraceMsg(&#8222;&#8230; eine Meldung&#8230; &#8222;);<br \/>}<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e1ae0b3 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"e1ae0b3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ee4832a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ee4832a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-a8dc176\" data-id=\"a8dc176\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-99218ea elementor-widget elementor-widget-image\" data-id=\"99218ea\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_26_law-of-demeter-qvqehkd7occxz7wv89zpemvgjl99cputokrhlccayo.png\" title=\"Law of Demeter (LoD)\" alt=\"Law of Demeter (LoD)\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-bf84ee8\" data-id=\"bf84ee8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-8b5fd99 elementor-widget elementor-widget-heading\" data-id=\"8b5fd99\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Law of Demeter (LoD)<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1d495f2 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1d495f2\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-17b4baa\" data-id=\"17b4baa\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-27ce7ab elementor-widget elementor-widget-text-editor\" data-id=\"27ce7ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Abh\u00e4ngigkeiten von Objekten \u00fcber mehrere Glieder einer Dienstleistungskette hinweg f\u00fchren zu unsch\u00f6n enger Kopplung.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Single Developer<\/th><\/tr><\/tbody><\/table><\/div><p>Beim <a title=\"Law of Demeter\" href=\"http:\/\/www.lieser-online.de\/blog\/?p=124\" target=\"_blank\" rel=\"noopener noreferrer\">Law of Demeter<\/a> geht es darum, das Zusammenspiel von Objekten auf ein gesundes Ma\u00df zu beschr\u00e4nken. Man kann es vereinfacht umschreiben mit &#8222;Don&#8217;t talk to strangers&#8220;. Nach dem Law of Demeter soll eine Methode nur folgende andere Methoden verwenden:<\/p><ul><li>Methoden der eigenen Klasse<\/li><li>Methoden der Parameter<\/li><li>Methoden assoziierter Klassen<\/li><li>Methoden selbst erzeugter Objekte<\/li><\/ul><p>Allerdings: Es ist zu ber\u00fccksichtigen, dass ab und zu auch reine Datenhaltungsklassen Sinn ergeben. Auf diese muss man das Law of Demeter nat\u00fcrlich nicht anwenden. Es kann z.B. durchaus sinnvoll sein, die Konfigurationsdaten in mehrere Klassen hierarchisch zu verteilen, so dass sich am Ende folgender Zugriff auf einen Wert ergeben k\u00f6nnte:<\/p><pre>int margin = config.Pages.Margins.Left;\n<\/pre><p>W\u00fcrde man hier das Law of Demeter anwenden, w\u00e4re nur der Zugriff auf config.Pages gestattet.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1d485b4 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"1d485b4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3853466 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3853466\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-5d40d92\" data-id=\"5d40d92\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5da27f0 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"5da27f0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<i aria-hidden=\"true\" class=\"icon icon-Praktik\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-5d4a36b\" data-id=\"5d4a36b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5238238 elementor-widget elementor-widget-heading\" data-id=\"5238238\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Praktiken<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-34439e6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"34439e6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-64e5d5f\" data-id=\"64e5d5f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c64cc7b elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"c64cc7b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-44f22f5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"44f22f5\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-bb32ca9\" data-id=\"bb32ca9\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3362354 elementor-widget elementor-widget-image\" data-id=\"3362354\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_9_continous-integration-qvqektv1emtsah6766s2kb82sr652vt9sqb6kxi3cw.png\" title=\"Continuous Integration (CI)\" alt=\"Continuous Integration (CI)\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-590b7a8\" data-id=\"590b7a8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9493711 elementor-widget elementor-widget-heading\" data-id=\"9493711\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Continuous Integration (CI)<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-096c7ab elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"096c7ab\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2c65c2a\" data-id=\"2c65c2a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-61e7f3f elementor-widget elementor-widget-text-editor\" data-id=\"61e7f3f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Automatisierung und Zentralisierung der Softwareproduktion machen produktiver und reduzieren das Risiko von Fehlern bei der Auslieferung.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>Oft wird die Integration der Softwarekomponenten zeitlich nach hinten geschoben und erfolgt aufwendig und fehleranf\u00e4llig &#8222;per Hand&#8220;. Eigentlich sollte die Software aber zu jedem Zeitpunkt vollst\u00e4ndig lauff\u00e4hig sein. Mit Continuous Integration bezeichnet man einen Prozess, der daf\u00fcr sorgt dass der gesamte Code nach der \u00dcbermittlung von \u00c4nderungen \u00fcbersetzt und getestet wird.<\/p><p>Der Continuous Integration Prozess ist vor allem f\u00fcr Teams wichtig, denn er sorgt daf\u00fcr, dass nach der \u00dcbermittlung von \u00c4nderungen der gesamte Code \u00fcbersetzt und getestet wird, nicht nur der Teil an dem ein Entwickler gerade gearbeitet hat. Die automatisierten Tests sollten von jedem Entwickler ausgef\u00fchrt werden bevor er \u00c4nderungen in die zentrale Versionskontrolle \u00fcbermittelt. Daran \u00e4ndert sich durch Continuous Integration nichts. Um sicherzustellen, dass die Tests tats\u00e4chlich ausgef\u00fchrt werden und Fehler fr\u00fchzeitig erkannt werden, laufen sie in jedem Fall auf dem Continuous Integration Server. Dies entbindet den Entwickler nicht davon die Tests vor dem Commit auszuf\u00fchren, schlie\u00dflich behindert fehlerhafter Code der in die Versionskontrolle eingecheckt wurde das gesamte Team, m\u00f6glicherweise sogar weitere Teams. So sorgt der Continuous Integration Prozess daf\u00fcr dass team\u00fcbergreifend sichergestellt wird dass Fehler so fr\u00fch wie m\u00f6glich erkannt werden.<\/p><p>F\u00fcr den Continuous Integration Prozess stehen zahlreiche <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Softwaretools<\/a> zur Verf\u00fcgung. Neben dem kontinuierlichen Build und Test, der sofort erfolgt, wenn \u00c4nderungen in die Versionskontrolle \u00fcbertragen werden, k\u00f6nnen durch Continuous Integration auch l\u00e4nger laufende Prozesse, wie z.B. Datenbanktests, automatisiert werden. Diese werden dann z.B. nur nachts ausgef\u00fchrt. Im gr\u00fcnen Grad wird lediglich der Build- und Testprozess ber\u00fccksichtigt. Das kontinuierliche Setup und Deployment der Software folgt erst sp\u00e4ter im <a title=\"Blauer Grad\" href=\"http:\/\/clean-code-developer.de\/die-grade\/blauer-grad\/\">blauen Grad<\/a>.<\/p><p>Martin Fowler hat einen sehr guten Artikel zu diesem Thema verfasst, nachzulesen unter <a title=\"Continuous Integration\" href=\"http:\/\/www.martinfowler.com\/articles\/continuousIntegration.html\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/www.martinfowler.com\/articles\/continuousIntegration.html<\/a><\/p><p>Siehe auch unter <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Tools<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b1327c3 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"b1327c3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-22e6c1a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"22e6c1a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-c472d49\" data-id=\"c472d49\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-baf9742 elementor-widget elementor-widget-image\" data-id=\"baf9742\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_41_statical-code-analysis-qvqent0n1qwh20ujsh3jgk6miohzgdmo7gojah37nk.png\" title=\"Statical Code Analysis\" alt=\"Statical Code Analysis\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-d71308f\" data-id=\"d71308f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ef99c5a elementor-widget elementor-widget-heading\" data-id=\"ef99c5a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Statical Code Analysis<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-0b5ae82 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"0b5ae82\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ec6adb6\" data-id=\"ec6adb6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-46ffd95 elementor-widget elementor-widget-text-editor\" data-id=\"46ffd95\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Vertrauen ist gut, Kontrolle ist besser &#8211; und je automatischer, desto leichter ist sie.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Single Developer<\/th><\/tr><\/tbody><\/table><\/div><p>Wie definiert sich eigentlich die Qualit\u00e4t einer Codeeinheit, z.B. einer Klasse oder Komponente? Reicht es, dass sie funktional die Anforderungen des Kunden erf\u00fcllt? Reicht es, dass er schnell genug und skalierbar genug ist? Automatische Tests und schlie\u00dflich Tests durch den Kunden geben dar\u00fcber ja Auskunft. Ohne solche Anforderungskonformit\u00e4t hat Software nat\u00fcrlich keine relevante Qualit\u00e4t. Wenn sie dem Kunden nicht n\u00fctzt, er\u00fcbrigt sich jede weitere Frage.<\/p><p>Auf der anderen Seite reicht es, entgegen immer noch weit verbreiteter Annahme, allerdings auch nicht, anforderungskonform zu sein. Hohe Qualit\u00e4t ergibt sich nicht allein aus Funktionalit\u00e4t und z.B. Performance. Denn neben den funktionalen und nicht funktionalen Anforderungen gibt es auch noch eine meist unausgesprochene verborgene Anforderung: Kunden wollen auch immer, dass Software nicht nur heute ihre Anforderungen erf\u00fcllt, sondern auch noch morgen und \u00fcbermorgen. Kunden wollen Investitionsschutz durch Wandelbarkeit.<\/p><p>F\u00fcr Kunden ist diese Anforderung meist implizit. Sie glauben, es sei selbstverst\u00e4ndlich, dass ein immaterielles Produkt wie Software sich quasi unendlich und auf Knopfdruck an neue Anforderungen anpassen lie\u00dfe. Auch F\u00fchrungskr\u00e4fte, die nicht aus der Softwareentwicklung stammen, glauben das oft. Und sogar Softwareentwickler selbst!<\/p><p>Gr\u00f6\u00dfer k\u00f6nnte das Missverst\u00e4ndnis \u00fcber Software jedoch kaum sein. Wandelbarkeit ist weder selbstverst\u00e4ndlich im Sinne eines von jedem Softwareentwickler ohnehin verfolgten Zieles, noch ergibt sie sich durch irgendetwas quasi von selbst. Wandelbarkeit ist vielmehr harte Arbeit und muss st\u00e4ndig gegen andere Werte abgewogen werden.<\/p><p>Wenn sonstige Anforderungskonformit\u00e4t sich nun durch (automatisierte) Tests feststellen l\u00e4sst, wie steht es dann mit der Wandelbarkeit? L\u00e4sst sich die Qualit\u00e4t von Code im Hinblick auf seine (\u00dcber)Lebensf\u00e4higkeit auch automatisch messen? Zum Teil. Nicht alle Aspekte, die Software evolvierbar machen, sind automatisch pr\u00fcfbar. Ob zum Beispiel Software offen f\u00fcr Erweiterungen durch ein Add-In-Konzept gehalten wird, ist nicht automatisiert erkennbar.<\/p><p>Dennoch gibt es <a title=\"Metriken\" href=\"http:\/\/en.wikipedia.org\/wiki\/Software_metric\" target=\"_blank\" rel=\"noopener noreferrer\">Metriken<\/a>, deren Wert f\u00fcr eine Software sich &#8222;ausrechnen&#8220; l\u00e4sst. <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Tools<\/a> helfen dabei. Diese Tools sollten daher in jedem Softwareprojekt zum Einsatz kommen.<\/p><ul><li>F\u00fcr Legacy Code k\u00f6nnen die Tools den Status Quo erheben und somit eine Grundlinie definieren, mit der die weitere Entwicklung des Codes (zum Besseren) verglichen werden kann.<\/li><li>F\u00fcr neuen Code, der mit Wandelbarkeit im Blick geplant wurde, zeigt solch statische Codeanalyse, ob er das Ideal der Planung erf\u00fcllt.<\/li><\/ul><p>CCD sind nicht damit zufrieden, Code nur automatisiert zu testen. Sie haben auch immer ein Auge auf seine Wandelbarkeit, denn sie wissen, dass Kunden daran genauso interessiert sind &#8211; egal, ob sie es explizit gesagt haben oder nicht.<\/p><p>Siehe auch unter <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Tools<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a7d0de8 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"a7d0de8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-040f66c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"040f66c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4dfa549\" data-id=\"4dfa549\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-fd79231 elementor-widget elementor-widget-image\" data-id=\"fd79231\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_22_inversion-of-control-container-qvqeqlldd0q5kasgh6kmdcsy2wq9bzpy9ahhn2y35s.png\" title=\"Inversion of Control Container\" alt=\"Inversion of Control Container\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-ff300db\" data-id=\"ff300db\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2e20cc9 elementor-widget elementor-widget-heading\" data-id=\"2e20cc9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Inversion of Control Container<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8a9c321 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8a9c321\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-29c2055\" data-id=\"29c2055\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-db08679 elementor-widget elementor-widget-text-editor\" data-id=\"db08679\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Nur, was nicht fest verdrahtet ist, kann leichter umkonfiguriert werden.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Single Developer<\/th><\/tr><\/tbody><\/table><\/div><p>Bereits im <a title=\"Gelber Grad\" href=\"http:\/\/clean-code-developer.de\/die-grade\/gelber-grad\/\">gelben Grad<\/a> hat der CCD das Dependency Inversion Principle kennengelernt. Dabei wurden die Abh\u00e4ngigkeiten noch &#8222;von Hand&#8220; aufgel\u00f6st. Der n\u00e4chste logische Schritt besteht nun darin, das Aufl\u00f6sen der Abh\u00e4ngigkeiten zu automatisieren. Dazu stehen zwei Verfahren zur Verf\u00fcgung:<\/p><ul><li>Locator<\/li><li>Container<\/li><\/ul><p>Beide verwenden einen sogenannten <i>Inversion of Control Container<\/i> (IoC Container). Vor der Verwendung des Containers m\u00fcssen die verwendeten Klassen im Container hinterlegt werden. Anschlie\u00dfend kann der Container Instanzen der hinterlegten Klassen liefern. Beim <i>Locator<\/i> geschieht dies explizit. Dies hat den Vorteil, dass die Abh\u00e4ngigkeiten nicht alle im Konstruktor der Klasse aufgef\u00fchrt werden m\u00fcssen. Bei Querschnittsaufgaben wie beispielsweise <i>Logging<\/i> ist dies ein \u00fcbliches Vorgehen. In der Regel werden die Abh\u00e4ngigkeiten jedoch als Parameter des Konstruktors aufgef\u00fchrt. Dies hat den Vorteil dass alle Abh\u00e4ngigkeiten sichtbar sind. Der Container ist damit in der Lage die Abh\u00e4ngigkeiten implizit aufzul\u00f6sen in dem er rekursiv alle ben\u00f6tigten Objekte \u00fcber den Container instanziert.<\/p><p>IoC Container werden wichtig, sobald die Anzahl der Klassen w\u00e4chst. Wenn man <i>Separation of Concerns<\/i> beherzigt, entstehen viele kleine Klassen mit \u00fcberschaubaren Aufgaben. Das Zusammensetzen von Instanzen dieser Klassen wird entsprechend aufwendiger. Genau hier setzt der IoC Container an, er hilft beim Instanziieren und Verbinden der vielen kleinen Objekte.<\/p><p>Ein weiterer Vorteil von IoC Containern ist die Tatsache, dass der <i>Lebenszyklus<\/i> eines Objektes per Konfiguration bestimmt werden kann. Soll es zur Laufzeit nur eine einzige Instanz eines Objektes geben (<i>Singleton<\/i>) kann der Container angewiesen werden, immer ein und dieselbe Instanz zu liefern. Auch andere Lebenszyklen wie z.B. <i>eine Instanz pro Session<\/i> werden unterst\u00fctzt.<\/p><p>Um bei Verwendung eines Locators nicht in Abh\u00e4ngigkeit zu einem bestimmten IoC Container zu geraten, kann der <i>Microsoft Common Service Locator<\/i> (siehe Tools) verwendet werden. Dieser bietet eine vereinheitlichte Schnittstelle zu den g\u00e4ngigen IoC Containern.<\/p><p>Zum Verst\u00e4ndnis der Mechanik die hinter einem IoC Container steckt, ist es n\u00fctzlich die Funktionalit\u00e4t einmal selber zu implementieren. Dabei soll kein vollst\u00e4ndiger Container implementiert werden sondern lediglich die Grundfunktionen.<\/p><p>Siehe auch unter <a title=\"Tools\" href=\"http:\/\/clean-code-developer.de\/weitere-infos\/werkzeuge\/\">Tools<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ed4829d elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"ed4829d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8ddc939 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8ddc939\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-5c42dfd\" data-id=\"5c42dfd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1e316ab elementor-widget elementor-widget-image\" data-id=\"1e316ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_36_share-experience-qvqessjtb3q8njlro4pa6svnz9x3akfek5a9ybp0n4.png\" title=\"Share Experience\" alt=\"Share Experience\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-45fce0f\" data-id=\"45fce0f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e4af778 elementor-widget elementor-widget-heading\" data-id=\"e4af778\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Share Experience<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2c9357e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2c9357e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2cfee51\" data-id=\"2cfee51\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d4d0053 elementor-widget elementor-widget-text-editor\" data-id=\"d4d0053\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Wer sein Wissen weitergibt, hilft nicht nur anderen, sondern auch sich selbst.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Single Developer<\/th><\/tr><\/tbody><\/table><\/div><p>Zu professioneller Arbeit geh\u00f6rt selbstverst\u00e4ndlich ein st\u00e4ndig akuelles Wissen. Das bedeutet nat\u00fcrlich nicht, dass irgendjemand alles zum Thema Softwareentwicklung und sei es auch nur auf der .NET-Plattform wissen kann und soll. Aktuelles Wissen bezieht sich auf die eigenen Spezialgebiete &#8211; welche das auch immer sein m\u00f6gen. Bestandteil anderer Grade ist deshalb die Praktik der regelm\u00e4\u00dfigen Informationsaufnahme \u00fcber verschiedene Medien.<\/p><p>Aus mehreren Gr\u00fcnden sollte solche Informationssammlung jedoch nur eine von zwei Seiten der Medaille &#8222;Lernen&#8220; sein. Die andere ist die Informationsweitergabe, die Wissensvermittlung. Zur wahren Professionalit\u00e4t geh\u00f6rt unserer Ansicht nach nicht nur &#8222;Forschung&#8220;, sonder auch &#8222;Lehre&#8220;. Denn erst mit der &#8222;Lehre&#8220; findet wahre Reflektion und Durchdringung eines Gegenstandes statt.<\/p><p>Etwas Geh\u00f6rtes\/Gelesenes anwenden, ist eine Sache. Nat\u00fcrlich bemerkt man dabei auch Verst\u00e4ndnisl\u00fccken. Die &#8222;Erforschung&#8220; eines Gegenstandes ist dabei jedoch durch den Einsatzzweck nat\u00fcrlich begrenzt. Wer nur soweit forscht, wie er eine Technologie\/Konzept gerade braucht, der taucht nicht unbedingt tief ein.<\/p><p>Ganz anders ist das hingegen, wenn das Lernen mit dem Vorzeichen des Weitersagens stattfindet. Wer nicht nur f\u00fcr sich, sondern auch immer f\u00fcr andere lernt, der lernt tiefer. Das wird klar, wenn man versucht, (angeblich) Gelerntes anderen zu vermitteln. Wenn man das nicht beim Lernen im Blick hat, tauchen schnell Fragen auf, die man sich selbst nie gestellt hat. Andere haben eben immer ganz andere Blickwinkel.<\/p><p>Deshalb meinen wir, dass wirklich solide nur lernt, wer sich auch immer wieder dem Lehren, dem Weitersagen, der Wissensvermittlung aussetzt. Nur wer Gelerntes nicht nur anwendet, sondern es mit eigenen Worten f\u00fcr ein Publikum formuliert, bemerkt in dem Prozess, wie tief sein Wissen wirklich ist. Denn wenn sich die Fragezeichen bei den &#8222;Sch\u00fclern&#8220; h\u00e4ufen, dann stimmt irgendetwas noch nicht.<\/p><p>Ein reales Publikum ist daf\u00fcr nat\u00fcrlich am besten. Jeder CCD sollte also m\u00f6glichst regelm\u00e4\u00dfig Gelegenheiten suchen, um sein Wissen m\u00fcndlich weiterzugeben (z.B. bei Veranstaltungen im Kollegenkreis oder User Group Treffen). Unmittelbares Feedback ist ihm dabei gewiss. Alternativ bzw. in Erg\u00e4nzung taugen aber auch schriftliche Kompetenz\u00e4u\u00dferungen. Ein Blog ist in 5 Minuten aufgesetzt und Fachzeitschriften suchen st\u00e4ndig nach neuen Autoren. Feedback kommt hier zwar nicht so direkt zur\u00fcck, dennoch ist die textuelle Ausformulierung von Kenntnissen eine sehr gute \u00dcbung.<\/p><p>Clean Code Developer ab dem gr\u00fcnen Grad lernen daher nicht nur &#8222;passiv&#8220; durch Informationsaufnahme, sondern &#8222;aktiv&#8220; durch Weitergabe ihres Wissens mittels Pr\u00e4sentationen oder Texten. Das mag ungewohnt sein &#8211; ungewohnt ist aber auch wom\u00f6glich Continuous Integration. In jedem Fall ist aktive Wissensvermittlung eine gute \u00dcbung zur Vertiefung der eigenen Kompetenzen frei nach dem Motto: &#8222;Tue Gutes und sprich dar\u00fcber&#8220; ;-)<\/p><p>Dass das &#8222;Lehren&#8220; auch noch einen Nutzen f\u00fcr die Zuh\u00f6rer\/Leser hat, ist selbstverst\u00e4ndlich. Vorteile f\u00fcr andere sind aber nicht so motivierend wie eigene Vorteile. Deshalb betonen wir hier vor allem den Nutzen der Wissensvermittlung f\u00fcr den Clean Code Developer.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fafc118 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"fafc118\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-75a29c6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"75a29c6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-e1810b3\" data-id=\"e1810b3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-56b8864 elementor-widget elementor-widget-image\" data-id=\"56b8864\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/clean-code-developer.de\/wp-content\/uploads\/elementor\/thumbs\/icon_15_error-meassurement-qvqeuwoqoomgryj6bjm2aro03hhtm1tnum4ltqk4n4.png\" title=\"Error Measurement\" alt=\"Error Measurement\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-3c8ede1\" data-id=\"3c8ede1\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5a3ffa4 elementor-widget elementor-widget-heading\" data-id=\"5a3ffa4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Error Measurement<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-cd75189 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"cd75189\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-31875671\" data-id=\"31875671\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-48651c10 elementor-widget elementor-widget-text-editor\" data-id=\"48651c10\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"box\"><strong>Warum?<\/strong><br \/>Nur wer wei\u00df, wie viele Fehler auftreten, kann sein Vorgehen so ver\u00e4ndern, dass die Fehlerrate sinkt.<\/div><div class=\"core-points\"><table><tbody><tr><th>Wandelbarkeit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Korrektheit<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Produktionseffizienz<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Kontinuierliche Verbesserung<\/th><td><i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star\"><\/i>\u00a0<i class=\"fa fa-star-o\"><\/i><\/td><\/tr><tr><th>Team<\/th><\/tr><\/tbody><\/table><\/div><p>W\u00e4hrend der Softwareentwicklung passieren Fehler. Die passieren in allen Phasen: falsch verstandene oder unklar formulierte Anforderungen f\u00fchren zu Fehlern genauso wie fehlerhafte Implementierungen. Am Ende ist alles ein Fehler, was dazu f\u00fchrt, dass der Kunde eine Software erh\u00e4lt, die nicht seinen Anforderungen entspricht. Iteratives Vorgehen und Reflexion sind zwei Bausteine, die dazu dienen, den Prozess zu verbessern. Um jedoch zu erkennen, ob tats\u00e4chlich eine Verbesserung eintritt, muss eine Messgr\u00f6\u00dfe vorliegen, an der man eine Entwicklung zum Besseren \u00fcberhaupt ablesen kann.<\/p><p>Das Messen der Fehler kann durch Z\u00e4hlen oder durch Zeitnahme erfolgen. Dabei steht nicht die Pr\u00e4zision im Vordergrund, solange die Messmethode vergleichbare Daten liefert. Die Entwicklungstendenz \u00fcber mehrere Iterationen hinweg soll ersichtlich werden. Ferner geht es nicht darum, die Verantwortlichkeit f\u00fcr einen Fehler zu kl\u00e4ren. Am Ende ist es egal, wer den Fehler verursacht hat, so lange das Team daraus lernt und seinen Prozess verbessert.<\/p><p>Welche Fehler sind zu messen? Es sind nicht die Fehler, die w\u00e4hrend der Entwicklung auftreten. Die sind nicht zu vermeiden und f\u00fchren hoffentlich dahin, dass am Ende einer Iteration ein fehlerfreies Produkt ausgeliefert wird. Vielmehr geht es um die Fehler, die nach einer Iteration zur\u00fcckgemeldet werden vom Kunden bzw. seinem Stellvertreter (z.B. Productowner oder Support). Das sind Fehler, die die Umsetzung neuer Anforderungen behindern. Zu messende Fehler sind also die, die auftreten, wenn man glaubt, dass es sie nicht geben d\u00fcrfte ;-) Wann im Prozess ein Team diesen Punkt erreicht und flucht, weil da wieder so ein Fehler der sonstigen Arbeit dazwischenfunkt, ist teamindividuell zu bestimmen.<\/p><p>Weiter geht es beim <a title=\"Blauer Grad\" href=\"http:\/\/clean-code-developer.de\/die-grade\/blauer-grad\/\">blauen Grad<\/a>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Inhaltsverzeichnis Prinzipien Open Closed Principle (OCP) Warum?Weil das Risiko, durch neue Features ein bisher fehlerfreies System zu instabilisieren, so gering wie m\u00f6glich gehalten werden sollte. Wandelbarkeit \u00a0\u00a0 Korrektheit \u00a0\u00a0 Produktionseffizienz \u00a0\u00a0 Kontinuierliche Verbesserung \u00a0\u00a0 Single Developer Das Open Closed Principle (OCP) besagt, dass eine Klasse offen f\u00fcr Erweiterungen sein muss, jedoch geschlossen gegen\u00fcber Modifikationen. Es [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":17,"menu_order":5,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-85","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/pages\/85","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":5,"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/pages\/85\/revisions"}],"predecessor-version":[{"id":994,"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/pages\/85\/revisions\/994"}],"up":[{"embeddable":true,"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/pages\/17"}],"wp:attachment":[{"href":"https:\/\/clean-code-developer.de\/es\/wp-json\/wp\/v2\/media?parent=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}