Interface-Segregation-Prinzip

Das Interface-Segregation-Prinzip oder Schnittstellenaufteilungsprinzip ist ein Begriff aus der Informatik. Es handelt sich um ein Prinzip des objektorientierten Entwurfs. Demnach sollen zu große Schnittstellen in mehrere Schnittstellen aufgeteilt werden, falls implementierende Klassen unnötige Methoden haben müssen. Nach erfolgreicher Anwendung dieses Entwurfprinzips müsste ein Modul, das eine Schnittstelle benutzt, nur diejenigen Methoden implementieren, die es auch wirklich braucht.

Zweck

Durch dieses Prinzip ist es möglich, die von Bertrand Meyer geforderten schlanken Schnittstellen zu realisieren, was eine verbesserte Wartbarkeit mit sich bringt, da Klassen nur noch die Methoden implementieren, die sie benötigen. Somit wird der Code kompakt und ist besser wiederverwertbar. Auch eine verbesserte Überprüfbarkeit ist gegeben.[1]

Beispiele

C#

public interface IPerson
{
    int Id { get; }
    string FirstName { get; }
    string LastName { get; }
    // Andere Eigenschaften...
}

public interface ILoad
{
    void Load(string path);
}

public interface ISave
{
    void Save(string path);
}

public interface IToXmlString()
{
    string ToXmlString();
}

public class Person : IPerson, ILoad, ISave, IToXmlString
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    // Andere Eigenschaften...
    
    public void Load(string path)
    {
        // Lesen der Daten aus der Datei...
    }
    
    public void Save(string path)
    {
        // Speichern der Daten in die Datei...
    }
    
    public string ToXmlString()
    {
        // Zurückliefern der Daten als XML-Zeichenkette...
        string xmlString = "...";
        return xmlString;
    }
}
Anwendung
// Irgendwo in eine andere Klassen/Code-Datei...
IPerson person = GetPersonById(123);

// Die Daten der Person (Eigenschaften) sollen aus einer Datei geladen werden.
(person as ILoad).Load(@"C:\dir1\file1.ext");

// Später soll die Daten der Person in einer Datei gespeichert werden.
(person as ISave).Save(@"C:\dir2\file2.ext");

// Etwas weiter im Code soll person als XML string bearbeitet werden.
string xml = (person as IToXmlString).ToXmlString();

Java

interface IPerson {
    int getId();
    void setId(int id);
    
    String getFirstName();
    void setFirstName(String firstName);
    
    String getLastName();
    void setLastName(String lastName);
    // Andere Eigenschaften...
}

interface ILoad {
    void load(String path);
}

interface ISave {
    void save(String path);
}

interface IToXmlString {
    String toXmlString();
}

class Person implements IPerson, ILoad, ISave, IToXmlString {
    private int id;
    private String firstName;
    private String lastName;
    // Andere Eigenschafts-Variablen...
    
    @Override
    public int getId() { return id; }
    @Override
    public void setId(int id) { this.id = id; }
    
    @Override
    public String getFirstName() { return firstName; }
    @Override
    public void setFirstName(String firstName) { this.firstName = firstName; }
    
    @Override
    public String getLastName() { return lastName; }
    @Override
    public void setLastName(String lastName) { this.lastName = lastName; }
    // Andere Eigenschaften...
    
    @Override
    public void load(String path) {
        // Lesen der Daten aus der Datei...
    }
    
    @Override
    public void save(String path) {
        // Speichern der Daten in die Datei...
    }
    
    @Override
    public String toXmlString() {
        // Zurückliefern der Daten als XML-Zeichenkette...
        String xmlString = "...";
        return xmlString;
    }
}
Anwendung
// Irgendwo in eine andere Klassen/Code-Datei...
IPerson person = getPersonById(123);

// Die Daten der Person (Eigenschaften) sollen aus einer Datei geladen werden.
((ILoad) person).load("C:\\dir1\\file1.ext");

// Später soll die Daten der Person in einer Datei gespeichert werden.
((ISave) person).save("C:\\dir2\\file2.ext");

// Etwas weiter im Code soll person als XML string bearbeitet werden.
String xml = ((IToXmlString)person).toXmlString();

Einzelnachweise

  1. Wolfgang Kowarschick: Programmierprinzipien: Interface-Segregation-Prinzip, Interface segregation principle. GlossarWiki der Hochschule Augsburg (HSA), 23. Februar 2012, archiviert vom Original am 23. Februar 2012; abgerufen am 26. Juni 2012.