代码复杂度是指代码中的分支数量,比如有一个 if 分支,代码复杂度就加 1,如果 if 中有“||”或者“&&”那么代码复杂度就加 2,for 和 while 同理。一般复杂度超过 10 的类就算是比较复杂的了,而这个类的复杂度竟然达到了 30,代码的糟糕程度可见一斑,现在我们就来重构一下这个类的代码。
if (StringUtil.isEmpty(username)) thrownewICRClientException("username can not be null"); if (StringUtil.isEmpty(password)) thrownewICRClientException("password can not be null"); if (udto == null) thrownewICRClientException("ICRUploadDTO can not be null");
重构之后:
1 2 3 4 5 6 7 8 9 10 11
//将原来的地方替换为 checkStringParamEmpty(username, "username"); checkStringParamEmpty(password, "password"); checkStringParamEmpty(udto.getUrlPath(), "urlPath"); ... //新增一个方法 privatevoidcheckStringParamEmpty(String value, String name)throws ICRClientException { if (StringUtil.isEmpty(value)) { thrownewICRClientException(name + " can not be null"); } }
原代码中不止这 3 个参数的校验,还有很多,越多参数的校验,我们重构后的复杂度就会越低。
代码复杂度变化:原来是 3,修改后为 1。
多 String 值判断
1 2 3
if (!udto.getPriority().equals("0") && !udto.getPriority().equals("1") && !udto.getPriority().equals("2") && !udto.getPriority().equals("3")) thrownewICRClientException("priority must be 0/1/2/3");
重构之后:
1 2 3 4 5 6 7 8 9
//将原来代码替换为 checkValueWithinList(udto.getPriority()); ... //新增一个方法: privatevoidcheckValueWithinList(String priority)throws ICRClientException { if (!Arrays.asList("0", "1", "2", "3").contains(priority)) { thrownewICRClientException("priority must be 0/1/2/3"); } }
代码复杂度变化:原来是 4,修改后为 1。
对 list 的非空判断
1 2
if (list == null || list.size() == 0) thrownewICRClientException("list can not be null");
重构之后:
1 2 3 4 5 6 7
//将原来的代码替换为 checkValueWithinList(udto.getPriority()); ... //新增一个方法 privatevoidcheckListNoNull(List list)throws ICRClientException { if (list.isEmpty()) thrownewICRClientException("list can not be null"); }