今天咱們說說參數校驗和國際化,這些代碼沒有什麼技術含量,卻大量充斥在業務代碼上,極可能業務代碼只有幾行,參數校驗代碼卻有十幾行,很是影響代碼閱讀,因此頗有必要把這塊的代碼量減下去。java
今天的目的主要是把以前例子裏面的和業務無關的國際化參數隱藏掉,以及如何封裝好校驗函數。spring
今天累,少說話多貼代碼,先看對比圖,修改前:windows
service:cookie
修改後:ide
service:函數
Controll的非業務代碼如何去掉參考個人編碼習慣 - Controller規範,下面說說去掉Local參數。工具
強調一下:業務代碼裏面不要出現和業務無關的東西,如local,MessageSource 。性能
去掉國際化參數仍是使用的技術仍是ThreadLocal。國際化信息能夠放好幾個地方,但建議不要放在每個url上,除了比較low還容易出不少其餘問題。這裏演示的是放在cookie上面的例子:google
UserUtil:編碼
public class UserUtil { private final static ThreadLocal<String> tlUser = new ThreadLocal<String>(); private final static ThreadLocal<Locale> tlLocale = new ThreadLocal<Locale>() { protected Locale initialValue() { // 語言的默認值 return Locale.CHINESE; }; }; public static final String KEY_LANG = "lang"; public static final String KEY_USER = "user"; public static void setUser(String userid) { tlUser.set(userid); // 把用戶信息放到log4j MDC.put(KEY_USER, userid); } public static String getUser() { return tlUser.get(); } public static void setLocale(String locale) { setLocale(new Locale(locale)); } public static void setLocale(Locale locale) { tlLocale.set(locale); } public static Locale getLocale() { return tlLocale.get(); } public static void clearAllUserInfo() { tlUser.remove(); tlLocale.remove(); MDC.remove(KEY_USER); } }
CheckUtil,這裏須要獲得用戶的語言:
package plm.common.utils; import org.springframework.context.MessageSource; import plm.common.exceptions.CheckException; public class CheckUtil { private static MessageSource resources; public static void setResources(MessageSource resources) { CheckUtil.resources = resources; } public static void check(boolean condition, String msgKey, Object... args) { if (!condition) { fail(msgKey, args); } } public static void notEmpty(String str, String msgKey, Object... args) { if (str == null || str.isEmpty()) { fail(msgKey, args); } } public static void notNull(Object obj, String msgKey, Object... args) { if (obj == null) { fail(msgKey, args); } } private static void fail(String msgKey, Object... args) { throw new CheckException(resources.getMessage(msgKey, args, UserUtil.getLocale())); } }
這裏有幾個小技術點:
工具類裏面使用spring的bean,使用了MethodInvokingFactoryBean的靜態方法注入:
<!-- 國際化 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>format</value> <value>exceptions</value> <value>windows</value> </list> </property> </bean> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="plm.common.utils.CheckUtil.setResources" /> <!-- 這裏配置參數 --> <property name="arguments" ref="messageSource"> </property> </bean>
server裏面調用的使用沒有出現類名:
這裏使用的jdk的import static 特性,能夠在ide上配置,請自行google。
import static plm.common.utils.CheckUtil.*;
還有一小點注意,我建議參數非法的時候,把值打印出來,不然你又要浪費時間看是沒有傳呢仍是傳錯了,時間就是這樣一點點浪費的。
check(id > 0L, "id.error", id); // 當前非法的id也傳入提示出去
另外有些項目用valid來校驗,從我實際接觸來看,用的很少,多是有短木板吧。若是你的項目valid就能知足,那就更加好了,不須要看了。可是大部分場景,校驗比例子複雜N多,提示也變幻無窮,因此咱們仍是本身調用函數校驗。
作了這幾步以後,代碼會漂亮不少,記住,代碼最主要的不是性能,而是可讀性,有了可讀性纔有才維護性。而去掉無關的代碼後的代碼,和以前的代碼對比一下,本身看吧。
還有人說代碼要註釋率到多少(咱們公司有段時間工具掃描要求註釋率到30%以上),依我看來,大部分業務代碼這麼簡單,你把代碼寫成我例子那樣,還須要什麼註釋?註釋是多此一舉。