Подпись метода в Java:
public List<String> getFilesIn(List<File> directories)
аналогичный в рубине
def get_files_in(directories)
В случае Java система типов дает мне информацию о том, что метод ожидает и предоставляет. В случае с Руби я не знаю, что мне нужно передать или что я ожидаю получить.
В Java объект должен формально реализовывать интерфейс. В Ruby переданный объект должен отвечать на все методы, вызываемые в методе, определенном здесь.
Это кажется очень проблематичным:
- Даже со 100% точной и актуальной документацией код Ruby должен существенно раскрывать свою реализацию, нарушая инкапсуляцию. Если отбросить "чистоту OO", это могло бы показаться кошмаром обслуживания.
- Код Ruby не дает мне никакого понять, что возвращается; Мне пришлось бы по существу поэкспериментировать или прочитать код, чтобы узнать, на какие методы будет реагировать возвращаемый объект.
Не хочу обсуждать статическую типизацию и утиную типизацию, но хочу понять, как вы поддерживаете производственную систему, в которой у вас почти нет возможности проектировать по контракту.
Обновлять
Никто не обращал внимания на раскрытие внутренней реализации метода посредством документации, необходимой для этого подхода. Поскольку интерфейсов нет, если я не ожидаю определенного типа, разве мне не нужно перечислять каждый метод, который я могу вызвать, чтобы вызывающий знал, что можно передать? Или это просто крайний случай, который на самом деле не подходит?