Home > Informatik > Begriffe und Konzepte > Prinzipien der OOP > Prinzip 3

3. Wiederholungen vermeiden

Don't repeat yourself

Wenn in einem Quelltext immer wieder die gleichen Abfolgen von Anweisungen vorkommen, dann kann man diese in einem eigenen Modul zusammenfassen. Das verkürzt den Quelltext und verringert die Fehleranfälligkeit. Bei Änderung der Anforderungen muss dann nur das neue Modul angepasst werden und nicht mehr jede Stelle im Quelltext, das die wiederholten Anweisungen enthält.

"Eine identifizierbare Funktionalität eines Softwaresystems sollte innerhalb dieses Systems nur einmal umgesetzt sein." [1]

Gerade in "quick and dirty" geschriebenen Programmen entstehen solche Wiederholungen durch übertriebenes "copy and paste" von Quelltext. Man hat eine schöne Methode zum Zeichnen von Rechtecken geschrieben und braucht jetzt noch eine Methode, die das Gleiche mit Kreisen macht. Oft kopiert man dann einfach den Rechteck-Quelltext und verändert ihn so, dass jetzt Kreise dargestellt werden. Dass dabei vielleicht 80% der beiden Quelltexte übereinstimmen, stört dabei nicht weiter.

Nun ändern sich die Anforderungen an die graphische Darstellung, und man passt den Quelltext für die Rechtecke an. Jetzt muss man aber den Quelltext für die Kreise auf genau die gleiche Weise verändern - und dabei unterlaufen oft Flüchtigkeitsfehler, die dann zu unangenehmen Ergebnissen führen.

Nach diesem OOP-Prinzip - Wiederholungen vermeiden - müsste man den Quelltext, der in beiden Methoden vorkommt, in eine dritte Methode auslagern, die dann von beiden Methoden aufgerufen wird. Wenn jetzt etwas geändert werden muss, nimmt man sich nur die neue dritte Methode vor, und die beiden anderen Methoden müssen nicht mehr geändert werden.

Ein schönes Beispiel

Ich habe mir von ChatGPT ein schönes Beispiel für dieses OOP-Prinzip generieren lassen:

public class Drawing
{
    private Circle sun;
    private Rectangle houseWall;
    private Triangle roof;

    public void drawMorning()
    {
        sun = new Circle();
        sun.moveHorizontal(100);
        sun.moveVertical(50);
        sun.changeColor("yellow");
        sun.makeVisible();

        houseWall = new Rectangle();
        houseWall.moveHorizontal(70);
        houseWall.moveVertical(100);
        houseWall.changeColor("red");
        houseWall.makeVisible();
    }

    public void drawEvening()
    {
        sun = new Circle();
        sun.moveHorizontal(100);
        sun.moveVertical(50);
        sun.changeColor("orange");
        sun.makeVisible();

        houseWall = new Rectangle();
        houseWall.moveHorizontal(70);
        houseWall.moveVertical(100);
        houseWall.changeColor("darkred");
        houseWall.makeVisible();
    }
}

Die gelb markierten Zeilen sind in beiden Methoden identisch und können gut in eine eigene Methode ausgelagert werden:

public class Drawing
{
    private Circle sun;
    private Rectangle houseWall;
    private Triangle roof;

    public void drawMorning()
    {
        drawSun("yellow");
        drawHouseWall("red");
    }

    public void drawEvening()
    {
        drawSun("orange");
        drawHouseWall("darkred");
    }

    private void drawSun(String color)
    {
        sun = new Circle();
        sun.moveHorizontal(100);
        sun.moveVertical(50);
        sun.changeColor(color);
        sun.makeVisible();
    }

    private void drawHouseWall(String color)
    {
        houseWall = new Rectangle();
        houseWall.moveHorizontal(70);
        houseWall.moveVertical(100);
        houseWall.changeColor(color);
        houseWall.makeVisible();
    }
}

Quellen:

  1. Lahres et al.: Objektorientierte Programmierung, Rheinwerk Computing 2021.
  2. Barnes, Kölling: Java lernen mit BlueJ - Objects first. Pearson-Verlag 2019.
  3. Ullenboom: Java ist auch eine Insel, Rheinwerk Computing 2023.