论坛首页 Java企业应用论坛

还是没有明白IoC的好处

浏览 58226 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-03-11  
frankensteinlin 写道

原来
public BO{

  public void  checkUser(String userCode) {
    if (###){
    // 如果需要改变A的创建方式,是不是要改BO?
    // 如果类似的地方有100处,是不是全部都要改?
    // 如果这里只有一个setter,哪怕有100个类似的BO
    // A的创建方式改变之后,是不是只需要改变一个地方,不需要改这些BO?
    A  _a= new A();
     _a.sentEmail();
  }
  }
// client just want to check user .
// he do not know whether should sent any mails
client : boInstance.check("001")

现在

public BO{
  // client just want to check user .
// he do not know whether should sent any mails
//? why need I sent
  public void  checkUser(String userCode,A a) {
    if (###){
    // 这里写错了,应该是
    // a.sentEmail();
    A  _a= new A();
     _a.sentEmail();
  }
  }

// client just want to check user .
// he do not know whether should sent any mails
client :
// 根本没有这样一句,client同样通过IoC得到A的引用
// 记着,永远不要让业务代码自己去创建对象

//init component A
A a= new A();  // why need A ?  the client will confused
// 为什么client搞晕了头?是被你搞晕的。
// 明明是BO需要用到A,是BO需要依赖A
// 虽然这种依赖关系仅在一个方法上体现,但逻辑上是BO需要A
// 你偏不肯用IoC给BO提供一个A,结果把client搞乱了
// 你说该怪谁?

boInstance.check("001",a);


0 请登录后投票
   发表时间:2005-03-11  
A a= new A();;  // why need A ?  the client will confused 
boInstance.check("001",a);; 


这样?我觉得必须跳出这种思维!

  饰  男主角
靓女A  饰   女主角
动作:Kiss
造物主:女娲
导演
剧本

我觉得应该区分这些概念,
0 请登录后投票
   发表时间:2005-03-11  
引用

如果你的每个class都是这样,即“只有一个方法需要使用其他组件”,自然没话说,IoC是多余的。

话又说回来,如果设计成“只有一个方法需要使用其他组件”,恐怕你的OOD很成问题。

但是似乎每个class都是这样 即“每个组件都是 class 的成员变量“似乎也不太ooD把(至少从封装性来说吧)

我是在用easyMock的时候注意到ioc的,应为我就遇到了在方法中初始化组件的问题,想了很久,(应为没有地方可是干涉组件的初始化 用来mock),以前的测试用的是dbunit,但是工程大了后,发现一是运行的时间长,而是数据的维护xml 很累。 后来发现了mock的方法,再后来求¥助于ioc ,但是都没有很好的结局方案。

看看大家有什么好的方案
0 请登录后投票
   发表时间:2005-03-11  
“只有一个方法需要使用其他组件”,自然没话说,IoC是多余的

Ioc怎么会多余呢?
Ioc != spring说的Ioc
Ioc != pico说的Ioc
0 请登录后投票
   发表时间:2005-03-11  
frankensteinlin 写道
我是在用easyMock的时候注意到ioc的,应为我就遇到了在方法中初始化组件的问题

public void testBOFunctions(); {
  BO bo = new BO();;
  A a = new A();;
  bo.setA(a);;
  bo.doSomething();;
}

这不是很简单吗?
0 请登录后投票
   发表时间:2005-03-11  
VKing 写道
“只有一个方法需要使用其他组件”,自然没话说,IoC是多余的

Ioc怎么会多余呢?
Ioc != spring说的Ioc
Ioc != pico说的Ioc

恩,“通过方法参数传入依赖组件”叫做type 0 IoC,不过我通常不喜欢这样说。
0 请登录后投票
   发表时间:2005-03-11  
引用

  public void  checkUser(String userCode) {
    if (###){
    // 如果需要改变A的创建方式,是不是要改BO?
    // 如果类似的地方有100处,是不是全部都要改?
    // 如果这里只有一个setter,哪怕有100个类似的BO
    // A的创建方式改变之后,是不是只需要改变一个地方,不需要改这些BO?
    A  _a= new A();
     _a.sentEmail();
  }
  }


首先这个个例子 我用AFacotry来创建 就不需要改变一百个地方了吧
  public void  checkUser(String userCode); { 
    if (###);{ 
   A  _a= AFacotry.getInstance();; 
     _a.sentEmail();; 
  } 
  }


其次客户为什么要知道有个mailCompent存在?如果下次不发mail了? 是不是还要改写所有的客户代码?
0 请登录后投票
   发表时间:2005-03-11  
引用
首先这个个例子 我用AFacotry来创建 就不需要改变一百个地方了吧

这样做,BO需要依赖两个东西:A,AFactory。如果你通过一个setter把A注射进来,那么BO只依赖A,不依赖AFactory。两个依赖和一个依赖哪个好,我觉得是不言自明的。

引用
其次客户为什么要知道有个mailCompent存在?如果下次不发mail了? 是不是还要改写所有的客户代码?

client本来就不需要知道,只有BO自己知道。如果不用A,那么BO一定会修改,那么就是BO依赖A,那么就用一个setter描述这个依赖。这不是很自然的吗?
0 请登录后投票
   发表时间:2005-03-11  
引用

client本来就不需要知道


呢么谁在调用bo.checkUser();方法?
当然是客户,它多传入一个compent A 干什么啊?
引用

A a= new A(); 
boInstance.check("001",a); //修改后a是不需要的


你又转而采用方案一,扩大了A的作用域!封装性的丧失!
引用

public void testBOFunctions() {
  BO bo = new BO();
  A a = new A();
  bo.setA(a);
  bo.doSomething();
}
0 请登录后投票
   发表时间:2005-03-11  
frankensteinlin 写道
你又转而采用方案一,扩大了A的作用域!封装性的丧失!
引用

public void testBOFunctions() {
  BO bo = new BO();
  A a = new A();
  bo.setA(a);
  bo.doSomething();
}

我就不明白封装性丧失在哪里。都是BO这个class依赖A这个interface,请问封装性的区别在哪里?举个例子出来看看。
0 请登录后投票
论坛首页 Java企业应用版

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