¿Qué puedo usar en lugar de interfaces en Ruby (o cualquier otro lenguaje dinámico)?

9

Mi objetivo es definir contratos entre clases.

Me gusta escribir pato y todo, pero también me gustaría definir una interfaz entre las diferentes capas de mi aplicación para definir claramente cuáles son los métodos para llamar desde el exterior y cuáles son métodos accesorios que no deberían ser utilizados por la otra capa .

Por ejemplo, en Java puedo definir una interfaz Persistor con métodos como get () y save () y luego definir una clase JdbcPersistor con todos los métodos que necesito para persistir en la base de datos. Y quizás otro RestPersistor con otros métodos para guardar en un servidor remoto.

No estoy pidiendo interfaces en Ruby, solo para saber si hay una forma ordenada de mantener esta distinción. Me gusta Ruby pero solo trabajé en pequeños proyectos con él.

Uberto
fuente
Creo que esto pertenece a StackOverflow ...
thorsten müller
2
@thorsten Stack Overflow es para problemas de implementación específicos (es decir, hay un problema en el código). Las preguntas generales sobre el diseño del programa son sobre el tema aquí en Programmers.SE.
@ Mark: gracias por la corrección. Pensé que era demasiado específico sobre Ruby (y me perdí la última oración de Uberto). Así que actualicé mi conocimiento de las preguntas frecuentes. (Todavía encuentro mi camino por aquí)
thorsten müller
+1 Excelente pregunta. Me interesa si hay otra forma que no sea escribir, leer y mantener actualizadas toneladas de documentación o usar algunas convenciones tontas como los métodos accesorios internos anteriores con guiones bajos o algo así.
Joonas Pulakka
+1 Por cierto, PLT Racket tiene soporte para contratos y es dinámico. Agregar algo similar a Ruby sería un proyecto interesante.
Larry Coleman

Respuestas:

5

Esto se respondió en el contexto de las interfaces de C # y Ruby en stackoverflow: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .

Resumido: no hay un equivalente exacto en Ruby, ya que la escritura de pato hace innecesaria una interfaz formal. En su lugar, considere probar el cumplimiento de una "interfaz" o contrato mediante respond_to?.

Corbin March
fuente
2
sí, pero esto no impide que el código acceda al método que no debería
Uberto
2

Algunos lenguajes de tipo dinámico tienen interfaces o un concepto similar. Por ejemplo, Objective-C tiene protocolos. Pero la mayoría no. Para ser eficaz en un lenguaje dinámico, debe olvidar lo que sabe sobre los idiomas de tipo estático, adoptar la naturaleza dinámica del lenguaje. Los lenguajes de tipo dinámico generalmente evitan el uso de interfaces.

mipadi
fuente
1

En Perl 5, tanto Moose como Moo proporcionan roles (o rasgos) que pueden requerir la implementación de ciertos métodos. Moose también viene con un sistema de tipo de tiempo de ejecución que le permite definir un duck_type, que es un tipo que declara objetos que tienen un conjunto requerido de métodos.

Los roles son implementados por las clases (u otros roles), y también proporcionan implementación y comportamiento, no solo la interfaz. Pero también (al menos en Moose) manejan cosas como la detección de conflictos de métodos.

Phaylon
fuente