Ruby和鸭子打字:合同设计不可能吗?
Java 中的方法签名:
public List<String> getFilesIn(List<File> directories)
红宝石中的类似一个
def get_files_in(directories)
在Java的情况下,类型系统为我提供了有关该方法期望和交付的信息。在Ruby的案例中,我不知道我应该传递什么,或者我期望收到什么。
在 Java 中,对象必须正式实现接口。在 Ruby 中,传入的对象必须响应此处定义的方法中调用的任何方法。
这似乎非常成问题:
- 即使有100%准确,最新的文档,Ruby代码也必须基本上公开其实现,从而打破封装。撇开“OO纯度”不谈,这似乎是一场维护噩梦。
- Ruby代码没有让我知道返回了什么;我必须进行本质上的实验,或者阅读代码,找出返回对象将响应的方法。
我不想讨论静态类型与鸭子类型,而是希望了解如何维护一个生产系统,在这个系统中,你几乎没有能力通过合同进行设计。
更新
没有人真正通过这种方法所需的文档来解决方法内部实现的暴露问题。由于没有接口,如果我不需要特定的类型,难道我不必逐项列出我可能调用的每个方法,以便调用方知道可以传入的内容吗?或者这只是一个没有真正出现的边缘案例?