为什么Ruby人说他们不需要接口?
ruby与其他OOP语言有什么不同(例如:
PHP)会使接口无用吗?它有什么替代品吗?
编辑: 一些澄清: >在其他语言(例如:PHP)中,您不需要“接口”(在代码级别它们不是必需的).您可以使用它们签订合同,以改进软件的架构.因此,肯定’在ruby中你不需要接口/在其他语言中你需要接口,因为XXX’是错误的. 解决方法
嗯,这是一个共识,当一个对象在Ruby中传递时,它不是经过类型检查的. Java和PHP中的接口是一种确认对象符合某个契约或“类型”的方式(因此某些东西可能是Serializable,Authorizable,Sequential以及您想要的任何其他内容).
但是,在Ruby中,没有形式化的合同概念,接口将履行一些有意义的角色,因为在方法签名中不检查接口一致性.例如,参见Enumerable.当您将其混合到对象中时,您正在使用其功能,而不是声明您的对象是可枚举的.让你的对象成为可枚举的唯一好处就是定义了每个(& blk)你自动获得地图,选择和朋友免费.你可以完美地拥有一个实现Enumerable提供的所有方法的对象,但是它不会在模块中混合,它仍然可以工作. 例如,对于Ruby中需要IO对象的任何方法,您可以提供与IO无关的内容,然后它会因错误而爆炸,或者 – 如果您正确实现了IO存根 – 它将正常工作即使您传递的对象未被声明为“IO-ish”. 这背后的想法来自这样一个事实:Ruby中的对象并没有真正美化的哈希表,并且标签被打到它们上(然后有一些额外的标签告诉解释器或编译器这个对象有接口X因此它可以用于上下文Y)但是一个响应消息的封闭实体.因此,如果一个对象响应一个特定的消息,它将完成合同,如果它没有响应该消息 – 那么就会出现错误. 因此缺少接口可以部分地通过模块的存在来补偿(模块可以包含您在不对呼叫者/消费者做出任何类型承诺的情况下达到的功能),部分地由消息传递的传统而不是类型化的dicts来补偿. 你应该观看Jim Weirich的一些演讲,因为他广泛接触这个主题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |