自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

代碼優(yōu)化實(shí)戰(zhàn):我又優(yōu)化了一百個(gè) if else

新聞 前端
事情是這樣的,前段時(shí)間做代碼review的時(shí)候,發(fā)現(xiàn)項(xiàng)目中有一個(gè)方法代碼量超多,而且大部分都是寫的參數(shù)校驗(yàn)的代碼,各種if else,得,我們先抓著縷一縷需求先。

 事情是這樣的,前段時(shí)間做代碼review的時(shí)候,發(fā)現(xiàn)項(xiàng)目中有一個(gè)方法代碼量超多,而且大部分都是寫的參數(shù)校驗(yàn)的代碼,各種if else,得,我們先抓著縷一縷需求先。

產(chǎn)品需求

找到產(chǎn)品要到了需求文檔,需求是這樣得:

  • excel數(shù)據(jù)模板下載
  • excel數(shù)據(jù)導(dǎo)入
  • 導(dǎo)入得時(shí)候根據(jù)模板得校驗(yàn)規(guī)則來(lái)進(jìn)行篩選,導(dǎo)入成功得返回成功列表,數(shù)據(jù)有問題得返回失敗列表,失敗列表支持?jǐn)?shù)據(jù)編輯修正

好吧??吹叫枨蟮谝谎劭赡芫褪堑谌杏悬c(diǎn)難度,我們知道,傳統(tǒng)得數(shù)據(jù)校驗(yàn)是在DTO上面加注解

如下:

//第一種
public Result test(@RequestBody @Validated TestDTO dto) {...}
//第二種
public Result test(@RequestBody @Valid TestDTO dto{...}
//第三種
public Result test(@RequestBody @Validated(value = {SaveGroup.class}) TestDTO dto) {...}

??TestDTO??? 里面呢會(huì)有一些類似 ??@NotNull??? 、 ??@NotBlank??? 、 ??@Size?? 等校驗(yàn)注解,這里就不列了。

然后再在全局異常攔截那里進(jìn)行統(tǒng)一封裝,使其放回得數(shù)據(jù)結(jié)構(gòu)盡量保持統(tǒng)一,所以一般還得有一個(gè) ??GlobalExceptionHandle?

 

 

 

 

 講到常見得數(shù)據(jù)校驗(yàn),那么我們畫風(fēng)一轉(zhuǎn),再回來(lái)看需求,可見以上需求是不滿足得,首先,我們?nèi)雲(yún)⑹且粋€(gè)文件,也就是用戶傳得那個(gè)excel,我們得先解析文件再進(jìn)行數(shù)據(jù)判斷,合法得放一個(gè)集合,不合法得放一個(gè)集合,再者,即使入?yún)⑹且粋€(gè)數(shù)組,這種校驗(yàn)一旦不滿足立馬進(jìn)異常處理了,無(wú)法返回給前端正確得數(shù)據(jù)結(jié)構(gòu),所以引入了我們今天解決這類需求得解決方案。

重構(gòu)開始-開篇

我們以之前寫文章里面得一個(gè)項(xiàng)目 ??easyexcel-demo?? 為模板進(jìn)行代碼得改造和編寫

代碼地址:https://github.com/pengziliu/GitHub-code-practice 

 

 

 

 

下載之前做的小demo,運(yùn)行起來(lái),創(chuàng)建一個(gè)工作簿導(dǎo)入數(shù)據(jù)

創(chuàng)建一份Excel數(shù)據(jù) 

 

 

 

 

PostMan模擬調(diào)用數(shù)據(jù)解析 

 

 

 

 

 項(xiàng)目代碼和控制臺(tái)輸出 

 

 

 

 

重構(gòu)開始-實(shí)戰(zhàn)

好吧,上面介紹了一下之前項(xiàng)目得基本讀取excel功能,我們就基于以上功能來(lái)實(shí)現(xiàn)我們開篇所說(shuō)得需求。

我們對(duì)手機(jī)號(hào)和姓名自定義一下規(guī)則:

  • 手機(jī)號(hào)滿足基本手機(jī)號(hào)規(guī)則
  • 姓名非空且不能超過(guò)四個(gè)字符

