锁定老帖子 主题:还是没有明白IoC的好处
精华帖 (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); |
|
返回顶楼 | |
发表时间:2005-03-11
A a= new A();; // why need A ? the client will confused boInstance.check("001",a);; 这样?我觉得必须跳出这种思维! 你 饰 男主角; 靓女A 饰 女主角; 动作:Kiss; 造物主:女娲 导演 剧本 我觉得应该区分这些概念, |
|
返回顶楼 | |
发表时间:2005-03-11
引用 如果你的每个class都是这样,即“只有一个方法需要使用其他组件”,自然没话说,IoC是多余的。 话又说回来,如果设计成“只有一个方法需要使用其他组件”,恐怕你的OOD很成问题。 但是似乎每个class都是这样 即“每个组件都是 class 的成员变量“似乎也不太ooD把(至少从封装性来说吧) 我是在用easyMock的时候注意到ioc的,应为我就遇到了在方法中初始化组件的问题,想了很久,(应为没有地方可是干涉组件的初始化 用来mock),以前的测试用的是dbunit,但是工程大了后,发现一是运行的时间长,而是数据的维护xml 很累。 后来发现了mock的方法,再后来求¥助于ioc ,但是都没有很好的结局方案。 看看大家有什么好的方案 |
|
返回顶楼 | |
发表时间:2005-03-11
“只有一个方法需要使用其他组件”,自然没话说,IoC是多余的 Ioc怎么会多余呢? Ioc != spring说的Ioc Ioc != pico说的Ioc |
|
返回顶楼 | |
发表时间:2005-03-11
frankensteinlin 写道 我是在用easyMock的时候注意到ioc的,应为我就遇到了在方法中初始化组件的问题
public void testBOFunctions(); { BO bo = new BO();; A a = new A();; bo.setA(a);; bo.doSomething();; } 这不是很简单吗? |
|
返回顶楼 | |
发表时间:2005-03-11
VKing 写道 “只有一个方法需要使用其他组件”,自然没话说,IoC是多余的 Ioc怎么会多余呢? Ioc != spring说的Ioc Ioc != pico说的Ioc 恩,“通过方法参数传入依赖组件”叫做type 0 IoC,不过我通常不喜欢这样说。 |
|
返回顶楼 | |
发表时间: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了? 是不是还要改写所有的客户代码? |
|
返回顶楼 | |
发表时间:2005-03-11
引用 首先这个个例子 我用AFacotry来创建 就不需要改变一百个地方了吧
这样做,BO需要依赖两个东西:A,AFactory。如果你通过一个setter把A注射进来,那么BO只依赖A,不依赖AFactory。两个依赖和一个依赖哪个好,我觉得是不言自明的。 引用 其次客户为什么要知道有个mailCompent存在?如果下次不发mail了? 是不是还要改写所有的客户代码?
client本来就不需要知道,只有BO自己知道。如果不用A,那么BO一定会修改,那么就是BO依赖A,那么就用一个setter描述这个依赖。这不是很自然的吗? |
|
返回顶楼 | |
发表时间: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(); } |
|
返回顶楼 | |
发表时间: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,请问封装性的区别在哪里?举个例子出来看看。 |
|
返回顶楼 | |