发新话题
打印

没有接口的语言中能否IOC?

没有接口的语言中能否IOC?

ruby中没有接口,那么IOC的基础就没有了,也就是用ruby编程不能使用IOC模式。那么用ruby编程如何解决对象依赖问题呢?有什么ruby特有的解决方法么?

TOP

ruby本身就是动态的语言
与java等静态语言不同

所以不需要接口

TOP

引用:
原帖由 james.liu 于 2007-11-14 08:47 发表
ruby中没有接口,那么IOC的基础就没有了,也就是用ruby编程不能使用IOC模式。那么用ruby编程如何解决对象依赖问题呢?有什么ruby特有的解决方法么?
中毒了亚……接口是干什么用的呢?譬如说,这样一个接口

代码
复制内容到剪贴板
代码:
interface IPerson {   
  String getName();   
  String say(String sentence);   
}  
它告诉了你什么?
红魔黑社会二当家

TOP

引用:
原帖由 轩辕易青 于 2007-11-14 08:48 发表

中毒了亚……接口是干什么用的呢?譬如说,这样一个接口

代码interface IPerson {   
  String getName();   
  String say(String sentence);   
}  它告诉了你什么?
糊涂了。各种设计模式都告诉我面向接口编程的优越性,实现与接口分离的重要性。我理解接口是类对外的契约,是类的一部分特征。
这个接口告诉我

代码
复制内容到剪贴板
代码:
if dog instanceof IPserson {   
    dog.say("i am person") ;   
}  

TOP

我的理解是这样的:

在Spring里面,当一个类需要别的类的功能的时候,通过声明set方法,由IoC注入该依赖类,使得类具备了别的类才有的功能;

对于ruby来说,语言本身就有mixin的功能,当一个类需要别的类才有的功能的时候,直接mixin进来就行了;

本质上来说,IoC是用来解决单继承面向对象语言的mixin问题的,但是如果语言本身就有mixin功能的话,那么就不需要IoC了。
从JAVAEYE转移到红魔。。请大家多多关照。

TOP

引用:
这个接口告诉我

代码
if dog instanceof IPserson {   
    dog.say("i am person") ;   
}  
恩……显然你写程序不会这样写。实际上你写的是

代码
复制内容到剪贴板
代码:
// Dog implements IPerson   
    dog.say("i am person") ;  
因为编译器会帮你检查,如果dog没有IPerson接口,这个调用就是编译错误。
引用:
接口是类对外的契约
这是对的。但是可以细究下去:什么契约?实际上这个接口同时扮演着两个契约。第一,它约定了Dog类有哪些方法可以给别人使用,或者说它是一个语义契约;第二,它是一个编译契约,让编译器通过这段程序。这是两件独立的事情,只不过Java用编译器来校验语义契约,所以常常把这两件事混为一谈。

那么Ruby是没有编译过程的,所以Ruby也不需要interface这种语法构造来校验语义契约。Ruby的语义契约风格叫“duck typing”:如果它叫起来像鸭子,走起来像鸭子,那么它就是鸭子,虽然它并没有实现“鸭子”的接口。所以你的这个问题根本就是一个伪问题。按照Ruby的风格,所有的对象都有自己的“接口”(语义契约),要怎么IoC就怎么IoC好了。
红魔黑社会二当家

TOP

其实ruby有一个仿hivemind的IoC容器,叫coplan,不怎么流行。所以我看不出有没有接口和能否IoC有什么必然联系。

IoC我的理解就是把显式的依赖声明转化成隐式的依赖注射。除了robbin说的mix-in, ruby还有很多别的‘悄悄’注入依赖的方法,如open class, class_eval和很多动态反射方法。这些在Rails中被大量使用,所以Rails没有内置IoC容器。
这世界总有你不明白

TOP

引用:
原帖由 redchina 于 2007-11-14 08:52 发表
其实ruby有一个仿hivemind的IoC容器,叫coplan,不怎么流行。所以我看不出有没有接口和能否IoC有什么必然联系。

IoC我的理解就是把显式的依赖声明转化成隐式的依赖注射。除了robbin说的mix-in, ruby还有很多别的‘ ...
这句话彻底点醒了我,我的问题的却是一个伪问题。首先接口和能否IoC没有联系,其次ruby中使用duck type ,等于所有对象都有接口。哈哈,明白了。谢谢各位。

TOP

ruby里面的"接口"和java里的一个最大的区别是,前者是隐式的,后者是显式抽象, 都有各自的好处和不足. 实际上对于任何一个java应用的设计而言,也可以使用这类隐式的方式,在整个层次中不用接口就可以了.
这个可能是一个哲学问题,或者是一个实践取向问题。就像一个人喜欢白色或者蓝色,没什么好讨论的。

TOP

虽然接口在动态语言中失去了大部分存在的意义,不过也不是完全没用的:保持清晰的软件结构,作为文档的一种。尤其在企业级应用中。

TOP

叫起来象鸭子,看起来像鸭子,其实它不是鸭子.是鸭嘴兽。
如果让鸭嘴兽生蛋,那么这就是一个bug.
没有约束,不见得会更自由。

TOP

组件肯定是可以设置成ioc的。不过就是弄几个构造函数参数或者setter就是了。
概念上和java里应该没什么区别。对大型一些的应用,我觉得即使动态语言也是需要依赖反转的。

就是ioc容器的意义变小了。

1。无法auto-wire了。因为没有类型,就没有meta-data,怎么自动wire?
2。像spring这样的,通过xml来配置,可以避免配置改动之后的编译动作。ruby又不需要编译,直接就在源文件里面搞就是了。ioc容器的动态的好处被抵消了。
3。ruby语法足够轻便。xml配置带来的声明性配置的好处也几乎没什么意义了。

TOP

鸭嘴兽确实可以下蛋啊。。。
这世界总有你不明白

TOP

引用:
原帖由 redchina 于 2007-11-14 08:56 发表
鸭嘴兽确实可以下蛋啊。。。
如果让鸭嘴兽下蛋,会Raise MissingMethodException

TOP

ActiveRecord就是一种IoC。

TOP

发新话题