public String addUser() {
if(user == null) { return FAIL_NO_USER; } Result result = null; if(Role.ADMIN.equals(user.getRole())) { result = doSomethingForAdmin(user) ; } else { result = doSomethingForOthers(user); } Transaction trans = sess.beginTransaction(); Query query = sess.createQuery("update Result set level = :level"); query.setParameter("level", result.getLevel()); query.executeUpdate(); trans.commit(); sess.close(); return SUCCESS; } |
public String addUser() {
if(user == null) { return FAIL_NO_USER; } Result result = service.process(user); dao.update(result); return SUCCESS; } 在service里: public Result process(User user) { Result result = null; if(Role.ADMIN.equals(user.getRole())) { result = doSomethingForAdmin(user) ; } else { result = doSomethingForOthers(user); } return result; } 在dao里: public void update(Result result) { Transaction trans = sess.beginTransaction(); Query query = sess.createQuery("update Result set level = :level"); query.setParameter("level", result.getLevel()); query.executeUpdate(); trans.commit(); sess.close(); } |
代碼更易讀。每一層的每個(gè)方法的意義和目的更加明確,讀以起來(lái)受的干擾更少。
拆開后的每一層都更容易測(cè)試。
具體如何分層,還需要在開發(fā)中,多多體會(huì),這沒(méi)有絕對(duì)的界限,也許一開始放在action里的頁(yè)面的控制后來(lái)會(huì)上升為業(yè)務(wù)規(guī)則,并被其它地方重用,然后被移入service;也許某一塊對(duì)數(shù)據(jù)的存取也變得非常復(fù)雜,包含了業(yè)務(wù)邏輯,然后被移入service;也有可能發(fā)現(xiàn)以前寫的service根本沒(méi)有想像的那樣的業(yè)務(wù)邏輯,只是幫助做了一些頁(yè)面的流程控制,然后被重構(gòu)成Action的一個(gè)方法,等等。