<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-x-formal">
	<id>https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hhoegl</id>
	<title>GlossarWiki - Benutzerbeiträge [de-formal]</title>
	<link rel="self" type="application/atom+xml" href="https://glossar.hs-augsburg.de/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hhoegl"/>
	<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/Spezial:Beitr%C3%A4ge/Hhoegl"/>
	<updated>2026-07-19T10:03:32Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Hunt,_D.;_Thomas,_D._(2003):_Der_Pragmatische_Programmierer&amp;diff=45427</id>
		<title>Hunt, D.; Thomas, D. (2003): Der Pragmatische Programmierer</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Hunt,_D.;_Thomas,_D._(2003):_Der_Pragmatische_Programmierer&amp;diff=45427"/>
		<updated>2018-10-08T17:36:39Z</updated>

		<summary type="html">&lt;p&gt;Hhoegl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Quelle:Buch&lt;br /&gt;
|key=Hunt, Thomas (2003)&lt;br /&gt;
|authors=Andrew Hunt, David Thomas&lt;br /&gt;
|editors=&lt;br /&gt;
|title=Der Pragmatische Programmierer&lt;br /&gt;
|subtitle=&lt;br /&gt;
|volume=&lt;br /&gt;
|number=&lt;br /&gt;
|series=&lt;br /&gt;
|edition=&lt;br /&gt;
|publisher=Fachbuchverlag Leipzig im Carl Hanser Verlag&lt;br /&gt;
|address=&lt;br /&gt;
|isbn=3446223096, 978-3446223097&lt;br /&gt;
|year=2003&lt;br /&gt;
|month=&lt;br /&gt;
|day=&lt;br /&gt;
|url=&lt;br /&gt;
|shelfmark=&lt;br /&gt;
|language=Deutsch&lt;br /&gt;
|quality=5&lt;br /&gt;
|annotations=&lt;br /&gt;
|bibtex-authors=&lt;br /&gt;
|bibtex-editors=&lt;br /&gt;
|bibtex-title=&lt;br /&gt;
|bibtex-subtitle=&lt;br /&gt;
|bibtex-volume=&lt;br /&gt;
|bibtex-number=&lt;br /&gt;
|bibtex-series=&lt;br /&gt;
|bibtex-edition=&lt;br /&gt;
|bibtex-publisher=&lt;br /&gt;
|bibtex-address=&lt;br /&gt;
|bibtex-url=&lt;br /&gt;
|bibtex-shelfmark=&lt;br /&gt;
|bibtex-annotations=&lt;br /&gt;
}}&lt;br /&gt;
[[Kategorie:Quelle:Programmierprinzip]]&lt;/div&gt;</summary>
		<author><name>Hhoegl</name></author>
	</entry>
	<entry>
		<id>https://glossar.hs-augsburg.de/w/index.php?title=Don%27t_repeat_yourself&amp;diff=45426</id>
		<title>Don&#039;t repeat yourself</title>
		<link rel="alternate" type="text/html" href="https://glossar.hs-augsburg.de/w/index.php?title=Don%27t_repeat_yourself&amp;diff=45426"/>
		<updated>2018-10-08T17:35:52Z</updated>

		<summary type="html">&lt;p&gt;Hhoegl: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Qualität&lt;br /&gt;
