2017-02-11 2 views
0

Si je le module Ruby suivant qui implémente une interface particulière (apply dans ce cas)Cette utilisation du polymorphisme est-elle trompeuse et par conséquent mauvaise conception?

module FooApplier 
    def apply 
    foo 
    end 
end 

... et tous les autres « Applicateurs » sont des classes, pas des modules, est-il trompeur d'autres ingénieurs de passer aux récepteurs qui attendent l'interface apply? Supposons que l'application utilisant FooApplier fonctionne parfaitement bien, mais supposons également qu'un autre ingénieur n'a pas pris le temps de déverser tous les derniers octets de mon code. S'ils décident d'envoyer quelque chose comme .new au FooApplier qui induit d'une certaine manière un bug subtil, est-ce le fardeau de ma conception, ou l'ingénieur pour faire des suppositions et négliger de lire mon code?

Répondre

2

De la façon dont votre module est présenté ici, il ne fonctionnera pas comme un remplaçant pour une classe. Regardons une première classe:

class BarApplier 
    def apply 
    bar 
    end 
end 

apply ici est une méthode d'instance, donc appelable sur les instances de BarApplier, à savoir BarApplier.new.apply. Cela ne sera pas possible pour votre module.

À moins bien sûr apply était censé être une méthode de classe ou de module, auquel cas votre question était trompeuse car elle devrait alors être def self.apply.

Mais pour répondre à la question plus générale, dans un langage de type canard les messages envoyés sont l'interface. À mon avis, l'appelant ne devrait pas faire d'hypothèses sur d'autres méthodes étant présents. Dans votre cas, si apply est la seule méthode dans le "contrat", en supposant que la même entité répond également à new est invalide à mon avis.