Middle
Nach welchem Prinzip werden Methoden in Schnittstellen gruppiert und getrennt?
sobes.tech KI
Antwort von AI
Methoden in Schnittstellen werden nach dem Prinzip der Kohäsion des Verhaltens und dem Prinzip des expliziten Vertrags gruppiert und getrennt.
- Kohäsion des Verhaltens: Methoden, die eine einheitliche Menge von Operationen mit einer Entität darstellen oder eine ähnliche Bedeutung haben, werden in einer Schnittstelle zusammengefasst. Dies verbessert die Lesbarkeit des Codes, erleichtert das Verständnis des Zwecks der Schnittstelle und erhöht ihre Wiederverwendbarkeit.
- Expliziter Vertrag: Die Schnittstelle beschreibt einen expliziten Vertrag, den die implementierenden Klassen erfüllen müssen. Jede Methode in der Schnittstelle ist Teil dieses Vertrags. Methoden werden zwischen verschiedenen Schnittstellen aufgeteilt, wenn sie unterschiedliche Aspekte des Verhaltens darstellen oder wenn ihre Implementierung unabhängig variieren kann. Zum Beispiel kann die Schnittstelle
ReadableMethoden zum Lesen von Daten enthalten, undWritablezum Schreiben. Eine Klasse kann eine oder beide Schnittstellen je nach ihren Fähigkeiten implementieren.
Dieser Ansatz fördert die SOLID-Prinzipien, insbesondere:
- Prinzip der einzigen Verantwortlichkeit: Die Schnittstelle hat einen einzigen Grund zur Änderung – die Änderung des Verhaltens, das sie beschreibt.
- Prinzip der Schnittstellen-Segregation: Kunden sollten nicht von Schnittstellen abhängig sein, die sie nicht nutzen. Das Aufteilen großer Schnittstellen in kleinere und fokussierte ermöglicht es Klassen, nur die Schnittstellen zu implementieren, die sie wirklich benötigen.
Beispiel:
Angenommen, wir haben eine Entität, die gespeichert und geladen werden kann. Anstelle einer einzigen Schnittstelle Persistable mit zwei Methoden save() und load() ist es besser, zwei separate Schnittstellen zu erstellen:
// Schnittstelle für speicherbare Entitäten
interface Savable
{
public function save(): void;
}
// Schnittstelle für ladbare Entitäten
interface Loadable
{
public function load(): void;
}
Eine Klasse, die sowohl gespeichert als auch geladen werden kann, implementiert beide Schnittstellen:
// Klasse, die beide Schnittstellen implementiert
class DataObject implements Savable, Loadable
{
public function save(): void
{
// Speicherlogik
}
public function load(): void
{
// Lade-Logik
}
}
Eine Klasse, die nur gespeichert wird, implementiert nur Savable:
// Klasse, die nur die Schnittstelle Savable implementiert
class TempData implements Savable
{
public function save(): void
{
// Logik zum Speichern temporärer Daten
}
}
Dies ermöglicht eine flexiblere Gestaltung von Klassen und deren Abhängigkeiten.