Wiki: Mathe und Info

Unterrichtsmaterialien für Mathematik und Informatik

Benutzer-Werkzeuge

Webseiten-Werkzeuge


info:sek-ii:e2:processing:fk-dry

Fachkonzept: Don't Repeat Yourself

DRY ist ein sogenanntes Programmier-Prinzip, das Fehlern vorbeugt und Code einfacher zu warten macht. Nehmen wir das folgende, euch bereits bekannte Beispiel:

Angenommen, wir würden noch keine Methoden kennen. Dann hätten wir das Bild z.B. so programmiert:

void setup() {
  size(400, 150);
}
 
void draw() {
  background(#AACCEE);
 
  // Rasen
  fill(0, 255, 0);
  rect(-1, 130, 401, 20);
 
  // Sonne
  fill(255, 255, 0);
  circle(390, 10, 50);
 
  // Haus 1 (10, 140)
  fill(255);
  rect(10, 90, 50, 50);
  fill(192, 0, 0);
  triangle(10, 90, 60, 90, 35, 65);
 
  // Haus 2 (110, 140);
  fill(255);
  rect(110, 90, 50, 50);
  fill(192, 0, 0);
  triangle(110, 90, 160, 90, 135, 65);
 
  // Haus 3 (210, 140);
  fill(255);
  rect(210, 90, 50, 50);
  fill(192, 0, 0);
  triangle(210, 90, 260, 90, 235, 65);
 
  // Haus 4 (310, 140);
  fill(255);
  rect(310, 90, 50, 50);
  fill(192, 0, 0);
  triangle(310, 90, 360, 90, 335, 65);
}

In diesem Beispiel wurden keine Methoden verwendet, um Haus, Sonne oder Rasen zu zeichnen. Für die Sonne oder den Rasen kann man auch über die Sinnhaftigkeit diskutieren, aber wie sieht es hier mit dem Haus aus? Was, wenn man z.B. die Farbe des Dachs anpassen möchte?

Einfach, sagt ihr? "Nur" vier mal die Farbe ändern? Was aber, wenn man 100 Häuser hätte? Oder man möchte jedes Haus etwas breiter machen, 75 statt 50 Pixel, die Höhe soll aber gleich bleiben?

Hier muss man schon wesentlich mehr Code-Stellen anpassen und die Gefahr für Fehler ist hoch. Hier greift das Don't-Repeat-Yourself-Prinzip. Wenn man ähnlichen Code (oder sogar den gleichen) mehrfach verwendet, ist das schlechter Stil. Es macht die Wartung und die Anpassung des Codes unnötig schwierig. Besser wäre es wie im Einstiegsbeispiel zu Methoden gewesen, direkt eine Methode für das Zeichnen eines Hauses zu erstellen, um den Mehrfach-Code direkt von Anfang an zu vermeiden:

void setup() {
  size(400, 150);
}
 
void draw() {
  background(#AACCEE);
 
  rasen();  
  sonne();
 
  haus(10, 140);
  haus(110, 140);
  haus(210, 140);
  haus(310, 140);
}
 
void rasen() {
  fill(0, 255, 0);
  rect(-1, 130, 401, 20);
}
 
void sonne() {
  fill(255, 255, 0);
  circle(390, 10, 50);
}
 
void haus(int x, int y) {
  fill(255);
  rect(x, y - 50, 50, 50);
  fill(192, 0, 0);
  triangle(x, y - 50, x + 50, y - 50, x + 25, y - 75);
}

So sind auch die geforderten Änderungen leicht einzupflegen:

void haus(int x, int y) {
  fill(255);
  // Einmal hier  ##
  rect(x, y - 50, 75, 50); 
  fill(192, 0, 0);
  // Einmal hier          ##  und hier    ####
  triangle(x, y - 50, x + 75, y - 50, x + 37.5, y - 75);
}

Wenn man zusätzlich die Methoden sinnvoll benennt, spart man sich auch gleichzeitig Kommentare!

info/sek-ii/e2/processing/fk-dry.txt · Zuletzt geändert: 2022-05-02 21:14 von christian.weber