SOLID-Prinzipien in Java: Theorie und Praxis von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

SOLID-Prinzipien in Java: Von der Theorie zur Praxis

\n\n

SOLID ist ein Akronym für fünf fundamentale Prinzipien der objektorientierten Programmierung, formuliert von Robert C. Martin (Uncle Bob). Diese Prinzipien helfen dabei, flexiblen, wartbaren und skalierbaren Code zu erstellen. In diesem Artikel analysieren wir jedes Prinzip anhand von Java-Beispielen, zeigen, wie sie verletzt werden, und wie man sie richtig anwendet.

\n\n

Wozu braucht man die SOLID-Prinzipien?

\n

Ohne SOLID wird Code schnell zu „Spaghetti-Code“. Kennen Sie die Situation, dass die Änderung einer Klasse drei andere zerstört? Oder dass eine Methode zu viel tut? SOLID löst diese Probleme. Jedes Prinzip ist eine Regel, die Code macht:

\n
    \n
  • Änderungsresistent — neue Anforderungen zerstören nicht die alte Logik.
  • \n
  • Verständlich — jede Klasse ist für eine Sache verantwortlich.
  • \n
  • Testbar — einfach Unit-Tests zu schreiben.
  • \n
\n\n

1. Single Responsibility Principle (SRP) — Prinzip der einzigen Verantwortung

\n

Formulierung: „Eine Klasse sollte nur einen Grund zur Änderung haben“.

\n

Einfach ausgedrückt: Eine Klasse sollte nur eine Sache tun. Wenn eine Klasse mehr als eine Verantwortung hat, ist sie schwer zu warten.

\n\n

Verletzung des SRP (schlechter Code)

\n
public class OrderService {\n    public void createOrder(Order order) {\n        // Logik zur Auftragserstellung\n        saveToDatabase(order);\n        sendEmailConfirmation(order);\n    }\n\n    private void saveToDatabase(Order order) {\n        // Speichern in der DB\n    }\n\n    private void sendEmailConfirmation(Order order) {\n        // E-Mail senden\n    }\n}
\n

Problem: Die Klasse ist verantwortlich für die Geschäftslogik, die Datenbankarbeit und das Senden von Benachrichtigungen. Eine Änderung des E-Mail-Dienstes erfordert eine Änderung von OrderService.

\n\n

Korrekte Implementierung des SRP

\n
public class OrderService {\n    private final OrderRepository repository;\n    private final EmailService emailService;\n\n    public OrderService(OrderRepository repo, EmailService email) {\n        this.repository = repo;\n        this.emailService = email;\n    }\n\n    public void createOrder(Order order) {\n        repository.save(order);\n        emailService.sendConfirmation(order);\n    }\n}\n\npublic class OrderRepository {\n    public void save(Order order) { /* DB-Logik */ }\n}\n\npublic class EmailService {\n    public void sendConfirmation(Order order) { /* E-Mail-Logik */ }\n}
\n

Jetzt hat jede Klasse einen Grund zur Änderung. OrderService ändert sich nur bei Änderung des Geschäftsprozesses zur Auftragserstellung.

\n\n

2. Open/Closed Principle (OCP) — Prinzip der Offenheit/Geschlossenheit

\n

Formulierung: „Klassen sollten offen für Erweiterung, aber geschlossen für Modifikation sein“.

\n

Das bedeutet, dass Sie neue Funktionalität durch neuen Code hinzufügen sollten, nicht durch Änderung vorhandenen Codes.

\n\n

Verletzung des OCP (schlechter Code)

\n
public class AreaCalculator {\n    public double calculateArea(Object shape) {\n        if (shape instanceof Rectangle) {\n            Rectangle r = (Rectangle) shape;\n            return r.width * r.height;\n        } else if (shape instanceof Circle) {\n            Circle c = (Circle) shape;\n            return Math.PI * c.radius * c.radius;\n        }\n        throw new IllegalArgumentException("Unbekannte Form");\n    }\n}
\n

Um ein Dreieck hinzuzufügen, muss die Methode calculateArea geändert werden — das verletzt das OCP.

\n\n

Korrekte Implementierung des OCP

\n
public interface Shape {\n    double calculateArea();\n}\n\npublic class Rectangle implements Shape {\n    private double width, height;\n    public Rectangle(double w, double h) { this.width = w; this.height = h; }\n    @Override\n    public double calculateArea() { return width * height; }\n}\n\npublic class Circle implements Shape {\n    private double radius;\n                

Blogs

Buchempfehlungen