作者cyclone350 (老子我最神)
看板java
标题Re: [问题] 请益Spring WEB MVC开发的问题
时间Sat Sep 7 10:59:07 2013
※ 引述《ghost3401 (阿hoho)》之铭言:
: 我想请教的是:
: 1. 每个Service 和 DAO 都要先有个空介面,再来实作,
: 最後透过注入的方式於Controller使用;这样做法是以後维护及延展性佳(?)
: 但DAO通常不是写了就写了,需要的话就一直在里面加方法取资料..!?
: 一个DAO用一个介面,CODE中也没有看到重复用同一个DAO介面的;
: 所以在DAO部分,每个DAO使用一介面实作用意是?
: 2. 呈上..Service部分也是一样,目前看到的是
: 每一个Service实作一个介面,不重复
: 没有范例中同是储存体,但写入方法不同的情况;
: 所以DI IOC特性在我这个专案中,WEB MVC带来益处是甚麽?
: 麻烦大家观念指正,感谢!!
虽然已经有人回覆说明,但我想用一个简单的例子来让你理解
首先,我们假设专案里面不用spring,不用空介面,我们开始做专案。
以下是一个 Dao
public class MyDao01 {
...
...
...
public boolean insert(MyEntity1 entity) {
return ORM.insert("blablabla",entity);
}
...
...
...
}
然後我们专案有100个Dao
然後我们的 Service 实作如下
public class MyService {
...
MyDao01 myDao = new MyDao01();
...
...
...
}
於是专案进行的很顺利,某一天专案经理想要软体测试,但是不想要受限於
DB 影响,也就是在每一次 insert 都要回传 true。
於是呢,你的Dao会变这样
public class MyDao01 {
...
...
...
public boolean insert(MyEntity1 entity) {
if(ENV.mode == "test") {
return true;
} else {
return ORM.insert("blablabla",entity);
}
}
...
...
...
}
然後你必须到100个Dao共1000个Method里面加上判断是否为测试环境
这样会造成一种混乱,甚麽混乱呢?
你在 insert 里面居然要判断是否为测试环境,从insert名称里面是判断不出来的
而很多 Bug 就是在这种误解下产生的,试问你在使用别人的程式 api,会把 api
的原始码都看过一遍才用吗?
这种方式,在 clean code 里面是 "逻辑与建构混乱"
解决方法其中之一就是设定一个Dao interface
一个 interface 有两个实作,分别为 Test 跟 非Test
public class MyDao01 implement IMyDao{
...
...
public boolean insert(MyEntity1 entity) {
return ORM.insert("blablabla",entity);
}
...
}
public class MyDao01Test implement IMyDao{
...
...
public boolean insert(MyEntity1 entity) {
return True;
}
...
}
所以只要在侧试时,改掉service就好了
public class MyService {
...
MyDao01 myDao = new MyDao01Test();
...
...
...
}
可是你发现,每次测试仍然需要改动 Service,假设Service有一千个,
每次在测试都必须改 500*2 个 class,这太麻烦了,所以你会改成这样
public class MyService {
...
MyDao01 myDao;
...
...
public void build() {
if(ENV.mode == "test") {
myDao = new MyDao01Test();
} else {
myDao = new MyDao01();
}
}
...
...
}
你多了一个 build,你仍然要在呼叫 Service 时呼叫 build ...
而一定会有人忘记、失误,因为你还是在逻辑中去建构 !!
为了把逻辑跟建构做个分隔,所以有人就想出了 Factory 设计模式
也就是现在 Spring 的方式啦。
剩下的可以去 google 抽象化 java Factory设计模式 之类的
不知道有没有回答到你的疑虑~~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.193.205.223
1F:推 PsMonkey:有有有 [乱入] 09/07 11:09
2F:→ ghost3401:有喔!! 感谢... 以未来发展和改变的弹性上着点 09/07 21:25
3F:→ ghost3401:会再看一下工厂模式 谢谢 09/07 21:31
4F:→ adrianshum:文中说法有误,Spring 重点不在 Factory, 甚至可以和 09/08 07:52
5F:→ adrianshum:Factory 完全没有关系 09/08 07:53
6F:→ adrianshum:(漏了:DI 甚至可以和 Factory 完全没有关系) 09/08 07:53
7F:→ cyclone350:就我的理解,原原PO的方式是用bean Factory生成Dao 09/08 08:06
8F:→ cyclone350:我是对那点做回应的,当然我对spring也没多熟 XD 09/08 08:09
10F:→ cyclone350:Spring 核心容器实作了 IoC,BeanFactory 与 Applicati 09/08 08:14