代码 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;
    }
10558 次点击
所在节点    程序员
51 条回复
si
2019-02-19 10:47:32 +08:00
不知道大佬怎么写的,要是我一般会写成连续的。
if() return;
if() return;
if() return;
whx20202
2019-02-19 10:50:33 +08:00
代码整洁之道原则:提前 return

if(不满足):
return
if (不满足):
return

如果你的多层 if else 都有代码块,那会复杂一点,但是也可以优化
yesterdaysun
2019-02-19 10:52:42 +08:00
试试 guard clause

```java
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) {
return false;
}
Long existId = supplierList.get(BaseConstants.INT_ZERO).getId();
return Objects.equals(existId, param.getId());
}
```
LxExExl
2019-02-19 10:53:42 +08:00
返回 true 要么为空 要么成员唯一且和输入相等

if (list is null || list.size() == 1 && list.getFirst() == input) return true

else return false
danliuwo
2019-02-19 10:57:21 +08:00
switch
wutiantong
2019-02-19 10:59:30 +08:00
return CollectionUtils.isEmpty(supplierList) || supplierList.size() == BaseConstants.INT_ONE && Objects.equals(supplierList.get(BaseConstants.INT_ZERO).getId(), param.getId());

一条语句搞定,假如你搞不清||和&&的优先级关系,就自己加个括号吧。
taaaang
2019-02-19 11:00:47 +08:00
可以看看《重构 改善既有代码的设计》
BingoXuan
2019-02-19 11:03:02 +08:00
连续 if 可读性更高,更容易理解。可读性和代码行数不是成反比的,有时候提高可读性,你需要更多的代码。虽然看起来很冗余,但实际上会让阅读代码的人理解起来更加清晰。

如果 python 这种缩进严格的语言,而你同事喜欢这样嵌套写。淘宝买把游标卡尺来 review 会比较好。
felixlong
2019-02-19 11:12:27 +08:00
你这 code 有 bug 啊。supplierList 为空为什么返回的是 true?
yesterdaysun
2019-02-19 11:14:07 +08:00
BaseConstants.INT_ONE 和 BaseConstants.INT_ZERO 应该就是 int 0 和 1 吧, 需要定一个常数吗?

单单为了避免魔数也不需要做到这个程度吧
MrUser
2019-02-19 11:20:20 +08:00
exists = false;
if (!exists) {}
if (!exists) {}
if (!exists) {}
return exists;
kaedea
2019-02-19 11:20:24 +08:00
scoping function 了解一下
wleexi
2019-02-19 11:22:36 +08:00
@felixlong 额 不是的。为空表示新号码,可以通过检查的
qq976739120
2019-02-19 11:23:01 +08:00
典型的箭头型代码块....如何解决楼上已经说得很好了
AngryPanda
2019-02-19 11:23:05 +08:00
尽早 return
Raymon111111
2019-02-19 11:24:51 +08:00
提早 return 是正确答案.
wleexi
2019-02-19 11:26:07 +08:00
@wutiantong 想过这种,但是考虑了可读性可能不是特别高
wleexi
2019-02-19 11:27:25 +08:00
@qq976739120 不太明白
billgreen1
2019-02-19 11:27:52 +08:00
表驱动,代码大全里面提到的
Mutoo
2019-02-19 11:30:21 +08:00
BaseConstants.INT_ONE
BaseConstants.INT_ZERO

0 和 1 本身就有自带语议了,不属于魔数,没必要搞个这么长的常量吧

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

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

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

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

© 2021 V2EX