Mon objectif est de définir des contrats entre les classes.
J'aime le typage canard et tout mais j'aimerais aussi définir une interface entre les différentes couches de mon application pour définir clairement quelles sont les méthodes à appeler depuis l'extérieur, et quelles sont les méthodes accessoires qui ne devraient pas être utilisées par l'autre couche .
Par exemple, en Java, je peux définir une interface Persistor avec des méthodes comme get () et save (), puis définir une classe JdbcPersistor avec toutes les méthodes dont j'ai besoin pour persister dans la base de données. Et peut-être un autre RestPersistor avec d'autres méthodes pour économiser sur un serveur distant.
Je ne demande pas d'interfaces en Ruby, juste pour savoir s'il y a un moyen soigné de garder cette distinction. J'aime Ruby mais je n'ai travaillé que sur de petits projets avec.
la source
Réponses:
Cela a été répondu dans le contexte des interfaces C # et Ruby sur stackoverflow: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .
En résumé: il n'y a pas d'équivalent exact dans Ruby car la frappe de canard rend inutile une interface formelle. Envisagez plutôt de tester la conformité à une «interface» ou à un contrat à l'aide
respond_to?
.la source
Certaines langues à typage dynamique ont des interfaces ou un concept similaire. Par exemple, Objective-C a des protocoles. Mais la plupart ne le font pas. Pour être efficace dans une langue dynamique, vous devez oublier ce que vous savez sur les langues à typage statique, embrasser la nature dynamique de la langue. Les langages typés dynamiquement évitent généralement l'utilisation d'interfaces.
la source
Dans Perl 5, Moose et Moo fournissent des rôles (ou traits) qui peuvent nécessiter la mise en œuvre de certaines méthodes. Moose est également livré avec un système de type d'exécution qui vous permet de définir un
duck_type
, qui est un type déclarant des objets ayant un ensemble de méthodes requis.Les rôles sont implémentés par les classes (ou d'autres rôles) eux-mêmes, et fournissent également l'implémentation et le comportement, pas seulement l'interface. Mais ils gèrent également (au moins à Moose) des choses comme la détection des conflits de méthode.
la source