你寫的這個例子沒有解耦啊! 你不解耦當然就不用建構子。
在程式中使用new去建立新的物件,那之後要替換就會變得困難。
想想看你的dao是new出來的,之後需要mock的時候,你要怎麼將dao替換成mockDAO
然後進行測試呢?
所以一個解決方式就是將需要的程式物件,透過建構子的方式注入,這個方法在單元測試
的書上常常提到
畢竟你自己new出來的物件,就會很難mock,導致單元測試案例不容易撰寫。
依照你的範例,我會在 main class中將所有需要的程式物件都先建立好。
例如下列程式:
public static void main(String[] args) {
Dao11 dao11=new Dao11();
Dao22 dao22=new Dao22();
Dao1 dao1=new Dao1(dao11,dao22);
Service1 service=new Service1(dao1)
}
如果要替換成mockDAO,就統一在main class做操作就可以,不用到各個程式改。
這邊也很像spring的設定檔,
告訴程式目前有dao11,dao22要注入dao1,然後dao1要注入service1,
如果有需要mock或替換程式,就改設定檔就可以了。
但是上述很明顯的問題是,如果一旦Service1需要多個依賴程式,你的建構子就需要一直
變化,並且一直增長。
變成類似 service1 service=new Service1(dao1,dao2,dao3....daoN) 這種寫法。
因此才有了DI框架(例如Spring)來解決這個問題,
他會像main function一樣,先將需要的程式new出來
(例如dao11,dao22) 然後幫你設定到dao1,再將dao1設定到service1裡面。