Que puis-je utiliser à la place des interfaces en Ruby (ou tout autre langage dynamique)?


9

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.


Je pense que cela appartient à StackOverflow ...
thorsten müller

2
@thorsten Stack Overflow est pour des problèmes d'implémentation spécifiques (c'est-à-dire qu'il y a un problème dans le code). Les questions générales de conception de programme sont sur le sujet ici sur Programmers.SE.

@Mark: merci pour la correction. Je pensais que c'était trop spécifique sur Ruby (et j'ai raté la dernière phrase d'Uberto). J'ai donc mis à jour ma connaissance de la faq. (Je trouve toujours mon chemin ici)
Thorsten Müller

+1 Excellente question. Je suis intéressé s'il existe un autre moyen que d'écrire, de lire et de tenir à jour des tonnes de documentation ou d'utiliser certaines conventions loufoques telles que les méthodes d'accessoires internes précédentes avec des traits de soulignement ou quelque chose comme ça.
Joonas Pulakka

+1 Soit dit en passant, PLT Racket prend en charge les contrats et est dynamique. Ajouter quelque chose de similaire à Ruby serait un projet intéressant.
Larry Coleman

Réponses:


5

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?.


2
oui mais cela n'empêche pas le code d'accéder à la méthode qu'il ne devrait pas
Uberto

2

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.


1

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.