|correctness         = 4&lt;br /&gt;
|extent              = 3&lt;br /&gt;
|numberOfReferences  = 3&lt;br /&gt;
|qualityOfReferences = 4&lt;br /&gt;
|conformance         = 5&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Definition==&lt;br /&gt;
Das [[Programmierprinzipien#Don.27t_repeat_yourself.2C_DRY.5B1.5D|Programmierprinzip]] [[Don&#039;t repeat yourself]] (DRY, Wiederhole dich nicht)&lt;br /&gt;
besagt, dass Code nicht dupliziert und anschließend nur marginal modifiziert werden sollte.&amp;lt;ref&amp;gt;{{Quelle|Hund, Thomas (2003)}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Begründung==&lt;br /&gt;
Der Grund ist folgender: Wenn eine Folge von Anweisungen mehrfach in sehr ähnlicher Form verwendet wird, liegt diesen Anweisungen ein allgemeineres Prinzip zu Grunde, das explizit ins zugehörige Programm eingearbeitet werden sollte. &lt;br /&gt;
&lt;br /&gt;
Code ohne Duplikate und Quasis-Duplikate von Anweisungen wird häufig als &#039;&#039;&#039;DRY&#039;&#039;&#039; bezeichnet. &lt;br /&gt;
Mit &#039;&#039;&#039;“to DRY code”&#039;&#039;&#039; wird der Vorgang bezeichnet, Anweisungs-Duplikate aus dem entsprechenden Code zu entfernen.&amp;lt;ref&amp;gt;Quelle fehlt&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Code der DRY ist bietet folgende Vorteile:&lt;br /&gt;
:⇒ Wartbarkeit (da Änderungen nicht an mehreren, fast identischen Anweisungen vorgenommen werden müssen)&lt;br /&gt;
:⇒ Robustheit (bei einer Änderung, die an mehreren Stellen vorgenommen werden muss, kommt es häufig zu Inkonsitenzen)&lt;br /&gt;
:⇒ Lesbarkeit (da weniger Code existiert)&lt;br /&gt;
&lt;br /&gt;
== Beispiele ==&lt;br /&gt;
===C#-Code, der nicht DRY ist (Autor: Anonym)===&lt;br /&gt;
&lt;br /&gt;
Folgendes Beispiel stammt aus einem C#-Tool, das Daten für unterschiedliche&lt;br /&gt;
Gruppen von Personen verarbeitet. Als das Tool entwickelt wurde, gab &lt;br /&gt;
es genau zwei Gruppen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// Filtere hier nach Gruppe 1 oder 2&lt;br /&gt;
if (this.selectedGroup == 1)&lt;br /&gt;
  persons = persons.Where(p =&amp;gt; p.IsActive &amp;amp;&amp;amp; p.Group == 1);&lt;br /&gt;
&lt;br /&gt;
else if (this.selectedGroup == 2)&lt;br /&gt;
  persons = persons.Where(p =&amp;gt; p.IsActive &amp;amp;&amp;amp; p.Group == 2);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wie man sieht, kann der Code problemlos für 3, 4 oder auch 27 Gruppen erweitert werden.&lt;br /&gt;
&lt;br /&gt;
Wenn man diesen Code allerdings DRY macht, wird er nicht nur kürzer, sondern funktioniert &lt;br /&gt;
auch noch ohne Änderungen, wenn irgendwann einmal die Anzahl der Gruppen erhöht wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
persons = persons.Where(p =&amp;gt; p.IsActive &amp;amp;&amp;amp; p.Group == this.selectedGroup);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JavaScript-Code, der nicht DRY ist (Autor: Anonym)===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
v_counter1.text = ++v_score_player1;&lt;br /&gt;
v_counter1.text = ++v_score_player1;&lt;br /&gt;
v_counter1.text = ++v_score_player1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Glücklicher weise soll der Score nur um 3 und nicht um 50 Punkte erhöht werden.&lt;br /&gt;
DRY wäre folgender Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
v_score_player1 += 3;&lt;br /&gt;
v_counter1.text = v_score_player1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===JavaScript-Code, der nicht DRY ist (Autoren: Anyom)===&lt;br /&gt;
&lt;br /&gt;
Folgender Code stammt aus einen einfachen JavaScript-Spiel mit 15 Spielsteinen („Coins“).&lt;br /&gt;
Für jeden einzelnen Stein wurde der zugehörige Code separat ausformuliert:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var btnSrc1 = new Image();&lt;br /&gt;
var btn1;&lt;br /&gt;
&lt;br /&gt;
var btnSrc2 = new Image();&lt;br /&gt;
var btn2;&lt;br /&gt;
&lt;br /&gt;
var btnSrc3 = new Image();&lt;br /&gt;
var btn3;&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
function Main()&lt;br /&gt;
{		&lt;br /&gt;
...&lt;br /&gt;
  btnSrc1.src = &#039;button1.png&#039;;&lt;br /&gt;
  btnSrc1.name = &#039;coin1&#039;;&lt;br /&gt;
  btnSrc1.onload = loadGfx;&lt;br /&gt;
  	&lt;br /&gt;
  btnSrc2.src = &#039;button2.png&#039;;&lt;br /&gt;
  btnSrc2.name = &#039;coin2&#039;;&lt;br /&gt;
  btnSrc2.onload = loadGfx;&lt;br /&gt;
  	&lt;br /&gt;
  btnSrc3.src = &#039;button3.png&#039;;&lt;br /&gt;
  btnSrc3.name = &#039;coin3&#039;;&lt;br /&gt;
  btnSrc3.onload = loadGfx;&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loadGfx(e)&lt;br /&gt;
{		&lt;br /&gt;
...&lt;br /&gt;
  if(e.target.name = &#039;coin1&#039;){btn1 = new Bitmap(btnSrc1);}&lt;br /&gt;
  if(e.target.name = &#039;coin2&#039;){btn2 = new Bitmap(btnSrc2);}&lt;br /&gt;
  if(e.target.name = &#039;coin3&#039;){btn3 = new Bitmap(btnSrc3);}&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// etc. pp.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Array, ein zusätzliches Attribut &amp;lt;code&amp;gt;btn&amp;lt;/code&amp;gt; für die &amp;lt;code&amp;gt;btnSrc&amp;lt;/code&amp;gt;-Objekte und die Verwendung einer Schleife machen diesen Code DRY, d.h. kompakter, lesbarer und änderungsfreundlicher. Zum Beispiel kann die Anzahl der Spielsteine jederzeit problemlos geändert werden,&lt;br /&gt;
indem der Wert von &amp;lt;code&amp;gt;NR_OF_COINS&amp;lt;/code&amp;gt; geändert wird.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var bs_array = [], btnSrc;&lt;br /&gt;
&lt;br /&gt;
for (var i = 0; i &amp;lt; NR_OF_COINS)&lt;br /&gt;
{ btnSrc = new Image();&lt;br /&gt;
&lt;br /&gt;
  btnSrc.src    = &#039;button&#039;+i+&#039;.png&#039;;&lt;br /&gt;
  btnSrc.name   = &#039;coin&#039;+i;&lt;br /&gt;
  btnSrc.onload = loadGfx;&lt;br /&gt;
&lt;br /&gt;
  bs_array[i] = btnSrc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loadGfx()&lt;br /&gt;
{ e.target.btn = new Bitmap(e.target.src); }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Anmerkung: Hier sind noch weitere Verbesserungen denkbar, wie z.B. eine bessere Wahl der Objekt- und Attributnamen. Dies hat aber nichts mehr mit dem Prinzip  “Don&#039;t repeat yourself” zu tun.&lt;br /&gt;
&lt;br /&gt;
===Der Klassiker===&lt;br /&gt;
&lt;br /&gt;
Der Non-DRY-Klassiker dürfte wohl folgender sein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (&amp;lt;Bedingung&amp;gt;)&lt;br /&gt;
  return &amp;lt;Ein langer Ausdruck&amp;gt;;&lt;br /&gt;
else&lt;br /&gt;
  return -&amp;lt;Derselbe lange Ausdruck&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Um diesen Code DRY zu bekommen, führt man entweder eine Hilfsvariable ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
var a = &amp;lt;Ein langer Ausdruck&amp;gt;;&lt;br /&gt;
if (&amp;lt;Bedingung&amp;gt;)&lt;br /&gt;
  return a;&lt;br /&gt;
else&lt;br /&gt;
  return -a;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Oder – eleganter – man verwendet die If-Then-Else-Funktion &amp;lt;code&amp;gt;... ? ... : ...&amp;lt;/code&amp;gt;&lt;br /&gt;
an Stelle der If-Then-Else-Anweisung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
return (&amp;lt;Bedingung&amp;gt; ? 1 : -1) * &amp;lt;Ein langer Ausdruck&amp;gt;;   &lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Von diesem Klassiker gibt es zahlreiche Varianten, wie z.B. folgende Anweisung,&lt;br /&gt;
bei der klar wird, dass der Autor (oder die Autorin) Boolesche Ausdrücke&lt;br /&gt;
für etwas hält, was nur zum Testen, aber nicht zum Rechnen verwendet werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
if (&amp;lt;Boolscher Ausdruck&amp;gt;)&lt;br /&gt;
  return true;&lt;br /&gt;
else&lt;br /&gt;
  return false;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier schreibt man natürlich:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
return &amp;lt;Boolscher Ausdruck&amp;gt;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Noch ein Beispiel aus der Praxis. Im zuvor erwähnten C#-Tool findet sich folgender Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
var deactivate =&lt;br /&gt;
    (t.State == &amp;quot;gesperrt&amp;quot; || t.State == &amp;quot;inaktiv&amp;quot;) ? true : false;&lt;br /&gt;
&lt;br /&gt;
if (deactivate)&lt;br /&gt;
    DataModel.Team.Deactivate(id);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier ist nicht nur die Abbildung von &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; und von &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
überflüssig, sondern auch noch die Einführung einer Hilfsvariablen. Folgender Code ist kürzer und damit einfacher zu verstehen:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
if (t.State == &amp;quot;gesperrt&amp;quot; || t.State == &amp;quot;inaktiv&amp;quot;)&lt;br /&gt;
    DataModel.Team.Deactivate(id);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Quellen==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;ol start=&amp;quot;3&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;{{Quelle|Kowarschick, W.: Multimedia-Programmierung}}&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Siehe auch==&lt;br /&gt;
&lt;br /&gt;
#{{Vgl|Wikipedia (EN): DRY}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierprinzip]]&lt;br /&gt;
[[Kategorie:HowTo]]&lt;br /&gt;
[[en:Programing principles]]&lt;/div&gt;</summary>
		<author><name>Hhoegl</name></author>
	</entry>
</feed>