{"id":35597,"date":"2022-05-05T10:00:51","date_gmt":"2022-05-05T09:00:51","guid":{"rendered":"https:\/\/www.inovex.de\/?p=35597"},"modified":"2024-04-29T08:23:06","modified_gmt":"2024-04-29T06:23:06","slug":"nachhaltige-software-clean-code-methoden","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/","title":{"rendered":"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung"},"content":{"rendered":"<p>Der weit verbreitete Einsatz von Software kann nicht nur das allt\u00e4gliche Leben der Menschen, sondern auch deren Umwelt beeinflussen. In Anbetracht der Klimakrise ist es umso wichtiger, \u00f6kologisch nachhaltige Software zu entwickeln. Doch gleichzeitig soll die Entwicklung und der Einsatz eines Softwareprodukts oft auch positive wirtschaftliche Effekte haben.\u00a0 Dieser Blogartikel behandelt die Frage, inwiefern Clean Code die Nachhaltigkeit der effizienten Softwareentwicklung beeinflusst und welche Folgen dabei entstehen. <!--more-->Um dies zu beantworten, werden sowohl die Kriterien zum Definieren und Entwickeln nachhaltiger Software herausgestellt als auch die \u00f6kologischen und \u00f6konomischen Auswirkungen hinsichtlich der Ziele von Clean Code untersucht. Hierf\u00fcr wurden entsprechende Messungen zu konkreten Implementierungen durchgef\u00fchrt, ausgewertet und Handlungsempfehlungen vorgestellt. Dabei wurden Untersuchungen zu folgenden Szenarien gemacht: \u00a0Ein Decorator Design Pattern vs.\u00a0 Decorator Anti Design Pattern, das Anwenden und nicht Anwenden von Caching, Inlining vs. Anti-Inlining, Rekursion vs. Iteration sowie Loop vs. Loop Unrolling.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Nachhaltige-Software\" >Nachhaltige Software<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Clean-Code\" >Clean Code<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Effiziente-Programmierung\" >Effiziente Programmierung<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Decorator-Design-Pattern-vs-Decorator-Anti-Design-Pattern\" >Decorator Design Pattern vs. Decorator Anti Design Pattern<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Caching\" >Caching<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Iteration-vs-Rekursion\" >Iteration vs. Rekursion<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Inlining-vs-Anti-Inlining\" >Inlining vs. Anti-Inlining<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Loop-vs-Loop-Unrolling\" >Loop vs. Loop Unrolling<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Fazit\" >Fazit<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Repository-zum-Projekt\" >Repository zum Projekt<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#Literaturverzeichnis\" >Literaturverzeichnis<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Nachhaltige-Software\"><\/span><strong>Nachhaltige Software<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><strong>\u00d6kologisch Nachhaltige Software<\/strong> hat geringe Hardwareanforderungen und kann langfristig eingesetzt werden. Dabei sollte der Energieverbrauch von CPU-Zeit, Arbeitsspeicher, Festplatten- sowie Netzwerkzugriffen m\u00f6glichst gering gehalten werden, ohne dabei die Funktion einer Software negativ zu beeinflussen (vgl. Umweltbundesamt (2015): 31). So hat die Ausf\u00fchrung einer Software auf unterschiedlicher Hardware verschiedene Effekte.\u00a0 Es gibt bereits einige Ans\u00e4tze und Richtlinien zum Entwickeln nachhaltiger Software. So bietet der \u201eBlaue Engel\u201c Vergabekriterien f\u00fcr ressourcen- und energieeffiziente Softwareprodukte (DE-UZ 215). \u00a0Eine als solche ausgezeichnete Software gilt als besonders transparent, frei im Umgang durch deren Anwender:innen und energiesparend bei der Nutzung von Hardware-Ressourcen. Die Vergabekriterien werden in die Bereiche Ressourcen- und Energieeffizienz, potenzielle Hardware-Nutzungsdauer sowie Nutzungsautonomie aufgeteilt (siehe <a href=\"https:\/\/www.blauer-engel.de\/de\/produktwelt\/ressourcen-und-energieeffiziente-softwareprodukte\" target=\"_blank\" rel=\"noopener\">https:\/\/www.blauer-engel.de\/de\/produktwelt\/ressourcen-und-energieeffiziente-softwareprodukte<\/a>). Zudem bietet das Umweltbundesamt weitere Orientierung (siehe <a href=\"https:\/\/www.umweltbundesamt.de\/themen\/wie-software-gruener-werden-kann-ergebnisse-eines\" target=\"_blank\" rel=\"noopener\">https:\/\/www.umweltbundesamt.de\/themen\/wie-software-gruener-werden-kann-ergebnisse-eines<\/a>).<\/p>\n<p>Von<strong> \u00f6konomisch nachhaltiger Software <\/strong>ist die Rede<strong>, <\/strong>wenn die investierten Mittel in deren Entwicklung durch den Einsatz oder den Verkauf der Software die Maximierung oder den Erhalt des daraus entstehenden Ertrags gew\u00e4hrleistet.<\/p>\n<p><strong>Sozial nachhaltige Software<\/strong> kann z. B. durch freie Software erreicht werden, wenn dadurch der Zugang zu Wissen, Kultur oder Kunst von allen sozialen Gruppen gew\u00e4hrleistet wird. Dies f\u00f6rdert die Chancengleichheit. Je mehr soziale Aufgaben bzw. Probleme sie erf\u00fcllt, desto nachhaltiger ist sie in diesem Bereich.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Clean-Code\"><\/span><strong>Clean Code <\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Clean Code erleichtert das \u00c4ndern, Lesen, Erweitern und Warten von Softwarecode. Ein weiteres Ergebnis ist eine stabilere und effizienter wartbare Software, die weniger investierte Entwicklungszeit bei Funktionserweiterungen und Fehlerbehebungen ben\u00f6tigt. Dies ist besonders deshalb relevant, da im Durchschnitt mindestens 80 Prozent der Entwicklungszeit auf Wartungen zur\u00fcckzuf\u00fchren sind. (Vgl. Robert C. Martin (2009): 16). Zudem unterst\u00fctzt Clean Code die sichere und weniger fehleranf\u00e4llige Entwicklung von Software, da die Entwicklung \u00fcbersichtlicher, weniger komplex und weniger missverst\u00e4ndlich wird (vgl. Uwe Post (2021): 14 f.). Es f\u00f6rdert die \u00f6konomische Nachhaltigkeit durch Einsparung von Entwicklungszeit und Kosten und verhindert kostenintensive Katastrophen, die sonst die Folge sein k\u00f6nnen. Dabei muss beachtet werden, dass das Schreiben von sauberem Code ein Prozess ist. Je fr\u00fcher damit begonnen wird, desto weniger zeit- und kostenaufw\u00e4ndig werden Anpassungen im sp\u00e4teren Verlauf, auch wenn initial besonders bei komplexen Programmen der Zeitaufwand oft h\u00f6her ist. (Vgl. Robert C. Martin (2009):110). Zus\u00e4tzlich sorgt das Einsparen der Entwicklungszeit auch daf\u00fcr, dass weniger Energie durch die Entwickler:innen selbst verbraucht wird, um das jeweilige Softwareprodukt fertigzustellen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Effiziente-Programmierung\"><\/span><strong>Effiziente Programmierung<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Die Laufzeit eines Algorithmus h\u00e4ngt sowohl von den Eingabewerten und der jeweiligen Programmiersprache als auch von der Hardware ab, auf der er ausgef\u00fchrt wird. Die Anzahl der Ausf\u00fchrungen sowie die Art und Weise der Implementierung von einem Algorithmus ist dementsprechend ebenso relevant. Deshalb m\u00fcssen Messungen hierzu als Einzelfall-Untersuchungen betrachtet werden, die in Bezug auf einen konkreten Rechner bzw. der dementsprechenden Hardware sowie der jeweiligen Programmiersprache, Implementierung und Eingabewerte unterschiedliche Ergebnisse liefert. (Vgl. Wegener (2003): 20 f.). Die Formel f\u00fcr den Energieverbrauch ist Energy (J) = Power (W) x Time(s). Dies bedeutet, dass die Laufzeit den Energieverbrauch zwar beeinflusst, aber die daf\u00fcr ben\u00f6tigte Leistung eines Computers nicht immer als Konstante betrachtet werden darf. Hierf\u00fcr m\u00fcssten weitere Untersuchungen erfolgen. (Vgl. Rui Alexandre Afonso Pereira et al. (2020) :11). F\u00fcr die Effizienzbewertung von Algorithmen existieren auch von Implementierungs-, Hardware- und Eingabedaten unabh\u00e4ngige Kriterien (vgl. Wegener (2003): 21 f.). So kann neben dem Speicherplatzbedarf die ben\u00f6tigte Wachstumsgeschwindigkeit eines Algorithmus auch unabh\u00e4ngig von Zeiteinheiten mit der Anzahl durchgef\u00fchrter Rechenschritte bzw. mit der Landau-Notation angegeben werden (vgl. Wegener (2003): 21, 295).<\/p>\n<p>Im Folgenden werden einige praktische Beispiele f\u00fcr Code-Optimierungen und das Anwenden von Clean Code genannt. Diese werden durch die jeweiligen Messungen der Laufzeit auf die Auswirkungen \u00f6kologischer als auch \u00f6konomischer Nachhaltigkeit untersucht. Hierbei muss beachtet werden, dass sich die Messungen auf ein konkretes Szenario mit einer individuellen Hardware und der Programmiersprache Java beziehen. Au\u00dferdem wird davon ausgegangen, dass die unabh\u00e4ngig von der Laufzeit verbrauchte Leistung f\u00fcr die unterschiedlichen implementierten Algorithmen konstant bleibt. Dies ist dadurch begr\u00fcndet, dass es sich um Algorithmen handelt, bei denen der Prozessor f\u00fcr die jeweilige Zeit der Ausf\u00fchrung vollst\u00e4ndig ausgelastet werden kann und keine Netzwerkzugriffe stattfinden. Somit k\u00f6nnen alleine durch die Vergleiche der Laufzeitmessung R\u00fcckschl\u00fcsse auf den jeweiligen Energieverbrauch gezogen werden.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Decorator-Design-Pattern-vs-Decorator-Anti-Design-Pattern\"><\/span><strong>Decorator Design Pattern vs. Decorator Anti Design Pattern<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Beispielhaft wurde ein Decorator Design Pattern im Sinne der Clean Code SOLID Prinzipien und dessen Anti Design Pattern implementiert. Dabei kann die Dekoration von konkreten Komponenten bei Anti Decorator Design Pattern mittels innerer Klassen oder als Unterklasse erfolgen.<\/p>\n<p>Damit Laufzeitunterschiede deutlich zu erkennen sind wurde die Dekoration einer konkreten Komponente jeweils 10 Millionen-mal durch eine For-Schleife aufgerufen. Dies wurde 10 Mal hintereinander ausgef\u00fchrt und die Laufzeit bei jedem Durchgang gemessen. Denn die Messergebnisse sind nicht gleichbleibend und h\u00e4ngen u.a. stark von anderen Aktivit\u00e4ten ab, die derselbe Computer durchl\u00e4uft. Die Ergebnisse in den dargestellten Grafiken zeigen, dass das Design Pattern bei jeder Ausf\u00fchrung deutlich mehr Laufzeit ben\u00f6tigt als die beiden Anti Design Pattern:<\/p>\n<figure id=\"attachment_36361\" aria-describedby=\"caption-attachment-36361\" style=\"width: 701px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-36361\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern-1.png\" alt=\"S\u00e4ulendiagramm f\u00fcr den Aufruf der Design Pattern und Anti Design Pattern\" width=\"701\" height=\"419\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern-1.png 1657w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern-1-300x179.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern-1-1024x612.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern-1-768x459.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern-1-1536x919.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern-1-400x239.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern-1-360x215.png 360w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><figcaption id=\"caption-attachment-36361\" class=\"wp-caption-text\">Abbildung 1: Auswertung der Laufzeitmessungen f\u00fcr den Aufruf der Design Pattern und Anti Design Pattern (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<figure id=\"attachment_36365\" aria-describedby=\"caption-attachment-36365\" style=\"width: 701px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-36365\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern-1.png\" alt=\"S\u00e4ulendiagramm Zusammenfassende Auswertung der Laufzeitmessungen f\u00fcr den Aufruf der Design Pattern und Anti Design Pattern\" width=\"701\" height=\"449\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern-1.png 1578w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern-1-300x192.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern-1-1024x655.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern-1-768x492.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern-1-1536x983.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern-1-400x256.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern-1-360x230.png 360w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><figcaption id=\"caption-attachment-36365\" class=\"wp-caption-text\">Abbildung 2: Zusammenfassende Auswertung der Laufzeitmessungen f\u00fcr den Aufruf der Design Pattern und Anti Design Pattern (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<p>&nbsp;<\/p>\n<p>Zus\u00e4tzlich wurden weitere Messungen mit konkreten Komponenten durchgef\u00fchrt, die eine zus\u00e4tzliche aufw\u00e4ndigere Berechnung haben. Diese f\u00fchrten die Fibonacci-Berechnung mit einem Eingabewert 10 aus:<\/p>\n<figure id=\"attachment_35615\" aria-describedby=\"caption-attachment-35615\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-35615 \" style=\"font-size: 18px; color: #505d6d;\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation.png\" alt=\"\" width=\"700\" height=\"406\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation.png 2074w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation-300x174.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation-1024x594.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation-768x445.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation-1536x891.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation-2048x1188.png 2048w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation-1920x1114.png 1920w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation-400x232.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Patter_AntiPattern_WithCalculation-360x209.png 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-35615\" class=\"wp-caption-text\">Abbildung 3: Auswertung der Laufzeitmessungen f\u00fcr den Aufruf der Design Pattern und Anti Design Pattern mit zus\u00e4tzlicher Berechnung (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<figure id=\"attachment_36363\" aria-describedby=\"caption-attachment-36363\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-36363\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern_mit_zusaetzlicher_Berechnung-1.png\" alt=\"S\u00e4ulendiagramm Zusammenfassende Auswertung der Laufzeitmessungen\" width=\"700\" height=\"461\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern_mit_zusaetzlicher_Berechnung-1.png 1918w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern_mit_zusaetzlicher_Berechnung-1-300x198.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern_mit_zusaetzlicher_Berechnung-1-1024x674.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern_mit_zusaetzlicher_Berechnung-1-768x506.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern_mit_zusaetzlicher_Berechnung-1-1536x1011.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern_mit_zusaetzlicher_Berechnung-1-400x263.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Patter_AntiPattern_mit_zusaetzlicher_Berechnung-1-360x237.png 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-36363\" class=\"wp-caption-text\">Abbildung 4: Zusammenfassende Auswertung der Laufzeitmessungen f\u00fcr den Aufruf der Design Pattern und Anti Design Pattern mit zus\u00e4tzlicher Berechnung (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<p>Der relative Laufzeitunterschied vom Experiment (Dekorierer-Pattern) zum Gegenexperiment (Anti Pattern) ist geringer, wenn eine zus\u00e4tzliche Berechnung im \u201einneren des Pattern\u201c durchgef\u00fchrt wird.\u00a0In absoluten Werten braucht das Dekorierer-Pattern jedoch trotzdem l\u00e4nger. Dieses sollte also dann vorgezogen werden, wenn viele dekorierte konkrete Komponenten mit komplexen Berechnungen erforderlich sind. Dadurch ist der Energieverbrauch nicht so viel h\u00f6her, aber es bietet den Vorteil hinzukommende Entwicklungszeiten und Kosten zu vermeiden. \u00a0Ein Anti Design Pattern ist dagegen dann vorzuziehen, wenn nur sehr wenige konkrete Komponenten dekoriert werden m\u00fcssen. Dadurch kann im Verh\u00e4ltnis bei geringen hinzukommenden Entwicklungszeiten und Kosten sehr viel Energie eingespart werden.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Caching\"><\/span><strong>Caching <\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Bei dem Einsatz von Caching handelt es sich um das Zwischenspeichern mit hohen Zugriffsgeschwindigkeiten (Vgl. Amazon Web Services (2022)). Dies kann mehr Speicherplatzbedarf erfordern, f\u00fchrt aber oft zu Energieeinsparungen bei CPU-Berechnungen oder Festplatten und Netzwerkaktivit\u00e4ten. Hierzu wurde die Fibonacci-Funktion mit und ohne den Einsatz von Caching implementiert.\u00a0 F\u00fcr den Eingabewert 47 der beiden Funktionen ergab sich folgender Laufzeitvergleich:<\/p>\n<figure id=\"attachment_36382\" aria-describedby=\"caption-attachment-36382\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-36382 \" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Fibunacci_ohne_Iteration.jpg\" alt=\"S\u00e4ulendiagramm: Vergleich des Laufzeitverhalten eines rekursiven Aufrufs der Fibonacci-Reihe\" width=\"700\" height=\"407\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Fibunacci_ohne_Iteration.jpg 1653w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Fibunacci_ohne_Iteration-300x174.jpg 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Fibunacci_ohne_Iteration-1024x595.jpg 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Fibunacci_ohne_Iteration-768x446.jpg 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Fibunacci_ohne_Iteration-1536x893.jpg 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Fibunacci_ohne_Iteration-400x233.jpg 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Fibunacci_ohne_Iteration-360x209.jpg 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-36382\" class=\"wp-caption-text\">Abbildung 5: Vergleich des Laufzeitverhalten eines rekursiven Aufrufs der Fibonacci-Reihe mit dem Eingabewert 47 mit und ohne dem Einsatz von Caching (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<p>In diesem Fall ist Caching zu empfehlen, da dadurch das exponentielle Wachstumsverhalten in der Zeitkomplexit\u00e4t durch ein lineares ersetzt wird. Das sorgt sehr schnell f\u00fcr erhebliche Laufzeit bzw. Energieeinsparungen, w\u00e4hrend der daf\u00fcr ben\u00f6tigte zus\u00e4tzliche Implementierungsaufwand gering bleibt.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Iteration-vs-Rekursion\"><\/span><strong>Iteration vs. Rekursion<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Als weitere Optimierungsmethode wurde eine iterative mit einer rekursiven Fakult\u00e4tsfunktion verglichen. Damit Laufzeitunterschiede deutlich zu erkennen sind, erfolgte der Funktionsaufruf mit dem Eingabewert 10 und wurde insgesamt 10 Millionen Mal aufgerufen. Anschlie\u00dfend kam es zu 10 hintereinander folgenden Durchf\u00fchrungen.<\/p>\n<figure id=\"attachment_35617\" aria-describedby=\"caption-attachment-35617\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-35617\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Rekursion_Iteration.png\" alt=\"S\u00e4ulendiagramm: Vergleich der Laufzeiten f\u00fcr einen iterativen und rekursiven Funktionsaufruf\" width=\"700\" height=\"421\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Rekursion_Iteration.png 1653w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Rekursion_Iteration-300x180.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Rekursion_Iteration-1024x615.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Rekursion_Iteration-768x461.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Rekursion_Iteration-1536x923.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Rekursion_Iteration-400x240.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Laufzeitvergleich_Rekursion_Iteration-360x216.png 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-35617\" class=\"wp-caption-text\">Abbildung 6: Vergleich der Laufzeiten f\u00fcr einen iterativen und rekursiven Funktionsaufruf (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<figure id=\"attachment_35631\" aria-describedby=\"caption-attachment-35631\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-35631\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Rekursion_Iteration.png\" alt=\"S\u00e4ulendiagramm: Zusammenfassender Vergleich der Laufzeiten f\u00fcr einen iterativen und rekursiven Funktionsaufruf\" width=\"700\" height=\"421\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Rekursion_Iteration.png 1653w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Rekursion_Iteration-300x180.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Rekursion_Iteration-1024x615.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Rekursion_Iteration-768x461.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Rekursion_Iteration-1536x923.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Rekursion_Iteration-400x240.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Rekursion_Iteration-360x216.png 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-35631\" class=\"wp-caption-text\">Abbildung 7: Zusammenfassender Vergleich der Laufzeiten f\u00fcr einen iterativen und rekursiven Funktionsaufruf (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<p>Die Ergebnisse zeigen, dass die Rekursion deutlich mehr Laufzeit ben\u00f6tigt, und weisen darauf hin, dass die Java Virtual Machine (JVM) zur Laufzeit automatisch Optimierungen vornimmt. Die f\u00fcr einen Menschen lesbarere und verst\u00e4ndlichere Rekursion sollte der manuellen iterativen Variante dann vorgezogen werden, wenn automatische Compiler- oder Laufzeitoptimierungen den Unterschied des Energieverbrauchs dieser beiden Varianten ausgleichen. Die manuelle Iteration ist dagegen dann empfehlen, wenn keine oder kaum Compiler- oder Laufzeitoptimierungen stattfinden und es sich um Hotspots handelt \u2013also dort, wo viel Energie verschwendet wird, die Zeitkomplexit\u00e4t sehr hoch ist und diese Algorithmen sehr oft ausgef\u00fchrt werden.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Inlining-vs-Anti-Inlining\"><\/span><strong>Inlining vs. Anti-Inlining<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Bei Inlining-Optimierungen wird der Code-Inhalt einer Funktion an Stelle der Aufrufe dieser Funktion ersetzt. Dies wurde durch eine einfache Funktion umgesetzt, die zwei verschiedene Zahlen zum Quadrat berechnet und diese dann addiert. Die dazugeh\u00f6rige Anti-Inline-Methode ruft dabei jeweils eine Quadrat-Funktion auf, die diesen Teil der Berechnung \u00fcbernimmt. Die Messungen fanden nach demselben Verfahren wie bei Rekursion vs. Iteration statt. Hierbei ist kein eindeutiger Laufzeitunterschied zwischen dem Aufruf der Inline- mit der Anti-Inline-Funktion zu erkennen:<\/p>\n<figure id=\"attachment_35619\" aria-describedby=\"caption-attachment-35619\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-35619 \" style=\"font-size: 18px; color: #505d6d;\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Measure_AntiInlining.png\" alt=\"S\u00e4ulendiagramm: Vergleich der Laufzeit f\u00fcr die Anwendung von Inlining und Anti-Inlining\" width=\"700\" height=\"421\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Measure_AntiInlining.png 1653w, https:\/\/www.inovex.de\/wp-content\/uploads\/Measure_AntiInlining-300x180.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Measure_AntiInlining-1024x615.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Measure_AntiInlining-768x461.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Measure_AntiInlining-1536x923.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Measure_AntiInlining-400x240.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Measure_AntiInlining-360x216.png 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-35619\" class=\"wp-caption-text\">Abbildung 8: Vergleich der Laufzeit f\u00fcr die Anwendung von Inlining und Anti-Inlining (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<figure id=\"attachment_35623\" aria-describedby=\"caption-attachment-35623\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-35623 \" style=\"color: #505d6d; font-size: 18px; font-weight: 400;\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Inlining_Antiinlining.png\" alt=\"S\u00e4ulendiagramm: Zusammenfassender Vergleich der Laufzeit f\u00fcr die Anwendung von Inlining und Anti-Inlining\" width=\"700\" height=\"421\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Inlining_Antiinlining.png 1653w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Inlining_Antiinlining-300x180.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Inlining_Antiinlining-1024x615.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Inlining_Antiinlining-768x461.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Inlining_Antiinlining-1536x923.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Inlining_Antiinlining-400x240.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Inlining_Antiinlining-360x216.png 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-35623\" class=\"wp-caption-text\">Abbildung 9: Zusammenfassender Vergleich der Laufzeit f\u00fcr die Anwendung von Inlining und Anti-Inlining (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<p>Zus\u00e4tzlich wurde der Bytecode der Anti-Inlining-Methode untersucht, da Inline-Ersetzungen durch moderne Compiler auch automatisch stattfinden k\u00f6nnen. Im Bytecode ist f\u00fcr die Anti-Inline-Methode keine automatische Inline-Ersetzung zu sehen, da die Quadrat-Funktion aufgerufen wird. Deshalb handelt es sich dabei wahrscheinlich um eine Optimierung durch die JVM.<\/p>\n<p>In diesem Fall oder bei automatischen Compiler-Optimierungen sollte auf manuelles Inlining verzichtet werden. Dadurch kann die eigentliche Funktionalit\u00e4t von dem jeweiligen Code bei gleichbleibendem Energieverbrauch manuell und lesbarer bzw. verst\u00e4ndlicher zusammengefasst werden. F\u00fcr die Bedingung, dass sicher keine automatischen Laufzeit- oder Compiler-Optimierungen stattfinden, m\u00fcssten weitere Messungen durchgef\u00fchrt werden, um die Laufzeit vergleichen zu k\u00f6nnen.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Loop-vs-Loop-Unrolling\"><\/span><strong>Loop vs. Loop Unrolling<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Bei der Loop-Unrolling-Optimierung wird der Aufruf einer Schleife durch mehrere Kopien von dessen Inhalt ersetzt. Die Schleifenbedingung muss somit nicht wiederholt gepr\u00fcft werden. Auch dies kann durch einige moderne Compiler automatisch angewandt werden.<\/p>\n<p>Die Laufzeitmessungen fanden nach demselben Verfahren wie bei den Untersuchungen von Rekursion, Iteration sowie Inlining und Anti-Inlining statt. Die Ergebnisse zeigen, dass Loop Unrolling wesentlich schneller ist:<\/p>\n<figure id=\"attachment_35621\" aria-describedby=\"caption-attachment-35621\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-35621 \" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/MeasureRuntimeLoopUnrolling.png\" alt=\"S\u00e4ulendiagramm: Laufzeitmessungen f\u00fcr die Aufrufe der Loop- und Loop-Unrolling-Methode\" width=\"700\" height=\"421\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/MeasureRuntimeLoopUnrolling.png 1653w, https:\/\/www.inovex.de\/wp-content\/uploads\/MeasureRuntimeLoopUnrolling-300x180.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/MeasureRuntimeLoopUnrolling-1024x615.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/MeasureRuntimeLoopUnrolling-768x461.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/MeasureRuntimeLoopUnrolling-1536x923.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/MeasureRuntimeLoopUnrolling-400x240.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/MeasureRuntimeLoopUnrolling-360x216.png 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-35621\" class=\"wp-caption-text\">Abbildung 10: Laufzeitmessungen f\u00fcr die Aufrufe der Loop- und Loop-Unrolling-Methode (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<figure id=\"attachment_35625\" aria-describedby=\"caption-attachment-35625\" style=\"width: 700px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-35625 \" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Loop_LoopUnrolling.png\" alt=\"S\u00e4ulendiagramm: Zusammenfassende Laufzeitmessungen f\u00fcr die Aufrufe der Loop- und Loop-Unrolling-Methode\" width=\"700\" height=\"421\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Loop_LoopUnrolling.png 1653w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Loop_LoopUnrolling-300x180.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Loop_LoopUnrolling-1024x615.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Loop_LoopUnrolling-768x461.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Loop_LoopUnrolling-1536x923.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Loop_LoopUnrolling-400x240.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/Zusammenfassender_Laufzeitvergleich_Loop_LoopUnrolling-360x216.png 360w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-35625\" class=\"wp-caption-text\">Abbildung 11: Zusammenfassende Laufzeitmessungen f\u00fcr die Aufrufe der Loop- und Loop-Unrolling-Methode (Quelle: Eigene Darstellung)<\/figcaption><\/figure>\n<p>Auch hier deuten sich Laufzeitoptimierungen der JVM an. In diesem Fall sind die Ergebnisse des Loop Unrolling \u00f6kologisch effizienter. Ein manuelles Loop Unrolling bedeutet allerdings jede einzelne Zeile Code manuell schreiben und ggf. sp\u00e4ter refaktorieren zu m\u00fcssen. Dabei kann eine hohe Anzahl an Schleifendurchl\u00e4ufe erhebliche Auswirkungen auf die langfristigen Entwicklungs- und Wartungszeiten haben. In der gezeigten konkreten Implementierung handelt es sich jedoch um wenige Schleifendurchl\u00e4ufe. Au\u00dferdem kam kein automatisches Loop Unrolling durch den Compiler zustande. Laufzeitoptimierungen wurden sowohl f\u00fcr die Loop- als auch die Loop-Unrolling-Funktion vorgenommen. Unter diesen Umst\u00e4nden ist ein manuelles Loop Unrolling zu empfehlen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Fazit\"><\/span><strong>F<\/strong><strong>azit<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Clean Code wirkt sich vor allem bei komplexen Softwareprojekten positiv auf die \u00f6konomische Nachhaltigkeit aus. Ob es sich dabei auch um \u00f6kologische Nachhaltigkeit handelt, muss f\u00fcr jeden individuellen Fall und in dem jeweiligen Kontext einzeln betrachtet werden. \u00a0Wenn unterschiedliche Algorithmen auf ihre \u00f6kologische Nachhaltigkeit hin untersucht werden und dementsprechende Messungen ausgef\u00fchrt werden sollen, empfiehlt es sich, dessen reale Komplexit\u00e4t z. B. mit dem Einsatz von Schleifen zu simulieren, falls der Anwendungsfall dies erlaubt. Dadurch kann die f\u00fcr die Messung ben\u00f6tigte Entwicklungszeit eingespart werden. Gleichzeitig k\u00f6nnen R\u00fcckschl\u00fcsse gezogen werden, ob das Anwenden von Clean Code oder \u00f6kologisch effizienteren Code zu einer insgesamt h\u00f6heren Nachhaltigkeit f\u00fchrt. Dabei sollte man auch \u00fcberpr\u00fcfen, ob automatische Optimierungen vorgenommen werden, um eine sinnvolle Entscheidung zu treffen \u2013 besonders bei Hotspots sollte optimiert werden. Diese sind z. B. identifizierbar mit Profiler Tools.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Repository-zum-Projekt\"><\/span><strong>Repository zum Projekt<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>F\u00fcr die beispielhaften Implementierungen zu den Methoden der effizienten Programmierung wurde ein Repository bereitgestellt:<a href=\"https:\/\/github.com\/Marjuw\/Methods-of-efficient-programming\" target=\"_blank\" rel=\"noopener\"> https:\/\/github.com\/Marjuw\/Methods-of-efficient-programming<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Literaturverzeichnis\"><\/span><strong>Literaturverzeichnis<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>[Amazon Web Services 2022] Amazon Web Services: Caching \u2013 \u00dcbersicht. <a href=\"https:\/\/aws.amazon.com\/de\/caching\/\" target=\"_blank\" rel=\"noopener\">https: \/\/aws.amazon.com\/de\/caching\/<\/a> Version: 2022. \u2013 Last accessed 24 February 2022<\/p>\n<p>[Holzbaur 2020] Holzbaur, Ulrich: Nachhaltige Entwicklung-Der Weg in eine lebenswerte Zukunft. Springer, 2020 <a href=\"https:\/\/link.springer.com\/book\/10.1007\/978-3-658-29991-0\" target=\"_blank\" rel=\"noopener\">https:\/\/link.springer.com\/book\/10.1007\/978-3-658-29991-0<\/a>. \u2013 Last accessed 06 January 2022<\/p>\n<p>[Blauer Engel 2020] Blauer Engel: Ressourcen- und energieeffiziente Softwareprodukte (DE-UZ 215). <a href=\"https:\/\/www.blauer-engel.de\/de\/produktwelt\/ressourcen-und-energieeffiziente-softwareprodukte\" target=\"_blank\" rel=\"noopener\">https:\/\/www.blauer-engel.de\/de\/produktwelt\/ressourcen-undenergieeffiziente-softwareprodukte<\/a>. Version: January 2020. \u2013 Last accessed 13 January 2022<\/p>\n<p>[Robert C. Martin 2009] Robert C. Martin: Clean Code &#8211; Refactoring, Patterns, Testen und Techniken f\u00fcr sauberen Code. 1. Edition. mitp, 2009. \u2013 ISBN 978-3-8266-5548-7<\/p>\n<p>[Rui Alexandre Afonso Pereira et al. 2020] Rui Alexandre Afonso Pereira and Marco Couto and Francisco Jos\u00e9 Torres Ribeiro and Rui Ant\u00f3nio Ramada Rua and J\u00e1come Cunha and Jo\u00e3o Paulo Sousa Ferreira Fernandes and Jo\u00e3o Saraiva: Ranking Programming Languages by Energy Efficiency. http:\/\/repositorium.sdum.uminho.pt\/handle\/1822\/69044. Version: Dezember 2020. \u2013 Last accessed 28 February 2022<\/p>\n<p>[Umweltbundesamt 2015] Umweltbundesamt: Nachhaltige Software-Dokumentation des Fachgespr\u00e4chs \u201eNachhaltige Software\u201c am 28.11.2014. <a href=\"https:\/\/www.umweltbundesamt.de\/themen\/wie-software-gruener-werden-kann-ergebnisse-eines\" target=\"_blank\" rel=\"noopener\">https:\/\/www.umweltbundesamt.de\/themen\/wie-software-gruener-werden-kann-ergebnisse-eines<\/a>. Version: July 2015. \u2013 Last accessed 06 January 2022<\/p>\n<p>[Uwe Post 2021] Uwe Post: Besser Coden &#8211; Best Practices f\u00fcr Clean Code. 2. Edition. Reihnwerk Computing, 2021. \u2013 ISBN 978-3-8362-8492-9<\/p>\n<p>[Wegener 2003] Wegener, Prof. Dr. I.: Komplexit\u00e4tstheorie: Grenzen der Effizienz von Algorithmen. 1. Edition. Springer-Verlag Berlin Heidelberg, 2003. \u2013 ISBN 9783642555480<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der weit verbreitete Einsatz von Software kann nicht nur das allt\u00e4gliche Leben der Menschen, sondern auch deren Umwelt beeinflussen. In Anbetracht der Klimakrise ist es umso wichtiger, \u00f6kologisch nachhaltige Software zu entwickeln. Doch gleichzeitig soll die Entwicklung und der Einsatz eines Softwareprodukts oft auch positive wirtschaftliche Effekte haben.\u00a0 Dieser Blogartikel behandelt die Frage, inwiefern Clean [&hellip;]<\/p>\n","protected":false},"author":268,"featured_media":36376,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[510,377,723,828,54],"service":[420],"coauthors":[{"id":268,"display_name":"Marvin Juwig","user_nicename":"mjuwig"}],"class_list":["post-35597","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-apps-2","tag-development","tag-java","tag-optimization","tag-test","service-apps"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Dieser Blogartikel behandelt die Frage, inwiefern Clean Code die Nachhaltigkeit der effizienten Softwareentwicklung beeinflusst.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Dieser Blogartikel behandelt die Frage, inwiefern Clean Code die Nachhaltigkeit der effizienten Softwareentwicklung beeinflusst.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2022-05-05T09:00:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T06:23:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1920\" \/>\n\t<meta property=\"og:image:height\" content=\"1080\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Marvin Juwig\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig-1024x576.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Marvin Juwig\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"15\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Marvin Juwig\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/\"},\"author\":{\"name\":\"Marvin Juwig\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/39796512e3b2c58348890161ccb2f719\"},\"headline\":\"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung\",\"datePublished\":\"2022-05-05T09:00:51+00:00\",\"dateModified\":\"2024-04-29T06:23:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/\"},\"wordCount\":2352,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png\",\"keywords\":[\"Apps\",\"Development\",\"Java\",\"Optimization\",\"Test\"],\"articleSection\":[\"Applications\",\"General\",\"Methods\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/\",\"url\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/\",\"name\":\"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png\",\"datePublished\":\"2022-05-05T09:00:51+00:00\",\"dateModified\":\"2024-04-29T06:23:06+00:00\",\"description\":\"Dieser Blogartikel behandelt die Frage, inwiefern Clean Code die Nachhaltigkeit der effizienten Softwareentwicklung beeinflusst.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#primaryimage\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png\",\"width\":1920,\"height\":1080,\"caption\":\"Bl\u00e4tter wachsen aus einem Besen, der ein Programmfenster fegt\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.inovex.de\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.inovex.de\/de\/#website\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.inovex.de\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/inovexde\",\"https:\/\/x.com\/inovexgmbh\",\"https:\/\/www.instagram.com\/inovexlife\/\",\"https:\/\/www.linkedin.com\/company\/inovex\",\"https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/39796512e3b2c58348890161ccb2f719\",\"name\":\"Marvin Juwig\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/dc70a3b3d1ab9aaf118138207562fc42\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5915259c4ff1cfb6f8a506bf9a1b8dbae812a0bad3790c8dc1f349ef74811d2d?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5915259c4ff1cfb6f8a506bf9a1b8dbae812a0bad3790c8dc1f349ef74811d2d?s=96&d=retro&r=g\",\"caption\":\"Marvin Juwig\"},\"url\":\"https:\/\/www.inovex.de\/de\/blog\/author\/mjuwig\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung - inovex GmbH","description":"Dieser Blogartikel behandelt die Frage, inwiefern Clean Code die Nachhaltigkeit der effizienten Softwareentwicklung beeinflusst.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/","og_locale":"de_DE","og_type":"article","og_title":"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung - inovex GmbH","og_description":"Dieser Blogartikel behandelt die Frage, inwiefern Clean Code die Nachhaltigkeit der effizienten Softwareentwicklung beeinflusst.","og_url":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2022-05-05T09:00:51+00:00","article_modified_time":"2024-04-29T06:23:06+00:00","og_image":[{"width":1920,"height":1080,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png","type":"image\/png"}],"author":"Marvin Juwig","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig-1024x576.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Marvin Juwig","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten","Written by":"Marvin Juwig"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/"},"author":{"name":"Marvin Juwig","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/39796512e3b2c58348890161ccb2f719"},"headline":"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung","datePublished":"2022-05-05T09:00:51+00:00","dateModified":"2024-04-29T06:23:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/"},"wordCount":2352,"commentCount":4,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png","keywords":["Apps","Development","Java","Optimization","Test"],"articleSection":["Applications","General","Methods"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/","url":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/","name":"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png","datePublished":"2022-05-05T09:00:51+00:00","dateModified":"2024-04-29T06:23:06+00:00","description":"Dieser Blogartikel behandelt die Frage, inwiefern Clean Code die Nachhaltigkeit der effizienten Softwareentwicklung beeinflusst.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/clean-code-nachhaltig.png","width":1920,"height":1080,"caption":"Bl\u00e4tter wachsen aus einem Besen, der ein Programmfenster fegt"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/nachhaltige-software-clean-code-methoden\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Nachhaltige Software durch Clean Code: Methoden der effizienten Programmierung"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/39796512e3b2c58348890161ccb2f719","name":"Marvin Juwig","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/dc70a3b3d1ab9aaf118138207562fc42","url":"https:\/\/secure.gravatar.com\/avatar\/5915259c4ff1cfb6f8a506bf9a1b8dbae812a0bad3790c8dc1f349ef74811d2d?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5915259c4ff1cfb6f8a506bf9a1b8dbae812a0bad3790c8dc1f349ef74811d2d?s=96&d=retro&r=g","caption":"Marvin Juwig"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/mjuwig\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/35597","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/268"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=35597"}],"version-history":[{"count":6,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/35597\/revisions"}],"predecessor-version":[{"id":53283,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/35597\/revisions\/53283"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/36376"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=35597"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=35597"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=35597"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=35597"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}