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