Ich arbeite in PHP, und das Konzept der Schnittstellen scheint mir ein wenig nutzlos hier. Aus dem Lesen verstehe ich, dass Schnittstellen Teil von "Design by Contract" sind, aber ohne zumindest eine Rückkehr eines Typs einer bestimmten Art zu garantieren, gibt es wirklich keinen Vertrag. Es scheint, als wäre es ein Vertrag, der lautet: "Wir stimmen zu, Folgendes zu tun: ''" - Es gibt keine Bedingungen der Vereinbarung.Warum Interfaces in dynamischen/locker typisierten Sprachen?
Wenn ich eine Garantie haben möchte, dass ein Objekt eine Methode hat, scheint es nicht so, dass Schnittstellen besonders nützlich sind. Wenn ich versuche, eine Methode aufzurufen, die ein Objekt nicht hat, bekomme ich einen Fatalen Fehler, also finde ich ziemlich schnell heraus, dass diese Klasse keine Methode mit diesem Namen hat. Wenn ich klug sein und vorher prüfen möchte, ob eine Klasse eine Methode hat, dann überprüft die Schnittstelle, und zu sehen, ob das Objekt diese Schnittstelle implementiert, scheint mir nicht mehr Zeit zu sparen, als nur dieses Objekt direkt zu überprüfen (was ich tun würde) jedenfalls um zu sehen, ob die Klasse diese Methode hatte, ungeachtet der Schnittstellen, die sie implementiert hat oder nicht implementiert hat.
Mit anderen Worten, nur weil ich eine Reihe von Methoden, die bestimmte Namen haben, das garantiert mir keine bestimmte Verhalten. Wenn ich eine Rückgabe einer Variablen eines bestimmten Typs garantiere, habe ich zumindest eine Ahnung davon, was die Ausgabe sein würde, und ich kann Code schreiben, der ein Objekt mit dieser Schnittstelle verwendet, weil ich weiß, was ich herausbekomme davon. Wenn es eine Zeichenkette zurückgibt, kann ich weiter mit mindestens der Gewissheit kodieren, dass ich nachher mit einer Zeichenkettenausgabe handle. So ist mir zumindest ein gewisses Verhalten garantiert, wenn ein Rückgabetyp angegeben ist. Garantiert das Verhalten Teil der Schnittstellen oder nicht?
Das einzige, was mir einfällt, ist, dass wenn ich Code schreibe, es als eine Post-it-Notiz für mich dient, um bestimmte Methoden zu erstellen, wenn ich diese Klasse später schreibe. Es scheint mehr wie ein Gerüst zu sein, wenn ich den Code schreibe; Ich sehe keinen großen Nutzen daraus, wenn ich es tatsächlich benutze. Es ist also mehr für mich, beim Erstellen von Klassen den Standard einzuhalten, als wenn ich sie schreibe. Dieser Vorteil scheint im Konzept des Vertragsdesigns nicht wirklich berücksichtigt zu werden.
Welchen Nutzen (n) haben Sie eigentlich von der Verwendung einer Schnittstelle in dynamischen/losen Sprachen wie PHP? Sind sie großartig oder ist es etwas, das robustere OO-Sprachen implementieren, also implementiert PHP es auch?
Pedantische Anmerkung: PHP ist nicht 'Untyped'. Es ist dynamisch und locker typisiert. Es gibt einen RIESIGEN Unterschied ... – ircmaxell
Das ist nicht so pedantisch, wenn es einen großen Unterschied macht :) Fixed. – user151841
Was ist, wenn Ihre Software erfordert, dass eine Methode eine Primzahl oder eine US-ASCII-Zeichenfolge zurückgibt? Nur weil eine Schnittstelle diesen Teil des "Vertrags" nicht spezifizieren kann und diese Dinge Ihr Programm abwerfen können, bedeutet das, dass Schnittstellen in allen Sprachen völlig nutzlos sind? Auch in stark typisierten Sprachen erzeugt ein Typ-Mismatch einen Fehler. Sie könnten also genauso leicht fragen, warum Sie in stark typisierten Sprachen einen Rückgabetyp in Ihrer Oberfläche angeben müssen. –