星期六, 2月 12, 2005

好久沒寫啦,一堆 Spring 雜感

真是有夠久沒寫~~ 現在想想大概是因為後來的文章越寫越大篇,料雖然很多,但是反而變成寫BLOG 的阻力... 下次該寫一點點就好囉。

最近發生很多事:
  • 我 們的系統上線了~ 大概已經過了一個月吧,這個系統開發時導入 Unit Test 與 Continuous Integration。目前累積了大概 1500 個 unit test 吧,改需求/新增功能 都難不倒我們。 team 的人都說還好有 Test 這個 "安全網" ,不然喔上線後,不僅改功能無望,搞不好還得加班熬夜修東修西的。當初我嘗到 test 的甜頭後,便在 team 裡面不斷的 "叫囂" 說要大家寫 test ,現在總算是開花結果了。(個人用了很多嚴重的字眼逼大家寫… 還好結果不錯,不然我會被公X到死~~)
  • 1500 個 unit test 要 run 多久? 加上 database 的 rebuild 大概要 30~40 分鐘。這真的太久囉。原因是我們用 ObjectMother 太多了,這個 ObjectMother 大多跟 DB (hibernate) 綁在一起,所以花了很多無謂的時間在 load hibernate configuration/insert/delete data上 ( ObjectMother with Hibernate 這個用起來太方便了,導致很多 test 都扯到 DB )。下個專案要多多改進 -- DB layer 還是要盡可能的 decouple from business logic啊
  • bug 的數量與TestCase的數量成反比!還有什麼比這個更有說服力呢? Unit Test Rules !

oxoxoxoxoxoxoxo Spring 分隔線 xoxoxoxoxoxoxoxoxo

這 個系統後來我導入了 Spring... (擅自導入到我負責的 module...)。當初因為它又需要額外的 xml 檔,使人望之卻步 (refactoring 的大敵 !) 嘗試用了一個月,只能說真是相見恨晚啊。Spring 真的是 J2EE 開發者的天堂。Spring 的 IoC 只是個吸引人的點子 (別家的用起來反而比較簡單) 真正誘人的是它幾乎整合了所有 J2EE 開發的所有工具:新增 (如 declarative Transaction)、修正 (如 HibernateException 變 unchecked)、簡化 (如 quautz scheduler)、超輕量 (一個 container 居然只要幾個 xml 檔,真是太扯囉)、潛力無窮 (AOP)… etc 太強啦:它可不只是超級萬能瑞士刀,它是小叮噹的四次元口袋!拿得出一卡車的工具且還比瑞士刀輕 !! 哇靠這種好康上哪找啊!

Spring + Hibernate == 現在寫程式的人真幸福

把 Spring 拿去跟 picocontainer / hivemind 去比的簡直是頭殼壞掉,這就像是拿 tomcat 和 oracle db 比一樣荒謬。

現 在還沒嘗試的還有 Spring web,不過好不容易我們的 team 都已經搞清楚 Struts 的脾氣了 (真的是愛恨交加)。如果真要再花半年 Train Spring web,寧可勸大家改學 Tapestry 還比較划算。啊~~~ 真是懷念以前寫 Tapestry 的時光啊。anyway 來看看最近 K 的書吧:

Spring 書推薦:
  • J2EE without EJB (不是全名,請自行查 google) 這本是founder Rod Johnson 自個兒寫的,講了好多大道理啊。前半本大說 EJB 的不是,舉證例例,我是看了一點就狂睡了,基本上嘗過 EJB 的苦頭,就不必再多花時間囉,可直接跳到後半看 Spring。這本是講 Spring 的原理最詳細的一本,時間夠的話,這本是第二本必看的書。
  • Spring in Action, in Action 系列再下一成,這本是Spring 書中最簡單的一本,推薦入門者先看這一本。用 Spring 該具備的觀念都有提到,Spring 所有重要的功能都有涉獵。我常常就直接拿他的範例 code 給它這麼一 copy/past,就直接可用了。(其實也是因為 Spring的設定太簡單囉)
  • Spring Live (Matt Raible 著) appfuse 的開發者。這本是 source beat 的電子書 (只出電子版) ,更特別的是出版後一年之內作者還會追加章節,現在出到第11章了。這本是最 practical 的一本。帶你用TDD 的方式使用 Spring,而且提供 Spring整合其他 framework 的各種作法 (超級多),還有很多實用的技巧。作者本身也是邊學邊寫完這一本的,所以很多大家會遇到的問題他都先碰到了。老實說作者原意是將這本寫成入門書的,其實定 位也是啦,只是他用的概念/framework 實在太多太廣 (光是 TDD 的開發方式就會讓有些人進不了門) 我覺得還是要在 java 界混久一點的人才適合看,作者的 blog 還蠻受歡迎,大家有空可以去瞧瞧。
  • Pro Spring... 剛出… 還沒入手… 有800頁厚
  • Professional Java Development with the Spring Framework 還沒出,不過是 Rod 那群人寫的,這一定是要入手的啦
  • Better, Faster, Lighter Java (Bruse Tate 著,bitter java/ejb 作者) 很小本,純講理念的居多.... 我承認我看不去...
一 個技術到底受不受歡迎,看廣告、看補習班、或是看 forum (TheServerSide...) 講的天花亂墜都不準。看市面上書的數量最準。用的人多了才會有人肯寫書,Struts 雖然不是什麼 jxxx standard,大伙抱怨也不少,可是書多到嚇死人。現在 Spring 相關書藉一直增加,再過不久就要變 de facto standard 囉,先學先賺先享受。

oxoxoxoxoxoxoxo Spring IoC 分隔線 xoxoxoxoxoxoxoxoxo


回 到 Spring 的正題,IoC。導入 IoC container 到系統... 目前我的感覺是有好有壞,好是好在一旦使用 IoC 的方式開發,程式會漸漸 decouple 並且 high coherence (這個詞真難翻,意思是模組的凝聚力高,該自己負責的功能就自己負責,不會跟其他模組混在一起。跟decouple的意思差不多) 壞是壞在很容易掉入 AnemicDomainModel 的陷阱。用了 Spring,物件該有的功能/行為,一不小心就會寫到最外面那一層的Service (facade)去了,原因是:
  • service 那一層通常是 injection 的起點,這一層在整個 Application 中是一定要在 Spring 內設定的 (因為通常也是 Transaction 的 boundary )
  • 再 加上 entity (通常是 PO, persistence object) 很難做 IoC ,為了能讓各種功能 "外包" 出去,自然而然的便在 service 層大興土木 (entity 大多是由 "new" 及 hibernate load from db 時產生的,這兩種生成方式不受 Spring 管,而且通常 entity 數量很大,讓所有 entity inject 相同的 bean 通常會有 performance 的考量) 。
  • 最後由於 Spring 建議 bean 最好是在 container 裡是 singleton (這點沒錯)所以最好 bean 都要 thread safe,而最簡單的 thread safe 的寫法就是將 object 寫成 stateless...
這樣的結果是? -- 會變成 Service 外掛很多的 statless util ,然後 entity 本身只剩下 getter/setter。變成只是個好看一點的 Transaction Scripts 。domain object (entity) 連個行為都沒了,變的很 "貧血"。

為此,又回去翻 domain 聖經 "DDD" (Domain Driven Design) ,有了一些新的感想:原來關鍵還是在 OOP 的設計 (value object 和 entity 合作)。這個等到有比較具體的想法和實際做過後再提吧。
 
 

0 Comments:

張貼留言

<< Home