论坛首页 编程语言技术论坛

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

浏览 11173 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-06-22  
ruby中没有接口,那么IOC的基础就没有了,也就是用ruby编程不能使用IOC模式。那么用ruby编程如何解决对象依赖问题呢?有什么ruby特有的解决方法么?
   发表时间:2006-06-22  
ruby本身就是动态的语言
与java等静态语言不同

所以不需要接口
0 请登录后投票
   发表时间:2006-06-22  
javavsnet 写道
ruby中没有接口,那么IOC的基础就没有了,也就是用ruby编程不能使用IOC模式。那么用ruby编程如何解决对象依赖问题呢?有什么ruby特有的解决方法么?

中毒了亚……接口是干什么用的呢?譬如说,这样一个接口
interface IPerson {
  String getName();;
  String say(String sentence);;
}

它告诉了你什么?
0 请登录后投票
   发表时间:2006-06-22  
gigix 写道

中毒了亚……接口是干什么用的呢?譬如说,这样一个接口
interface IPerson {
  String getName();;
  String say(String sentence);;
}

它告诉了你什么?

糊涂了。各种设计模式都告诉我面向接口编程的优越性,实现与接口分离的重要性。我理解接口是类对外的契约,是类的一部分特征。
这个接口告诉我
if dog instanceof IPserson {
    dog.say("i am person"); ;
}
0 请登录后投票
   发表时间:2006-06-22  
我的理解是这样的:

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

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


本质上来说,IoC是用来解决单继承面向对象语言的mixin问题的,但是如果语言本身就有mixin功能的话,那么就不需要IoC了。
0 请登录后投票
   发表时间:2006-06-22  
javavsnet 写道
这个接口告诉我
if dog instanceof IPserson {
    dog.say("i am person"); ;
}

恩……显然你写程序不会这样写。实际上你写的是
// Dog implements IPerson
    dog.say("i am person"); ;

因为编译器会帮你检查,如果dog没有IPerson接口,这个调用就是编译错误。
javavsnet 写道
接口是类对外的契约

这是对的。但是可以细究下去:什么契约?实际上这个接口同时扮演着两个契约。第一,它约定了Dog类有哪些方法可以给别人使用,或者说它是一个语义契约;第二,它是一个编译契约,让编译器通过这段程序。这是两件独立的事情,只不过Java用编译器来校验语义契约,所以常常把这两件事混为一谈。

那么Ruby是没有编译过程的,所以Ruby也不需要interface这种语法构造来校验语义契约。Ruby的语义契约风格叫“duck typing”:如果它叫起来像鸭子,走起来像鸭子,那么它就是鸭子,虽然它并没有实现“鸭子”的接口。所以你的这个问题根本就是一个伪问题。按照Ruby的风格,所有的对象都有自己的“接口”(语义契约),要怎么IoC就怎么IoC好了。
0 请登录后投票
   发表时间:2006-06-23  
其实ruby有一个仿hivemind的IoC容器,叫coplan,不怎么流行。所以我看不出有没有接口和能否IoC有什么必然联系。

IoC我的理解就是把显式的依赖声明转化成隐式的依赖注射。除了robbin说的mix-in, ruby还有很多别的‘悄悄’注入依赖的方法,如open class, class_eval和很多动态反射方法。这些在Rails中被大量使用,所以Rails没有内置IoC容器。
0 请登录后投票
   发表时间:2006-06-23  
cookoo 写道
我看不出有没有接口和能否IoC有什么必然联系。

这句话彻底点醒了我,我的问题的却是一个伪问题。首先接口和能否IoC没有联系,其次ruby中使用duck type ,等于所有对象都有接口。哈哈,明白了。谢谢各位。
0 请登录后投票
   发表时间:2006-06-23  
ruby里面的"接口"和java里的一个最大的区别是,前者是隐式的,后者是显式抽象, 都有各自的好处和不足. 实际上对于任何一个java应用的设计而言,也可以使用这类隐式的方式,在整个层次中不用接口就可以了.
这个可能是一个哲学问题,或者是一个实践取向问题。就像一个人喜欢白色或者蓝色,没什么好讨论的。
0 请登录后投票
   发表时间:2006-06-24  
虽然接口在动态语言中失去了大部分存在的意义,不过也不是完全没用的:保持清晰的软件结构,作为文档的一种。尤其在企业级应用中。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics