gpt4 book ai didi

java - ruby 和鸭子打字: design by contract impossible?

转载 作者:IT老高 更新时间:2023-10-28 20:56:04 24 4
gpt4 key购买 nike

Java 中的方法签名:

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

ruby 中类似的一个

def get_files_in(directories)

在 Java 的情况下,类型系统为我提供了有关方法期望和交付的信息。就 Ruby 而言,我知道我应该传递什么,或者我期望收到什么。

在 Java 中,对象必须正式实现接口(interface)。在 Ruby 中,传入的对象必须响应此处定义的方法中调用的任何方法。

这似乎很有问题:

  1. 即使拥有 100% 准确的最新文档,Ruby 代码也必须从本质上公开其实现,从而打破封装。抛开“OO 纯度”不谈,这似乎是一场维护噩梦。
  2. Ruby 代码没有提示我返回了什么;我必须进行实验,或者阅读代码来找出返回的对象会响应哪些方法。

不打算讨论静态类型与鸭子类型,而是希望了解您如何维护一个您几乎没有能力通过契约(Contract)进行设计的生产系统。

更新

没有人真正通过这种方法所需的文档来解决方法内部实现的暴露问题。由于没有接口(interface),如果我不期待特定类型,我是否不必逐项列出我可能调用的每个方法,以便调用者知道可以传入什么?或者这只是一个没有真正出现的边缘案例?

最佳答案

归结为 get_files_in 在 Ruby 中是一个坏名字 - 让我解释一下。

在 java/C#/C++ 中,尤其是在 objective-c 中,函数参数是名称的一部分。在 ruby 中它们不是。
这个花哨的术语是Method Overloading ,它是由编译器强制执行的。

从这些方面考虑,您只是定义了一个名为 get_files_in 的方法。而且您实际上并没有说它应该将文件放入什么。参数不是名称的一部分,因此您不能依赖它们来识别它。
它应该在目录中获取文件吗?驱动器?网络共享?这为它在上述所有情况下工作提供了可能性。

如果你想把它限制在一个目录中,那么考虑到这个信息,你应该调用方法 get_files_in_directory .或者,您可以将其作为 Directory 上的方法类,Ruby already does for you .

关于返回类型,get_files 中隐含您正在返回一个文件数组。您不必担心它是 List<File>ArrayList<File > 等等,因为每个人都只使用数组(如果他们编写了自定义数组,他们将编写它以继承内置数组)。

如果您只想获取一个文件,您可以将其命名为 get_fileget_first_file等等。如果您正在执行更复杂的操作,例如返回 FileWrapper对象而不仅仅是字符串,那么有一个非常好的解决方案:

# returns a list of FileWrapper objects
def get_files_in_directory( dir )
end

无论如何。您不能像在 java 中那样在 ruby​​ 中强制执行契约(Contract),但这是更广泛观点的一个子集,即您不能像在 java 中那样在 ruby​​ 中强制执行 anything。由于 ruby​​ 更具表现力的语法,您可以更清楚地编写类似英语的代码,告诉其他人您的契约(Contract)是什么(从而为您节省数千个尖括号)。

我相信这是一场净胜。你可以利用你新发现的空闲时间写一些specs and tests并在一天结束时推出更好的产品。

关于java - ruby 和鸭子打字: design by contract impossible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/177080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com