Re: [問題] 請益Spring WEB MVC開發的問題
※ 引述《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
推
09/07 11:09, , 1F
09/07 11:09, 1F
→
09/07 21:25, , 2F
09/07 21:25, 2F
→
09/07 21:31, , 3F
09/07 21:31, 3F
→
09/08 07:52, , 4F
09/08 07:52, 4F
→
09/08 07:53, , 5F
09/08 07:53, 5F
→
09/08 07:53, , 6F
09/08 07:53, 6F
→
09/08 08:06, , 7F
09/08 08:06, 7F
→
09/08 08:09, , 8F
09/08 08:09, 8F
→
09/08 08:12, , 9F
09/08 08:12, 9F
→
09/08 08:14, , 10F
09/08 08:14, 10F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 4 篇):