Open Closed

Eine Komponente sollte offen für Erweiterungen aber geschlossen für Modifikationen sein. Das heißt Erweiterungen der Funktionalität sollten möglichst keinen bestehenden Code verändern.

Dies Prinzip ziehlt vor allem darauf einmal geschriebenen und getesteten Code nicht zu verändern und somit die Möglichkeits von Bugs zu minimieren

Beispiel

class UserDao {
    private User user;

    public UserDao(User user) {
        this.user = User;
    }

    public void saveToDb() {
        // save to database implementation
    }
}

User Dao hat eine einzige Aufgabe. Es speicher einen User in der Datenbank. Kommt nun aber die Anforderung, dass der User auch in einer Textdatei gespeichert werden soll, so müsste die Methode saveToDb angepasst werden. Das ist ein Verstoß gegen das Open/Closed Prinzip. Wir können den Code umschreiben, sodass die Methode saveToDb nicht mehr verändert werden muss.

interface UserSaver {
    void save(User user);
}

class DbUserSaver implements UserSaver {
    public void save(User user) {
        // save to database implementation
    }
}

class FileUserSaver implements UserSaver {
    public void save(User user) {
        // save to file implementation
    }
}