測試驅動開發(TDD)其實不是一個新概念,但這種方法論的實質經常被誤解。以我為例,我覺得測試驅動開發就是寫單元測試,對程式碼進行充分測試。其實這是一種對測試驅動開發的一種最常見的誤解,測試驅動開發不僅是強調測試,同時更強調驅動開發。編寫測試案例的目的不僅是進行測試,而且是一種設計,是對功能及介面的設計,而且是以功能或介面使用者的角度來進行設計,而其他方法學中的設計,則是在開發人員角度上的設計,因此測試驅動開發更有利於產生好的設計。
但是僅僅通過測試進行設計,運行測試來保證代碼質量,還不足以產生高質量的軟體產品。測試驅動開發同時也強調重構,就是對程式碼不合理的地方進行重構,而且這個重構在每次編寫測試、開發、驗證進程中都需要進行,由於有測試用例進行保證,我們可以放心大膽的進行重構,而不用擔心會導致意想不到的後果出現。
回到我們的專案中,在MainServlet中,我們實現了全部的業務邏輯,但是我們很快就會意識到,如果所有應用邏輯都寫到這個類別中,那個這個類別將變成一個巨無霸,最終會變得不可維護,因此我們需要將用戶註冊業務邏輯實作放到用戶模組中去。大家可以看到,我們已經開始重構我們的系統了。
首先,我們建立user包,在該包下面建立UserMngr類,因為我們預估,用戶模組除了維護用戶基本信息外,還需要維護用戶群組、用戶級別、用戶積分等信息,如果讓調用者完全了解這些細節資訊是沒有必要的,因此我們在這裡使用了Facade模式,所有對使用者的操作都透過UserMngr來進行。程式碼如下所示:
public class UserMngr { public static long registerUser(Map<String, Object> userInfo) { return 101; } }
我們看到,在這個類別裡,我們只回傳一個值,什麼也沒做,為的是快速驗證我們的重構架構是可以工作的,具體功能可以在以後添加。另外,要注意的是參數項,這裡用的是Map對象,也就是以類似PHP的數組來傳遞參數。在Java中更常見的作為是為此目的設計一個值物件類,但是這經常造成定義許多值物件類,或者由於共用的需要,一個值物件非常龐大,這裡採用Map來傳遞參數省去了這樣的麻煩。
下面在MainServlet中加入對使用者模組呼叫的程式碼:
private void registerUser(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String userName = null; if (request.getParameter("userName") != null) { userName = request.getParameter("userName"); } Map<String, Object> userInfo = new HashMap<String, Object>(); userInfo.put("userName", userName); long userId = UserMngr.registerUser(userInfo); Map<String, Object> model = new HashMap<String, Object>(); model.put("userId", "" + userId); request.setAttribute("model", model); /*this.getServletContext().getRequestDispatcher("/caporder/apply_capital.jsp") .forward(request, response);*/ }
下面運行測試案例,應該可以通過,這證明我這次對架構的重構是成功的。
以上就是新Java運動:測試驅動開發3---用戶註冊2的內容,更多相關內容請關注PHP中文網(www.php.cn)!