Peter_2498 schrieb:
Ich versuche mir gerade klar zu machen, wie ich das in Einklang bringe mit dem Konzept, dass Interfaces möglichst viel Komplextität eines Moduls "verstecken" sollten oder möglichst simpel sein sollten.
Nun, noch minimalistischer als das hier geht es ja fast nicht.
Java:
public interface Logger {
void log(String message);
}
Peter_2498 schrieb:
Man möchte z.B. nicht, dass jemand bei einer Funktion zig komplizierte Parameter angeben muss, die man im Normalfall zu 99% nicht braucht oder so ähnlich.
Das ist meiner Meinung nach nicht Aufgabe eines Interfaces. Da gibt es andere, deutlich besser geeignete Methoden. Du kannst dir zum Beispiel das Builder Pattern oder überladene Funktionen ansehen.
Peter_2498 schrieb:
Wenn wir jetzt allerdings zum Interface als Programmierkonstrukt wie in Java schauen, dann sieht das für mich nach einer etwas abstrakteren Methode aus, eine Art Interface für ein ganzes Modul zu kreieren. Ich will mich jetzt bezüglich deines Beispiels in die Perspektive des Programmierers versetzen, der das Programm fürs Protokoll schreibt und dafür einen Logger braucht. Und er sieht direkt: "Aha, wir haben hier also ein Logger Interface, welches mir alle benötigten Funktionen bereitstellt, die ich benötige. Da ConsoleLogger und FileLogger das implementiert haben, brauche ich mir die beiden anderen Klassen überhaupt nicht mehr genauer anzusehen, da sie diese Funktionalität besitzen müssen". In dem Sinne sehe ich dieses Programmierkonstrukt "Interface" als ein abstrakteres Interface in dem Sinne, dass es mir schnell zeigt, was ich in dem jeweiligen Modul mehr oder weniger von der Funktionalität zu erwarten habe, ohne dass ich die ganzen mögliche Klassen des Moduls nach den Funktionalitäten durchsuchen muss. Damit ist das ebenfalls eine gute Methode Implementation zu "verstecken", wenn jemand das Modul nur "nutzt".
Kann man das alles ungefähr so sehen?
Ich glaube, du hängst dich ein wenig zu sehr an dem Verstecken auf. Ein Interface verbirgt zwar definitiv das Innenleben der Implementierung, aber das ist meiner Meinung nicht die Aufgabe eines Interfaces.
Die Aufgabe eines Interface ist wirklich nur die Definition von Aufgaben und Fähigkeiten.
Stell dir vor, du arbeitest in einer Software-Schmiede. Dein Product-Analyst kommt zu dir und sagt:
"Hey, Peter, unsere Kundschaft hätte gerne die Möglichkeit, unsere Produkte anstatt in dem bereits existierenden Katalog auch über eine filterbare Suche finden zu können. Kümmerst du dich da drum?"
Du, als erfahrener Entwickler weißt natürlich, das wird wieder mal eine etwas größere Operation, also setzt du dich mit deinem UX Team zusammen. Mit dem tüfteltst du jetzt aus, wie genau das Ganze am Ende in eurem UI aussehen soll.
Da du in einem Team arbeitest, was einigermaßen Ahnung hat von dem, was es tut, habt ihr in der Vergangenheit darauf geachtet, euer Frontend (Benutzeroberfläche) und euer Backend (Geschäftslogik) voneinander zu trennen. Also packst du dir den Programmierer aus deinem Team, von dem du weißt, dass er sich gut mit dem Frontend auskennt, weil du selbst eher der Backend Mensch bist.
Ihr macht euch also einen Kaffee und denkt drüber nach, was das UI braucht, um ordentlich funktionieren zu können und schreibt zusammen ein
Interface, welches definiert, was das Backend liefern muss.
Dein Frontend Programmierer und du selbst seid glücklich, weil ihr mit dem Arbeiten anfangen könnt. Er weiß, was du liefern wirst und es ist ihm komplett egal, wie du das anstellst. Du weißt, was du liefern musst.
Dies war ein Beispiel, wann ein Interface innerhalb eines Projektes benutzt wird. Genauso kann es natürlich auch benutzt werden, um Endbenutzern Funktionalität anzubieten. Das kann man hier zum Beispiel sehr gut sehen:
https://esi.evetech.net