Was kann ich anstelle von Schnittstellen in Ruby (oder einer anderen dynamischen Sprache) verwenden?

9

Mein Ziel ist es, Verträge zwischen Klassen zu definieren.

Ich mag das Entenschreiben und alles, aber ich möchte auch eine Schnittstelle zwischen verschiedenen Ebenen meiner Anwendung definieren, um klar zu definieren, welche Methode von außen aufgerufen werden soll und welche zusätzlichen Methoden von der anderen Ebene nicht verwendet werden sollten .

Zum Beispiel kann ich in Java eine Persistor-Schnittstelle mit Methoden wie get () und save () definieren und dann eine JdbcPersistor-Klasse mit allen Methoden definieren, die ich brauche, um in der Datenbank zu bestehen. Und vielleicht ein anderer RestPersistor mit anderen Methoden zum Speichern auf einem Remote-Restserver.

Ich frage nicht nach Schnittstellen in Ruby, nur um zu wissen, ob es einen ordentlichen Weg gibt, diese Unterscheidung beizubehalten. Ich mag Ruby, aber ich habe nur an kleinen Projekten damit gearbeitet.

Uberto
quelle
Ich denke, das gehört auf StackOverflow ...
Thorsten Müller
2
@thorsten Stack Overflow ist für bestimmte Implementierungsprobleme vorgesehen (dh es gibt ein Problem im Code). Allgemeine Fragen zum Programmdesign finden Sie hier auf Programmers.SE.
@ Mark: Danke für die Korrektur. Ich dachte, es ist zu spezifisch für Ruby (und habe Ubertos letzten Satz verpasst). Also habe ich mein Wissen über die FAQ aktualisiert. (Ich
finde
+1 Ausgezeichnete Frage. Ich bin interessiert, ob es eine andere Möglichkeit gibt, als Tonnen von Dokumentation zu schreiben, zu lesen und auf dem neuesten Stand zu halten oder einige alberne Konventionen zu verwenden, wie z. B. vorangegangene interne Zubehörmethoden mit Unterstrichen oder ähnliches.
Joonas Pulakka
+1 PLT Racket unterstützt übrigens Verträge und ist dynamisch. Es wäre ein interessantes Projekt, etwas Ähnliches wie Ruby hinzuzufügen.
Larry Coleman

Antworten:

5

Dies wurde im Zusammenhang mit C # -Schnittstellen und Ruby on Stackoverflow beantwortet: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .

Zusammenfassend: In Ruby gibt es kein genaues Äquivalent, da die Eingabe von Enten eine formale Schnittstelle unnötig macht. Erwägen Sie stattdessen, die Konformität mit einer "Schnittstelle" oder einem Vertrag zu testen respond_to?.

Corbin März
quelle
2
Ja, aber dies verhindert nicht, dass Code auf die Methode
zugreift, die
2

Einige dynamisch typisierte Sprachen haben Schnittstellen oder ein ähnliches Konzept. Zum Beispiel hat Objective-C Protokolle. Aber die meisten nicht. Um in einer dynamischen Sprache effektiv zu sein, müssen Sie vergessen, was Sie über statisch typisierte Sprachen wissen, und die Dynamik der Sprache berücksichtigen. Dynamisch typisierte Sprachen verzichten im Allgemeinen auf die Verwendung von Schnittstellen.

Mipadi
quelle
1

In Perl 5 stellen sowohl Moose als auch Moo Rollen (oder Merkmale) bereit, die die Implementierung bestimmter Methoden erfordern können. Moose wird auch mit einem Laufzeittypsystem geliefert, mit dem Sie duck_typeeinen Typ definieren können , der Objekte mit den erforderlichen Methoden deklariert.

Rollen werden von den Klassen (oder anderen Rollen) selbst implementiert und bieten auch Implementierung und Verhalten, nicht nur die Schnittstelle. Aber sie behandeln auch (zumindest in Moose) Dinge wie die Erkennung von Methodenkonflikten.

Phaylon
quelle