返回成功失敗兩個(gè)集合,全部滿足得返回到成功,只要有一條不滿足得丟入失敗列表。

定義返回得數(shù)據(jù)結(jié)構(gòu)

新建返回對(duì)象 ??UserExcelVO.java?

 

 

 

 

 

好了,兄弟們,這里我要上同事寫的偽代碼了。坐好扶穩(wěn)了!??!

 

@PostMapping("/importExcel")
public UserExcelVO importExcel(@RequestParam("file") MultipartFile file){
List<UserExcelModel> list = null;
List<UserExcelModel> fail = new ArrayList<>();
UserExcelVO userExcelVO = new UserExcelVO();
String mobieReg = "^[1][3,4,5,7,8][0-9]{9}$$";
try {
list = EasyExcel.read(file.getInputStream(),UserExcelModel.class,new ModelExcelListener()).sheet().doReadSync();

list.forEach(data->{
//處理姓名的校驗(yàn)
if(StringUtils.isEmpty(data.getName())||data.getName().length()> 4 ){
fail.add(data);
return;
}
//處理手機(jī)號(hào)的校驗(yàn)
if (StringUtils.isEmpty(data.getMobile())|| !data.getMobile().matches(mobieReg)) {
fail.add(data);
return;
}
//以下根據(jù)字段多少可能有n個(gè)if
});
userExcelVO.setFail(fail);
list.removeAll(fail);
userExcelVO.setSuccess(list);
} catch (IOException e) {
e.printStackTrace();
}
return userExcelVO;
}

測(cè)試數(shù)據(jù):

用戶名 年齡 手機(jī)號(hào) 性別
寶典哥1 11 23847235 男
寶典哥2 12 15813847236 男
寶典哥3 13 15813847237 男
寶典哥4 14 15813847238 男
寶典哥5 15 15813847239 男
寶典哥6 16 15813847240 男
寶典哥7 17 152247241 男
寶典哥8 18 15813847242 男
寶典哥9 19 15813847243 男
寶典哥10 20 15813847244 男
寶典哥11 21 15813847245 男
寶典哥12 22 15813847246 男
寶典哥13 23 15813847247 男
寶典哥14 24 15813847248 男
寶典哥15 25 15813847249 男

?
?
?測(cè)試結(jié)果:

{
"success": [
{
"cellStyleMap": {},
"name": "寶典哥2",
"age": 12,
"mobile": "15813847236",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥3",
"age": 13,
"mobile": "15813847237",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥4",
"age": 14,
"mobile": "15813847238",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥5",
"age": 15,
"mobile": "15813847239",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥6",
"age": 16,
"mobile": "15813847240",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥8",
"age": 18,
"mobile": "15813847242",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥9",
"age": 19,
"mobile": "15813847243",
"sex": "男"
}
],
"fail": [
{
"cellStyleMap": {},
"name": "寶典哥1",
"age": 11,
"mobile": "23847235",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥7",
"age": 17,
"mobile": "152247241",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥10",
"age": 20,
"mobile": "15813847244",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥11",
"age": 21,
"mobile": "15813847245",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥12",
"age": 22,
"mobile": "15813847246",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥13",
"age": 23,
"mobile": "15813847247",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥14",
"age": 24,
"mobile": "15813847248",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥15",
"age": 25,
"mobile": "15813847249",
"sex": "男"
}
]
}

根據(jù)測(cè)試結(jié)果應(yīng)該是問題不大的,我這里也是模擬一下,但是實(shí)際的業(yè)務(wù)場(chǎng)景,一個(gè)excel里面假如是訂單數(shù)據(jù),最少是幾十個(gè)字段起步的,難道要寫幾十個(gè)if else ,明顯是不合理的,那我們能不能使用注解的方式幫我們解決問題呢,如果使用注解的話應(yīng)該如何使用呢?

開造!

創(chuàng)建 ??ValidationUtils.java??

public class ValidationUtils {

public static Validator getValidator(){
return validator;
}

static Validator validator;
static{
ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
validator=validatorFactory.getValidator();
}
}

對(duì)Model加注解 

 

 

 

 

對(duì)Controller進(jìn)行改寫

