Cosa posso usare al posto delle interfacce in Ruby (o in qualsiasi altro linguaggio dinamico)?


9

Il mio obiettivo è definire contratti tra classi.

Mi piace digitare l'anatra e tutto il resto, ma vorrei anche definire un'interfaccia tra i diversi livelli della mia applicazione per definire chiaramente quali sono i metodi da chiamare dall'esterno e quali sono i metodi accessori che non dovrebbero essere utilizzati dall'altro livello .

Ad esempio in Java posso definire un'interfaccia Persistor con metodi come get () e save () e quindi definire una classe JdbcPersistor con tutti i metodi di cui ho bisogno per persistere sul database. E forse un altro RestPersistor con altri metodi per salvare su un restserver remoto.

Non sto chiedendo interfacce in Ruby, solo per sapere se esiste un modo pulito per mantenere questa distinzione. Mi piace Ruby ma ci ho lavorato solo su piccoli progetti.


Penso che questo appartenga a StackOverflow ...
Thorsten Müller,

2
@thorsten Stack Overflow è per problemi di implementazione specifici (ovvero c'è un problema nel codice). Le domande generali sulla progettazione del programma sono in argomento qui su Programmers.SE.

@Mark: grazie per la correzione. Ho pensato che fosse troppo specifico su Ruby (e ho perso l'ultima frase di Uberto). Quindi ho aggiornato la mia conoscenza delle domande frequenti. (
Continuo a orientarmi

+1 Ottima domanda. Sono interessato se c'è altro modo che scrivere, leggere e tenere aggiornati tonnellate di documentazione o utilizzare alcune convenzioni sciocche come i precedenti metodi di accessori interni con caratteri di sottolineatura o qualcosa del genere.
Joonas Pulakka,

+1 A proposito, la racchetta PLT ha il supporto per i contratti ed è dinamica. Aggiungere qualcosa di simile a Ruby sarebbe un progetto interessante.
Larry Coleman,

Risposte:


5

Ciò è stato risposto nel contesto delle interfacce C # e Ruby su stackoverflow: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .

Riassumendo: non esiste un equivalente esatto in Ruby poiché la tipizzazione anatra rende superflua un'interfaccia formale. Considerare invece la verifica della conformità a una "interfaccia" o al contratto mediante respond_to?.


2
si ma questo non impedisce al codice di accedere al metodo che non dovrebbe
Uberto

2

Alcuni linguaggi tipizzati dinamicamente hanno interfacce o un concetto simile. Ad esempio, Objective-C ha protocolli. Ma la maggior parte no. Per essere efficace in un linguaggio dinamico, devi dimenticare ciò che sai delle lingue tipicamente statiche, abbracciare la natura dinamica della lingua. I linguaggi tipizzati dinamicamente generalmente evitano l'uso delle interfacce.


1

In Perl 5, sia Moose che Moo forniscono ruoli (o tratti) che possono richiedere l'implementazione di determinati metodi. Moose viene inoltre fornito con un sistema di tipi di runtime che consente di definire a duck_type, ovvero un tipo che dichiara oggetti con un set di metodi richiesto.

I ruoli sono implementati dalle stesse classi (o altri ruoli) e forniscono anche implementazione e comportamento, non solo l'interfaccia. Ma anche (almeno in Moose) gestiscono cose come il metodo di rilevazione dei conflitti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.