2017-02-11 1 views
0

Wenn ich das folgende Rubin Modul haben, die eine bestimmte Schnittstelle implementiert (apply in diesem Fall)Ist diese Verwendung von Polymorphismus irreführend und daher schlechtes Design?

module FooApplier 
    def apply 
    foo 
    end 
end 

... und alle anderen „Anwender“ sind Klassen, keine Module, ist es irreführend zu anderen Ingenieuren weitergeben FooApplier an Empfänger, die die apply Schnittstelle erwarten?

Nehmen wir an, die Anwendung mit FooApplier läuft völlig in Ordnung, aber nehmen wir auch an, dass ein anderer Ingenieur sich nicht die Zeit genommen hat, über jedes letzte Byte meines Codes zu strömen. Wenn sie beschließen, etwas wie .new an die FooApplier zu senden, die irgendwie einen subtilen Fehler verursacht, ist die Last auf meinem Entwurf, oder der Ingenieur, um Annahmen zu treffen und zu vernachlässigen, meinen Code zu lesen?

Antwort

2

Die Art und Weise, wie Ihr Modul hier präsentiert wird, funktioniert nicht als Ersatz für eine Klasse. Schauen wir uns eine Klasse zunächst einen Blick:

class BarApplier 
    def apply 
    bar 
    end 
end 

apply hier ist eine Instanzmethode, so aufrufbar auf Instanzen von BarApplier, das heißt BarApplier.new.apply. Dies ist für Ihr Modul nicht möglich.

Es sei denn apply sollte eine Klassen- oder Modulmethode sein, in diesem Fall war Ihre Frage irreführend, da es dann def self.apply sein sollte.

Aber um die allgemeinere Frage zu beantworten, in einer Enten-typed Sprache sind die gesendeten Nachrichten die Schnittstelle. Meiner Meinung nach sollte der Anrufer keine Annahmen über andere Methoden machen. In Ihrem speziellen Fall, wenn apply ist die einzige Methode in der "Vertrag", unter der Annahme, dass die gleiche Entität auch auf new reagiert ist meiner Meinung nach ungültig.

Verwandte Themen