Interface IInterface oder Interface?

  • Themenstarter Themenstarter Firephoenix
  • Beginndatum Beginndatum
F

Firephoenix

Gast
Eine "richtige" Antwort gibt es vermutlich nicht, aber ich hätte gerne mal Argumente für die Bennenungskonventionen von Interfaces und implementierenden Klassen.

In den Eclipse-Conventions wird gefordert, dass jedes Interface mit einem führendem "I" benannt wird.
Auf anderen Seiten habe ich dagegen die Version mit normalen Interfaces gefunden, bei denen die Implementierende Klasse ein -Impl angehängt bekommt (oder direkt anders benannt wird - siehe das Hierachiebeispiel unten).

Ich selber bin Verfechter der "ohne I"-Variante, aber man findet ohne Probleme Argumente für beide Versionen:

Mit I
Pro:
-Interfaces werden hervorgehoben und sind für Entwickler leichter erkennbar
-kein "Impl"-Anhang an implementierenden Klassen mit identischem Namen.
Contra:
-Sucht man in einer API hat man ein Namensraumproblem, eine Persistenzschnittstelle könnte Persitence* oder IPersistence* heißen.
-Ändert man ein Interface in eine abstrakte oder konkrete Klasse führt die Änderung am Namen dazu, dass alle abhängigen Klassen sich ebenfalls ändern müssen.
-Man gibt Implementierungsdetails nach außen weiter.

Ohne I
Pro:
-Leichtes Refactoring in konkrete Klasse möglich ohne den Namen anfassen zu müssen
-Bessere Lesbarkeit (da man nicht dauernd das "I" ablesen muss)
-Sauberere Api (Siehe Gegenbeispiel oben)
Contra:
-Führt teilweise zu "-Impl" Klassenpostfixen
-Man sieht nicht mehr direkt was ein Interface und was eine Klasse ist.

Zu dem -Impl Idiom ist allerdings zu sagen, dass der Fall tatsächlich nur dann eintritt, wenn man eine Klasse benötigt die den identischen Namen wie das Interface bekommen soll.
Der Regelfall dürfte aber eher eine Hierachie sein (Interface List, Klassen LinkedList, AbstractList ....)
Bei einem sauberen Framework sollte der Anwender in der Regel ja nur mit einigen wenigen konkreten Klassen kommunizieren und ansonsten die Interfaces verwenden. Dies wäre ein weiteres Argument die Interfaces "schön" zu benennen und "gebaute" Namen wie das -Impl unter der Haube zu verstecken.

Wie geht ihr denn in euren Projekten damit um?
(Und habe ich irgendwelche Argumente vergessen?)

Gruß
 
Es gibt noch die Variante das Postfix IF anzuhängen.
Ich schreibe Interface ohne beiden. Einerseits da dann jedes Interface bei I eingeordnet wird und nicht bei den zugehörigen Klassen (ein Grund, warum ich Namen oft umdrehe, z. B. Interface Car, Implementation eines "schnellen" Auto - CarFast oder CarFastImpl), andererseits da ich Interface öfters benutzt als Klassen. Nahezu jedes Objekt wird bei mir gegen das Interface programmiert, da finde ich es sinnvoller die Klassen und nicht die Interface zu markieren. Ich finde es auch beim lesen störend.

Andererseits ist es mir auch oft egal, ob ich ein Interface oder eine Klasse zurückbekomme, mir ist nur wichtig was die jeweiligen Methoden machen. Falls ich z. B. den Renderer einer JTabel-Spalte umschreiben will wäre es mir egal, ob TableColumn nun ein Interface oder eine Klasse ist, Hauptsache sie besitzt eine setCellRenderer-Methode.
 
Zuletzt bearbeitet:
seit ich mich mit "stark modularisierter programmierung" beschäftige , also wirklich alles irgendwie in interfaces und module aufspalte , habe ich mich zum persönlichen stil hinleiten lassen eher in die richtung ala "List - LinkedList / ArrayList" zu gehen ...

bei mir wäre dann z.b. das interface einfach schlicht "Module" und die entsprechenden module dann mit sprechenden namen ala "ConnectionHandlerModule" ...

das "-Impl" verwende ich persönlich eher nur wenn ich was mit factories mache ... allerdings nicht immer zwangsweise wenn es vom namen her eindeutig wird ...


folgender absatz soll nur gelesenes sinngemäß wiedergeben, jedoch keine eigene meinungsäußerung darstellen

zur grundsätzlichen diskusion "mit I" oder "ohne I" gibt es auch die meinung das "mit I" eher in die richtung C einzuordnen ist ... und da man sich ja in java normalerweise davon abheben will (gibt ja viele schöne beispiele) es halt üblich ist "ohne I" zu verwenden ... dafür aber dann natürlich eher hin zu "-Impl" was so aus sicht der C'ler wieder als "java-macke" bezeichnet wird wie einige Javaraner halt "mit I" als "C'ler-macke" sehen ...

allgemein würde ich sagen : es ist immer eine design-entscheidung des entwickler(-teams) ... feste vorschriften (siehe conventions) gibt es zu diesem speziellen fall eher weniger bis gar nicht
 
Das I ist meiner Meinung nach ein Codesmell und hat vor Interface-Namen nichts zu suchen. Das Argument, man erkenne sofort Interfaces, ist erstens wertlos, wenn man eine halbwegs moderne IDE verwendet. Zweitens aus objektorientierter Sicht nutzlos, da es für einen Typ egal sein muss, ob er durch ein Interface, eine abstrakte oder konkrete Klasse definiert wurde. Und drittens widersprüchlich zur Java Standard-API, wo die Konvention das I nicht vorschreibt.
Mich erinnert das auch eher an ein Überbleibsel der glücklicherweise außer Mode gekommenen ungarischen Notation.
 

Zurück
Oben