为什么Ruby人说他们不需要接口?

前端之家收集整理的这篇文章主要介绍了为什么Ruby人说他们不需要接口?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
ruby与其他OOP语言有什么不同(例如: PHP)会使接口无用吗?它有什么替代品吗?

编辑:

一些澄清:

>在其他语言(例如:PHP)中,您不需要“接口”(在代码级别它们不是必需的).您可以使用它们签订合同,以改进软件的架构.因此,肯定’在ruby中你不需要接口/在其他语言中你需要接口,因为XXX’是错误的.
>不,mixins不是接口,它们是完全不同的东西(PHP 5.4实现mixins).你有没有使用过接口?
>是的,PHP是OOP.语言不断发展,欢迎来到现在.

解决方法

嗯,这是一个共识,当一个对象在Ruby中传递时,它不是经过类型检查的. Java和PHP中的接口是一种确认对象符合某个契约或“类型”的方式(因此某些东西可能是Serializable,Authorizable,Sequential以及您想要的任何其他内容).

但是,在Ruby中,没有形式化的合同概念,接口将履行一些有意义的角色,因为在方法签名中不检查接口一致性.例如,参见Enumerable.当您将其混合到对象中时,您正在使用其功能,而不是声明您的对象是可枚举的.让你的对象成为可枚举的唯一好处就是定义了每个(& blk)你自动获得地图,选择和朋友免费.你可以完美地拥有一个实现Enumerable提供的所有方法的对象,但是它不会在模块中混合,它仍然可以工作.

例如,对于Ruby中需要IO对象的任何方法,您可以提供与IO无关的内容,然后它会因错误而爆炸,或者 – 如果您正确实现了IO存根 – 它将正常工作即使您传递的对象未被声明为“IO-ish”.

这背后的想法来自这样一个事实:Ruby中的对象并没有真正美化的哈希表,并且标签被打到它们上(然后有一些额外的标签告诉解释器或编译器这个对象有接口X因此它可以用于上下文Y)但是一个响应消息的封闭实体.因此,如果一个对象响应一个特定的消息,它将完成合同,如果它没有响应该消息 – 那么就会出现错误.

因此缺少接口可以部分地通过模块的存在来补偿(模块可以包含您在不对呼叫者/消费者做出任何类型承诺的情况下达到的功能),部分地由消息传递的传统而不是类型化的dicts来补偿.

你应该观看Jim Weirich的一些演讲,因为他广泛接触这个主题.

猜你在找的Ruby相关文章