代码 if 嵌套过多,怎么优化比较好

2019-02-19 10:43:46 +08:00
 wleexi

场景 保存信息时,发现手机号重复返回 false 编辑时,手机号与自身之外的手机号重复,返回 false, 没有重复,或者编辑时号码不变返回 true

    private boolean checkMobileExists(Long shopId, CreateSupplierParam param) {
        List<Supplier> supplierList = this.get(shopId, param.getContactMobile());
        if (!CollectionUtils.isEmpty(supplierList)) {
            if (supplierList.size() == BaseConstants.INT_ONE) {
                Long existId = supplierList.get(BaseConstants.INT_ZERO).getId();
                if (Objects.equals(existId, param.getId())) {
                    return true;
                }
            }
            return false;
        }
        return true;
    }
10802 次点击
所在节点    程序员
51 条回复
jmk92
2019-02-19 18:06:50 +08:00
private boolean checkMobileExists(Long shopId, CreateSupplierParam param) {
List<Supplier> supplierList = this.get(shopId, param.getContactMobile());
if (CollectionUtils.isEmpty(supplierList)) return false;
if (supplierList.size() != BaseConstants.INT_ONE) return false;
Long existId = supplierList.get(BaseConstants.INT_ZERO).getId();
if (Objects.equals(existId, param.getId())==false) return false;
return true;
}
biossun
2019-02-19 18:32:55 +08:00
只是展开嵌套的话,可以写成:

private boolean checkMobileExists(Long shopId, CreateSupplierParam param) {
List<Supplier> supplierList = this.get(shopId, param.getContactMobile());

if (CollectionUtils.isEmpty(supplierList)) {
return true;
}

if (supplierList.size() == BaseConstants.INT_ONE &&
Objects.equals(supplierList.get(BaseConstants.INT_ZERO).getId(), param.getId())) {
return true;
}

return false;
}
codingKingKong
2019-02-19 18:50:41 +08:00
是不是大概这样?
```java
private boolean checkMobileExists(Long shopId, String mobile, Long id) {
List<Long> supplierList = this.get(shopId, mobile);

if (!CollectionUtils.isEmpty(supplierList))
return true;
if (supplierList.size() != 1)
return false;
Long existId = supplierList.get(0);
return Objects.equals(existId, id);

}

private List<Long> get(long shopId, String mobile){
return Collections.emptyList();
}
```
hv3s1
2019-02-19 18:54:19 +08:00
if 里面疯狂套三元。 会不会被接手的人打
ArcherD
2019-02-19 19:33:01 +08:00
用 java 12 的 switch expression, pattern match 还要再过几个版本才能支持
ysc3839
2019-02-19 19:39:18 +08:00
@fuxiuyin 可以改成 do {} while (0);
这种写法在 C 语言里面挺常见的吧?算是把 while 当 goto 用。
kaneg
2019-02-19 19:44:26 +08:00
把比较饶人的判断语句写成方法,比如那个 INTONE,不去跟设计的人确认是很难理解为什么那么判断,可以用一个有意义的方法名,比如 isFirstNumber ()
ITACHIJAMES
2019-02-19 22:24:04 +08:00
do{
}while(false)
结合 break 将多级嵌套转化成同级并列
msg7086
2019-02-19 22:32:23 +08:00
我们十年前用的 Resharper 辅助重构,可以反转 if 来简化代码,只要点几下就行了。
lxfxf
2019-02-20 04:36:14 +08:00
@ArcherD 那不就是 scala 嘛,逃
guanhui07
2019-02-20 10:04:07 +08:00
提前 return

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/536428

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX