Ruby y pato escribiendo: diseño por contrato imposible?

Método de firma en Java:

public List<String> getFilesIn(List<File> directories)

uno similar en rubí

def get_files_in(directories)

En el caso de Java, el sistema de tipos me da información sobre lo que el método espera y entrega. En el caso de Ruby, tengono&nbsp;dar una pista de lo que se supone que debo pasar, o lo que espero recibir.

En Java, el objeto debe implementar formalmente la interfaz. En Ruby, el objeto que se pasa debe responder a cualquier método que se llame en el método definido aquí.

Esto parece muy problemático:

Incluso con una documentación actualizada al 100%, el código de Ruby tiene que exponer esencialmente su implementación, rompiendo la encapsulación. "OO pureza" aparte, esto parece ser una pesadilla de mantenimiento.El código rubí me dano&nbsp;pista de lo que está siendo devuelto; Tendría que experimentar o leer el código para averiguar a qué métodos respondería el objeto devuelto.

No busques debatir la escritura estática frente a la tipografía dinámica, sino la comprensión de cómo mantienes un sistema de producción en el que casi no tienes capacidad de diseño por contrato.

Actualizar

Nadie ha abordado realmente la exposición de la implementación interna de un método a través de la documentación que requiere este enfoque. Como no hay interfaces, si no estoy esperando un tipo en particular, ¿no tengo que detallar todos los métodos a los que podría llamar para que la persona que llama sepa qué se puede pasar? ¿O es solo un caso de borde que realmente no surge?