Zum Inhalt springen

Interface-Segregation-Prinzip

aus Wikipedia, der freien Enzyklopädie

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.<ref>{{#if:2012-06-27|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:Wolfgang Kowarschick|Wolfgang Kowarschick: }}{{#if:https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7C{{#if:Programmierprinzipien: Interface-Segregation-Prinzip, Interface segregation principle|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1=https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Programmierprinzipien: Interface-Segregation-Prinzip, Interface segregation principle}}]{{#if:| ({{{format}}})}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://glossar.hs-augsburg.de/Hauptseite%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Programmierprinzipien: Interface-Segregation-Prinzip, Interface segregation principle}}}}|[{{#invoke:URLutil|getNormalized|1=https://glossar.hs-augsburg.de/Hauptseite}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Programmierprinzipien: Interface-Segregation-Prinzip, Interface segregation principle}}}}]}}{{#if:| ({{{format}}}{{#if:GlossarWiki der Hochschule Augsburg (HSA)2012-02-23https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle{{#if: 2012-06-26 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}

          | )
          | {{#if:{{#ifeq:de|de||{{#if:de|1}}}}| ; 
              | )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://glossar.hs-augsburg.de/Hauptseite%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://glossar.hs-augsburg.de/Hauptseite}}%7C%7C}}}}{{#if:Programmierprinzipien: Interface-Segregation-Prinzip, Interface segregation principle|{{#if:{{#invoke:WLink|isValidLinktext|1=Programmierprinzipien: Interface-Segregation-Prinzip, Interface segregation principle|lines=0}}||}}}}{{#if: | In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{{werk}}}}}}}{{#if: GlossarWiki der Hochschule Augsburg (HSA)| GlossarWiki der Hochschule Augsburg (HSA){{#if: 2012-02-23https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7C,%7C{{#if: 2012-06-26 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: 2012-02-23| {{#if:{{#invoke:DateTime|format|2012-02-23|noerror=1}}
            |{{#invoke:DateTime|format|2012-02-23|T._Monat JJJJ}}
            |{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=2012-02-23|class=Zitationswartung}} }}{{#if: https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7C,%7C{{#if: 2012-06-26 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7C,%7C{{#if: 2012-06-26 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle{{#invoke:TemplUtl%7Cfaculty%7C}}%7C+{{#if:2012-02-23GlossarWiki der Hochschule Augsburg (HSA)|{{#if:https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7Carchiviert%7Cehemals}}%7C{{#if:https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7CArchiviert%7CEhemals}}}}+{{#if:https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7Cvom%7Cim}}+Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: 2012-06-27| am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|2012-06-27{{#if:2673685||(?)}}}}}}{{#if: 2012-06-26|;}}}}{{#if: 2012-06-26| {{#if:2012-02-23GlossarWiki der Hochschule Augsburg (HSA)https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle{{#invoke:TemplUtl%7Cfaculty%7C}}%7Cabgerufen%7CAbgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2012-06-26 |ISO|noerror=1}} }}
       |4=im Jahr
       |7=im
       |10=am
       |#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2012-06-26|class=Zitationswartung}} }} {{#invoke:DateTime|format|2012-06-26|T._Monat JJJJ}}
    | {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:de|de||{{#if:de|1}}}}|{{#if:GlossarWiki der Hochschule Augsburg (HSA)2012-02-23https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle{{#if: 2012-06-26 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
       |  (
       | {{#if: | |  (}}
       }}{{#ifeq:{{#if:de|de|de}}|de||
          {{#invoke:Multilingual|format|de|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:de|de|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 2012-02-23https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle{{#if: 2012-06-26 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}de|{{#if: |: {{
 #if: 
 | {{
     #ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
     | Vorlage:Str trim
     | {{#invoke:Vorlage:lang|flat}}
     }}
 | {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
     | „Vorlage:Str trim“
     | {{#invoke:Text|quote
         |1={{#if: 
              | {{#invoke:Vorlage:lang|flat}}
              | {{#invoke:Vorlage:lang|flat}} }}
         |2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
         |3=1}} }}

}}{{#if:

   |  (<templatestyles src="Person/styles.css" />{{#if:  | :  }}{{#if:  | , deutsch: „“ }})
   | {{#if: 
       |  ({{#if:  | , deutsch: „“ }})
       | {{#if:  |  (deutsch: „“) }}
 }}

}}{{#if: {{{zitat}}}

   | {{#if: 
       | {{#if: {{{zitat}}}
           | Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
   | Vorlage:": Text= fehlt }}{{#if:  | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
             | Vorlage:": Ungültiger Wert: ref=
             | {{{ref}}} }}

}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7C%7C{{#ifeq: | JaKeinHinweis |{{#switch:

   |0|=Vorlage:Toter Link/Core{{#if: https://glossar.hs-augsburg.de/Hauptseite
       | {{#if:  | [1] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: 
           | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }}
         }}
       |   (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.)
     }}{{#switch: 
         |no|0|=
         |#default={{#if:  ||  }}
    }}{{#invoke:TemplatePar|check
         |opt      = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
    }}{{#if: https://glossar.hs-augsburg.de/Hauptseite
      | {{#if:{{#invoke:URLutil|isWebURL|https://glossar.hs-augsburg.de/Hauptseite}}
          || {{#if:  ||  }} 
        }}
      | {{#if: 
           | {{#if:  ||  }}
           | {{#if:  ||  }}
        }}
    }}{{#if: 
       | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
         }}
    }}{{#switch: deadurl
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://glossar.hs-augsburg.de/Hauptseite Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. )  {{#if: 
            | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }}
         }}Vorlage:Toter Link/Core{{#switch: 
          |no|0|=
          |#default= {{#if:  ||  }}
        }}{{#invoke:TemplatePar|check
         |all      = inline= url=
         |opt      = datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
       }}{{#if: https://glossar.hs-augsburg.de/Hauptseite
       | {{#if:{{#invoke:URLutil|isWebURL|https://glossar.hs-augsburg.de/Hauptseite}}
          || {{#if:  ||  }} 
        }}
    }}{{#if: 
         | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
           }}
    }}{{#switch: deadurl
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}[https://glossar.hs-augsburg.de/Hauptseite }}|{{#switch: 
   |0|=Vorlage:Toter Link/Core{{#if: https://glossar.hs-augsburg.de/Hauptseite
       | {{#if:  | [2] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: 2025-07-21 06:41:41 InternetArchiveBot
           | {{#if:  | | Vorlage:Toter Link/archivebot }}
         }}
       |   (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.)
     }}{{#switch: 
         |no|0|=
         |#default={{#if:  ||  }}
    }}{{#invoke:TemplatePar|check
         |opt      = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
    }}{{#if: https://glossar.hs-augsburg.de/Hauptseite
      | {{#if:{{#invoke:URLutil|isWebURL|https://glossar.hs-augsburg.de/Hauptseite}}
          || {{#if:  ||  }} 
        }}
      | {{#if: 
           | {{#if:  ||  }}
           | {{#if:  ||  }}
        }}
    }}{{#if: 
       | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
         }}
    }}{{#switch: 
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://glossar.hs-augsburg.de/Hauptseite Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. )  {{#if: 2025-07-21 06:41:41 InternetArchiveBot
            | {{#if:  | | Vorlage:Toter Link/archivebot }}
         }}Vorlage:Toter Link/Core{{#switch: 
          |no|0|=
          |#default= {{#if:  ||  }}
        }}{{#invoke:TemplatePar|check
         |all      = inline= url=
         |opt      = datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
       }}{{#if: https://glossar.hs-augsburg.de/Hauptseite
       | {{#if:{{#invoke:URLutil|isWebURL|https://glossar.hs-augsburg.de/Hauptseite}}
          || {{#if:  ||  }} 
        }}
    }}{{#if: 
         | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
           }}
    }}{{#switch: 
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}[https://glossar.hs-augsburg.de/Hauptseite }} }}}}}}}}}}{{#if:2025-07-21 06:41:41 InternetArchiveBot|
        {{#invoke:Vorlage:Internetquelle|archivBot|stamp=2025-07-21 06:41:41 InternetArchiveBot|text={{#if:https://web.archive.org/web/20120627051939/http://glossar.hs-augsburg.de/Hauptseite#Interface-Segregation-Prinzip.5B8.5D.2C_Interface_segregation_principle%7CVorlage:Webarchiv/archiv-bot}}

}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref>

Beispiele

Java

<syntaxhighlight lang="java">interface Workable {

   void work();

}

interface Eatable {

   void eat();

}

class Human implements Workable, Eatable {

   @Override
   public void work() {
       System.out.println("Mensch arbeitet");
   }
   
   @Override
   public void eat() {
       System.out.println("Mensch isst");
   }

}

class Robot implements Workable {

   /**
    * Robot implementiert nur Workable, nicht Eatable.
    * Dies erfüllt das ISP, da Robot nicht gezwungen wird, eine eat()-Methode
    * zu implementieren, die er nicht benötigt. Dadurch wird vermieden, dass
    * unnötige Methoden mit Dummy-Implementierungen oder Exceptions gefüllt werden müssen.
    */
   @Override
   public void work() {
       System.out.println("Roboter arbeitet");
   }

}</syntaxhighlight>

Anwendung

<syntaxhighlight lang="java">Workable[] workers = { new Human(), new Robot()};

// Alle Arbeiter können arbeiten for (Workable worker: workers) {

   worker.work(); // Kompiliert erfolgreich

}

// Mittagspause: Falsche Implementierung wird durch IDE / Compiler erkannt for (Workable worker: workers) {

   // worker.eat();  // COMPILER-FEHLER: eat() existiert nicht in Workable

}

// Mittagspause, korrekte Lösung: eat() nur auf Eatable-Objekten aufrufen for (Workable worker: workers) {

   if (worker instanceof Eatable) {
       ((Eatable) worker).eat();
   }

}</syntaxhighlight>

Typescript

<syntaxhighlight lang="typescript">interface Workable {

   work(): void;

}

interface Eatable {

   eat(): void;

}

class Human implements Workable, Eatable {

   work(): void {
       console.log("Mensch arbeitet");
   }
   
   eat(): void {
       console.log("Mensch isst");
   }

}

class Robot implements Workable {

   /**
    * Robot implementiert nur Workable, nicht Eatable.
    * Dies erfüllt das ISP, da Robot nicht gezwungen wird, eine eat()-Methode
    * zu implementieren, die er nicht benötigt. Dadurch wird vermieden, dass
    * unnötige Methoden mit Dummy-Implementierungen oder Exceptions gefüllt werden müssen.
    */
   work(): void {
       console.log("Roboter arbeitet");
   }

}

function isEatable(worker: Workable): worker is Eatable {

   return 'eat' in worker;

}</syntaxhighlight>

Anwendung

<syntaxhighlight lang="typescript"> const workers: Workable[] = [new Human(), new Robot()];

// Alle Arbeiter können arbeiten for (const worker of workers) {

   worker.work();

}

// Mittagspause: Falsche Implementierung wird durch IDE / Compiler erkannt for (const worker of workers) {

   // worker.eat();  // COMPILER-FEHLER: eat() existiert nicht in Workable

}

// Mittagspause, korrekte Lösung: eat() nur auf Eatable-Objekten aufrufen for (const worker of workers) {

   if (isEatable(worker)) {
       worker.eat();
   }

} </syntaxhighlight>

Einzelnachweise

<references />

Vorlage:Navigationsleiste Prinzipien objektorientierten Designs