1凶杖、參數(shù)校驗
說明:每次開始編寫一個service,首先要做的就是參數(shù)校驗款筑。各種不為NULL智蝠、不為空的代碼隨處可見,很不爽奈梳。所以我們要找一種方法杈湾,來簡化這部分的業(yè)務無關(guān)代碼。
1.1. Apache給我們提供了一個工具類可以滿足我們的需求:org.apache.commons.lang3.Validate攘须,提供了各種校驗notBlank漆撞、notEmpty、notNull等于宙,可以滿足我們的一般需求叫挟。還可以自定義未通過校驗的提示語。
try {
long num = 40;
Validate.exclusiveBetween(1, 10, num, "num參數(shù)不在1-10范圍內(nèi)");
}catch (Exception e){
e.printStackTrace();
}
1.2. Guava的Preconditions也實現(xiàn)了類似的功能限煞。
Preconditions.checkArgument(!(StringUtils.isEmpty(userName)
|| StringUtils.isEmpty(password)), "用戶名或密碼不能為空");
1.3. 實體類約束檢查:Hibernate-validator
BeanValidators.validateWithException(validator, dto);
2抹恳、分支判斷
說明:選擇正確的判斷語句會對性能有所提升。所以我們要合理的運用switch case署驻、if else奋献、while、for旺上。
如果分支的條件判斷都是等值判斷瓶蚂,且值的范圍較小,則應該使用switch case而不是if else宣吱。因為switch內(nèi)部維護了一個路由表窃这,不需要像if else那樣挨個判斷。但是如果判斷是范圍征候,則只能用if else來操作了杭攻。
雙層for循環(huán)判斷的情況:把內(nèi)層for拿出來,轉(zhuǎn)換成字典疤坝。
使用策略模式和多態(tài)去掉if/else兆解、switch
參考1
參考2 利用設計模式替代項目中的if else
注: if else 并不都適合用策略模式替代,只有每個分支足夠復雜跑揉,且每個分支用不同方法做同一件事锅睛,才需要使用策略模式埠巨。
3、編譯階段做檢查
改變編碼方式现拒,在編譯階段做錯誤檢查辣垒,而不是等到運行階段。
比如switch,如果參數(shù)拼寫錯誤,會走default分支哑诊,導致不可預測的結(jié)果。但是如果參數(shù)改為enum類型哥遮,則編譯階段就會發(fā)現(xiàn)該錯誤岂丘,及時改正陵究。
4、方法可見性
對共有方法進行判定奥帘,是否需要公布铜邮。
5、不斷去發(fā)現(xiàn)更新工具類
不應該一直使用項目里一些老舊的工具類寨蹋,應該不斷的去發(fā)現(xiàn)探索新的好用的工具類松蒜,例如Apache Commons、Google Guava或者Joda Date已旧。
6秸苗、靜態(tài)導入使用
Eg: import static com.google.common.base.Preconditions.checkNotNull;
好處:減少代碼的書寫量;可讀性高运褪。
缺點:如果濫用惊楼,可讀性會很差,代碼中都是方法名秸讹,看不到類名檀咙,類是極具描述性的表示的。
所以璃诀,如果方法具有很好的表述性含義弧可,則建議多用靜態(tài)導入。對于枚舉類劣欢,還是建議老老實實的書寫棕诵。
7、避免臟數(shù)據(jù)
寧愿讓程序出錯凿将、停止運行年鸳,也不要把一些錯誤的數(shù)據(jù)插入到數(shù)據(jù)庫。正式的線上系統(tǒng)丸相,數(shù)據(jù)的準確性是最重要的搔确。操作前,一定要反復的進行數(shù)據(jù)檢查。
第一步:基本判斷約束(null值等基本判斷)
第二步:實體屬性約束(滿足jsr 303等基礎判斷)
第三步:業(yè)務條件約束(需求提出的不同的業(yè)務約束)
第四步:處理業(yè)務邏輯
Eg: 下面貼出一段用戶發(fā)表文章的示例代碼:
public ResponseEntity addArticle(Integer uid, Article article) {
//參數(shù)數(shù)據(jù)檢驗
// 1.用戶id不能為空膳算,且此用戶存在
Preconditions.checkNotNull(uid);
User user = userDao.findOne(uid);if(null== user){
throw new RuntimeException("找不到當前用戶!");
}
// 2.文章的必要字段不能為空
BeanValidators.validateWithException(validator, article);
// 業(yè)務邏輯代碼
article.setUser(user);
ResponseEntity ret = articleDao.save(article);
return ret;
}
后面會抽時間不定期補充