Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
de:modul:ffit:3-jahr:java:learningunits:lu05:b [2025/09/15 11:02] – angelegt apeterde:modul:ffit:3-jahr:java:learningunits:lu05:b [2025/09/16 06:46] (aktuell) apeter
Zeile 1: Zeile 1:
-====== LU05b - Prinzipien (LSP) ======+====== LU05b - Prinzipien (LSP, ISP) ======
  
-==== Prinzipien ====+===== Prinzipien =====
  
   * //DRY (Don’t Repeat Yourself)//   * //DRY (Don’t Repeat Yourself)//
Zeile 16: Zeile 16:
 SOLID steht wiederum für SRP, OCP, LSP, ISP, DIP SOLID steht wiederum für SRP, OCP, LSP, ISP, DIP
  
-Wir fokussieren uns erstmal auf **DRY** und **SRP**.+Wir fokussieren uns dieses Mal auf **LSP** und **ISP**.
  
-=== DRY ===+==== LSP ====
  
-Code ist viel simpler art- und erweiterbarwenn man nur eine einzige Stelle anpassen muss. Duplizierte Code-Blöcke erhöhen die Fehleranfälligkeit und erschweren die Lesbarkeit.+Das Liskov Substitution Principle besagtdass ein Programm, das Objekte einer Basisklasse T verwendet, auch mit Objekten der davon abgeleiteten Klasse S korrekt funktionieren muss, ohne dabei das Programm zu verändern.
  
-Wenn Sie zum Beispiel an zwei unterschiedlichen Orten denselben Datenbankaufruf habenkann man diese Funktionalität auslagern in eine gemeinsame Methode (oder oftmals gar eine eigene Klasse).+Folgendes Beispiel verletzt das LSPweil ein Kreis zwar eine Spezialform einer Ellipse ist, aber in diesem Fall nicht mit den Eigenschaften der Klasse ''Ellipse'' kompatibel ist.''setRadiusX()'' und ''setRadiusY()'' können nach wie vor auf dem Kreis aufgerufen werden und dadurch unerwünschte Nebeneffekte hervorrufen.
  
-<code java+{{:de:modul:ffit:3-jahr:java:learningunits:lu05:uml_example_lsp.png|}}
-Connection conn = DriverManager.getConnection(URL, USER, PASSWORD) +
-</code>+
  
-<code java> +Besser wäre es die Klasse ''Circle'' direkt von ''Shape'' erben zu lassen.
-public class Database { +
-    private static final String URL = Config.get("DB_URL"); +
-    private static final String USER = Config.get("DB_USER"); +
-    private static final String PASSWORD = Config.get("DB_PASSWORD");+
  
-    public static Connection getConnection() throws SQLException { +==== ISP ==== 
-        return DriverManager.getConnection(URLUSERPASSWORD)+Das Interface Segregation Principle besagt, dass Interfaces nur logisch untrennbare Methoden vorgeben solltenDas heisst in diesem Beispieldie Methoden ''printDocument''''scanDocument'' und ''faxDocument'' sollten nur in einem gemeinsamen Interface definiert werden, falls sämtliche (zukünftigeImplementierungen alle Methoden zwingend benötigen.
-    } +
-+
-</code>+
  
-Kontrollieren Sie Ihren Code hinsichtlich dieses Prinzips und korrigieren Sie bei Bedarf.+{{:de:modul:ffit:3-jahr:java:learningunits:lu05:uml_example_isp_1.png|}}
  
-=== SRP === +Ist dies nicht der Fall, so sollte man die Interfaces aufteilenDadurch können zukünftige Klassen nur einzelne Interfaces implementieren und sind nicht gezwungen irgendwelche Dummy-Implementierungen zu erstellen
-Jede Klasse sollte nur einen Aufgabenbereich habenDas Lesen und Schreiben von Dateien ist somit zu trennen von der Logik für den Zugriff auf die Datenbank usw.+
  
-Kontrollieren Sie Ihren Code hinsichtlich dieses Prinzips und korrigieren Sie bei Bedarf.+{{:de:modul:ffit:3-jahr:java:learningunits:lu05:uml_example_isp_2.png|}}
  
-Ein möglicher Aufbau der Klassen könnte folgendermassen aussehen.  
  
-{{:de:modul:ffit:3-jahr:java:learningunits:lu02:library-app-structure-srp.png|Screenshot structure}} 
  • de/modul/ffit/3-jahr/java/learningunits/lu05/b.1757926947.txt.gz
  • Zuletzt geändert: 2025/09/15 11:02
  • von apeter