IT-Berufe-Podcast

Interface Segregation Principle (ISP) – Wissenshäppchen #6


Listen Later

Das sechste Wissenshäppchen hat das Interface Segregation Principle als Thema.
Inhalt
Das ISP ist das vierte SOLID-Prinzip.
The dependency of one class to another one should depend on the smallest possible interface.
Im Prinzip kann man das ISP so zusammenfassen: Verwende immer nur die kleinstmögliche Schnittstelle zu deinen Abhängigkeiten. Je mehr Funktionen eine Komponente an ihren Abhängigkeiten aufrufen kann, desto abhängiger wird sie von ihr. Wenn sich diese Funktionen nämlich ändern (z.B. die Signatur einer Methode), muss die nutzende Komponente neu kompiliert werden. Außerdem können Funktionen aufgerufen werden, die die nutzende Komponente weder benötigt, noch anwenden soll, z.B. die clear()-Methode einer Liste, die sie eigentlich nur durchlaufen soll. Zuletzt müssen auch implementierende Klassen von zu großen Interfaces für sie unnötige Methoden implementieren, nur um der Schnittstelle zu entsprechen.
Erklärung
Zu große Interfaces oder Basisklassen bieten evtl. Zugriff auf verschiedene Funktionalitäten, die nicht zusammengehören (z.B. Repository.getUser() und Repository.getArticle()), oder über das benötigte/erlaubte Verhalten hinausgehen (z.B. Repository.deleteUser()).
Komponenten, die von diesen Schnittstellen abhängen, können mit ihnen "zu viel" machen und müssen angepasst (mind. rekompiliert) werden, wenn sich diese ändern, auch wenn sie die geänderte Funktionalität gar nicht nutzen.
Komponenten, die die vorgegebenen Schnittstellen anbieten möchten, müssen mehr implementieren, als sie eigentlich wollen (oder dies nicht tun und das LSP mit einer NotImplementedException verletzen).
Tests von Komponenten, die Abhängigkeiten auf große Schnittstellen haben, werden schwieriger, da viele eigentlich unnötige Funktionen gestubbt oder gemockt werden müssen.
Auch eine "große" Klasse kann mehrere "kleine" Interfaces anbieten und damit wohldefinierte "Fenster" auf ihre Funktionalität anbieten.
Beispiel
Die Methode printEmployees() im folgenden Beispiel erwartet eine List, obwohl sie diese lediglich durchlaufen können muss. Durch das "zu große" Interface kann sie darüber hinaus jetzt auch die Liste leeren, was für den Aufrufer unschöne Konsequenzen hat.
public class ISP
{
public static void main(String[] args)
{
List employees = new ArrayList<>();
employees.add(new Employee("Stefan", "Macke"));
employees.add(new Employee("Karl", "Meier"));
employees.add(new Employee("Hans", "Georg"));
printEmployees(employees);
System.out.println(employees.size());
}
private static void printEmployees(List employees)
{
for (var employee : employees)
{
System.out.println(employee);
}
employees.clear();
}
}
// Ausgabe:
// Stefan Macke
// Karl Meier
// Hans Georg
// 0
Die Methode sollte stattdessen das kleinstmögliche Interface benutzen, das sie braucht, um ihre Aufgabe erfüllen zu können. In Java wäre das z.B. ´Iterable´:
private static void printEmployees(Iterable employees)
{
for (var employee : employees)
{
System.out.println(employee);
}
}
Der restliche Code funktioniert wie vorher, aber es sind nun keine modifizierenden Aufrufe mehr möglich, da das kleinere Interface die Methoden nicht anbietet.
Dynamisch typisierte Sprachen haben hier einen Vorteil, da sie dank Duck-Typing ohnehin kaum Basisklassen oder gar Interfaces benötigen. Sie rufen einfach nur die Methoden auf, die sie brauchen. Das kann allerdings auch zu impliziten Abhängigkeiten führen, die nicht vom Compiler geprüft werden, da der Zugriff auf die Klasse nicht durch ein Interface "geschützt" ist.
Vorteile
Kleinere Komponenten machen uns das Entwicklerleben einfach: klare Zuständigkeiten, einfachere Tests, weniger unnötige Abhängigkeiten.
Durch klar definierte Schnittstellen wird die fehlerhafte oder unerlaubte Verwendung von Funktionen verhindert.
...more
View all episodesView all episodes
Download on the App Store

IT-Berufe-PodcastBy Stefan Macke

  • 5
  • 5
  • 5
  • 5
  • 5

5

1 ratings


More shows like IT-Berufe-Podcast

View all
IQ - Wissenschaft und Forschung by Bayerischer Rundfunk

IQ - Wissenschaft und Forschung

46 Listeners

Eine Stunde History - Deutschlandfunk Nova by Deutschlandfunk Nova

Eine Stunde History - Deutschlandfunk Nova

106 Listeners

c’t uplink - der IT-Podcast aus Nerdistan by c’t Magazin

c’t uplink - der IT-Podcast aus Nerdistan

9 Listeners

ZEIT WISSEN. Woher weißt Du das? by DIE ZEIT

ZEIT WISSEN. Woher weißt Du das?

48 Listeners

Chaosradio by Chaos Computer Club Berlin

Chaosradio

7 Listeners

Computer und Kommunikation by Deutschlandfunk

Computer und Kommunikation

9 Listeners

Smarter leben by DER SPIEGEL

Smarter leben

47 Listeners

Kampf der Unternehmen by Wondery

Kampf der Unternehmen

13 Listeners

kurz informiert by heise online by heise online

kurz informiert by heise online

1 Listeners

Quarks Science Cops by Quarks

Quarks Science Cops

17 Listeners

Terra X History - Der Podcast by ZDF - Terra X

Terra X History - Der Podcast

9 Listeners

Aha! Zehn Minuten Alltags-Wissen by WELT

Aha! Zehn Minuten Alltags-Wissen

29 Listeners

KI verstehen by Deutschlandfunk

KI verstehen

9 Listeners

Wirecard: 1,9 Milliarden Lügen by Süddeutsche Zeitung

Wirecard: 1,9 Milliarden Lügen

3 Listeners

Passwort - der Podcast von heise security by Dr. Christopher Kunz, Sylvester Tremmel

Passwort - der Podcast von heise security

3 Listeners