@PostMapping("/v2/importExcel")
public UserExcelVO importExcelV2(@RequestParam("file") MultipartFile file){
List<UserExcelModel> list = null;
List<UserExcelModel> fail = new ArrayList<>();
UserExcelVO userExcelVO = new UserExcelVO();
try {
list = EasyExcel.read(file.getInputStream(),UserExcelModel.class,new ModelExcelListener()).sheet().doReadSync();
list.forEach(data->{
//此處3行代碼解決了一百個(gè)if else
Set<ConstraintViolation<UserExcelModel>> violations = ValidationUtils.getValidator().validate(data);
if(violations.size()>0){
fail.add(data);
}
});
userExcelVO.setFail(fail);
list.removeAll(fail);
userExcelVO.setSuccess(list);
} catch (IOException e) {
e.printStackTrace();
}
return userExcelVO;
}

對(duì)同一組數(shù)據(jù)進(jìn)行測(cè)試

 

 

 

 

 

測(cè)試結(jié)果如下,可以發(fā)現(xiàn),兩種實(shí)現(xiàn)數(shù)據(jù)輸出結(jié)果一致

{
"success": [
{
"cellStyleMap": {},
"name": "寶典哥2",
"age": 12,
"mobile": "15813847236",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥3",
"age": 13,
"mobile": "15813847237",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥4",
"age": 14,
"mobile": "15813847238",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥5",
"age": 15,
"mobile": "15813847239",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥6",
"age": 16,
"mobile": "15813847240",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥8",
"age": 18,
"mobile": "15813847242",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥9",
"age": 19,
"mobile": "15813847243",
"sex": "男"
}
],
"fail": [
{
"cellStyleMap": {},
"name": "寶典哥1",
"age": 11,
"mobile": "23847235",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥7",
"age": 17,
"mobile": "152247241",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥10",
"age": 20,
"mobile": "15813847244",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥11",
"age": 21,
"mobile": "15813847245",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥12",
"age": 22,
"mobile": "15813847246",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥13",
"age": 23,
"mobile": "15813847247",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥14",
"age": 24,
"mobile": "15813847248",
"sex": "男"
},
{
"cellStyleMap": {},
"name": "寶典哥15",
"age": 25,
"mobile": "15813847249",
"sex": "男"
}
]
}

代碼倉(cāng)庫(kù)

??https://github.com/pengziliu/GitHub-code-practice??

最新代碼已提交,歡迎star,里面包含很多的項(xiàng)目教程和實(shí)例

寫代碼的時(shí)候,除了做功能,應(yīng)該要考慮代碼的擴(kuò)展性,不然產(chǎn)品說(shuō)加個(gè)功能,我們又得吭哧吭哧寫代碼,那這樣也臺(tái)悲催了。

 

 

責(zé)任編輯:張燕妮 來(lái)源: JAVA葵花寶典
相關(guān)推薦

2024-10-17 09:29:06

2020-05-28 09:06:23

大數(shù)據(jù)平臺(tái)優(yōu)化

2020-05-13 14:15:25

if-else代碼前端

2021-11-04 08:53:00

if-else代碼Java

2023-12-07 07:28:25

線程共享資源

2022-10-26 11:00:06

VisualC++函數(shù)

2015-05-14 14:29:29

WGDC

2024-03-25 10:00:00

C++編程else

2021-07-28 14:35:09

代碼進(jìn)度條前端

2013-03-06 10:28:57

ifJava

2021-02-14 14:06:24

SQL數(shù)據(jù)庫(kù)面試

2019-12-13 10:25:08

Android性能優(yōu)化啟動(dòng)優(yōu)化

2022-07-12 08:32:17

transition跑馬燈

2023-03-30 07:34:10

Linux性能數(shù)據(jù)結(jié)構(gòu)

2009-04-20 08:51:50

MySQL查詢優(yōu)化數(shù)據(jù)庫(kù)

2017-03-29 14:44:20

網(wǎng)絡(luò)性能優(yōu)化

2022-05-17 09:02:30

前端性能優(yōu)化

2015-11-05 09:02:05

Java代碼性能優(yōu)化

2023-10-10 10:57:12

JavaScript代碼優(yōu)化

2022-06-14 10:49:33

代碼優(yōu)化Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)