O que posso usar em vez de interfaces em Ruby (ou qualquer outra linguagem dinâmica)?

9

Meu objetivo é definir contratos entre classes.

Eu gosto de digitar duck e tudo, mas também gostaria de definir uma interface entre diferentes camadas do meu aplicativo para definir claramente qual é o método a ser chamado a partir do externo e quais são os métodos acessórios que não devem ser usados ​​pela outra camada .

Por exemplo, em Java, posso definir uma interface Persistor com métodos como get () e save () e, em seguida, definir uma classe JdbcPersistor com todos os métodos necessários para persistir no banco de dados. E talvez outro RestPersistor com outros métodos para salvar em um restserver remoto.

Não estou pedindo interfaces em Ruby, apenas para saber se existe uma maneira elegante de manter essa distinção. Eu gosto de Ruby, mas trabalhei apenas em pequenos projetos.

Uberto
fonte
Eu acho que isso pertence a StackOverflow ...
Thorsten Müller
2
@thorsten Stack Overflow é para problemas específicos de implementação (ou seja, há um problema no código). Perguntas gerais sobre o design do programa estão no tópico aqui no Programmers.SE.
@ Mark: obrigado pela correção. Eu pensei que era muito específico em Ruby (e perdi a última frase de Uberto). Então, atualizei meus conhecimentos sobre as perguntas frequentes. (Ainda encontrar meu caminho de volta aqui)
Thorsten Müller
+1 Excelente pergunta. Estou interessado em saber se existe outra maneira de escrever, ler e manter toneladas de documentação atualizadas ou usar algumas convenções engraçadas, como métodos de acessórios internos anteriores com sublinhados ou algo assim.
Joonas Pulakka
+1 A propósito, o PLT Racket tem suporte para contratos e é dinâmico. Adicionar algo semelhante ao Ruby seria um projeto interessante.
Larry Coleman

Respostas:

5

Isso foi respondido no contexto de interfaces C # e Ruby no stackoverflow: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .

Resumido: não existe um equivalente exato no Ruby, pois a digitação com patos torna desnecessária uma interface formal. Em vez disso, considere testar a conformidade com uma "interface" ou contrato usando respond_to?.

Março de Corbin
fonte
2
sim, mas isso não está impedindo o código para o método de acesso que não deveria
Uberto
2

Algumas linguagens de tipo dinâmico têm interfaces ou um conceito semelhante. Por exemplo, Objective-C possui protocolos. Mas a maioria não. Para ser eficaz em uma linguagem dinâmica, você precisa esquecer o que sabe sobre linguagens de tipo estaticamente, abraçar a natureza dinâmica da linguagem. Linguagens tipicamente dinamicamente evitam o uso de interfaces.

mipadi
fonte
1

No Perl 5, o Moose e o Moo fornecem funções (ou características) que podem exigir a implementação de certos métodos. O Moose também vem com um sistema de tipo de tempo de execução que permite definir a duck_type, que é um tipo que declara objetos com um conjunto de métodos necessário.

As funções são implementadas pelas próprias classes (ou outras funções) e também fornecem implementação e comportamento, não apenas a interface. Mas eles também (pelo menos no Moose) lidam com coisas como a detecção de conflitos de métodos.

phaylon
fonte