坑爹代码 | 循环+条件判断,你最多能嵌套几层?

码云Gitee
 码云Gitee
发布于 2019年06月03日
收藏 21

for 循环和 if 条件判断语句,必不可少吧。但是你见过最多嵌套的循环和条件判断有几层呢?或者说,你最多能容忍多少层的嵌套呢?

我们还是先来看看极端的坑爹代码吧:

// 这个无限循环嵌套,只是总循环的一部分。。。我已经绕晕在黄桷湾立交
if (recordList.size() > start) {
    for (int i = start; i < end; i++) {
        Map<String, Object> map = recordList.get(i);
        Map<String, Object> field11 = (Map<String, Object>) map.get("field"); //name -> code
        Map<String, Object> record11 = (Map<String, Object>) map.get("record"); // code -> value
        String catagory1 = map.get("categoryId").toString();
        //  查询第一种类型对应的其他类型
        SalaryDataVo ss = JSON.parseObject(JSON.toJSONString(map), SalaryDataVo.class);
        Page page3 = salaryManagerService.getAllRecordsByCondition(ss);
        if (page3.getRecords().size() > 0) {
            List<Map<String, Object>> salaryDataVos = page3.getRecords();
            salaryDataVos = this.reSetMap(salaryDataVos,null,null);
            for (Map<String, Object> map2 : salaryDataVos) {
                Map<String, Object> field2 = (Map<String, Object>) map2.get("field");
                Map<String, Object> record2 = (Map<String, Object>) map2.get("record");
                String catagory2 = map2.get("categoryId").toString();
                List<SalaryGroupVO> groupList2 = salaryGroupService.getSalaryGroupsItems(this.getUserCorpId(), catagory2);
                for (SalaryGroupVO cc : groupList2) {
                    cc.setCode(cc.getParentId() + cc.getCode());
                }
                //计算
                for (Map.Entry<String, Object> entity : field2.entrySet()) {
                    String keyName = entity.getKey();
                    for (SalaryGroupVO s2 : groupList2) {
                        if ("bigDecimal".equals(s2.getItemType()) && s2.getCode().equals(field2.get(keyName).toString()) && ("部门" != keyName) && ("姓名" != keyName) && StringUtils.isNotEmpty(s2.getItemType())) {
                            if (field11.containsKey(keyName)) {
                                if (field11.containsKey(keyName)) {
                                    String code1 = field11.get(keyName).toString();
                                    Double newValue = 0.0;
                                    Double oldValue=0.0;
                                    if (!record11.get(code1).toString().matches("^[0-9]*$")) {
                                        oldValue = Double.parseDouble(record11.get(code1).toString());
                                        if (record2.containsKey(entity.getValue().toString()) && (!record2.get(entity.getValue().toString()).toString().matches("^[0-9]*$"))) {
                                            String value2 = record2.get(entity.getValue().toString()).toString();
                                            newValue = Double.parseDouble(value2);
                                        }
                                        record11.remove(field11.get(keyName).toString());
                                    }

我数了数,一共有 11 层的嵌套!!!

吐槽归吐槽,这样的代码逻辑有什么重构的好方法吗?

到下面链接发表评论,领取奖品:

https://gitee.com/oschina/bullshit-codes/blob/master/java/InfiniteCycle

码云 6 周年,我们正在征集各种坑爹代码,很多奖品等你来拿

详细的参与方法请看  https://gitee.com/oschina/bullshit-codes

前两期坑爹代码:

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 OSCHINA 社区 [http://www.oschina.net]
本文标题:坑爹代码 | 循环+条件判断,你最多能嵌套几层?
加载中

精彩评论

loyal
loyal
看见这样的代码了,你们都表现的多么高尚,但从业务功能上来说,很多情况下都比这个复杂,更多的if更多的循环.还有个问题是有些东西如果根本不可能复用,倒不如就摞着写,没什么.当你只为了找代码优不优雅的时候,别人原子弹都造完了.优雅不优雅有时候要看具体情况.比如业务上变了,你最快的方式是加个if就完事,但如果优雅可能要改很多底层逻辑.持续优化,而不要过早优化.
开源中国首席疗养院CTO
开源中国首席疗养院CTO
航天飞机结构
cyper
cyper
一看就是多人修改过的代码, 有的 = 号前后没有空格. 洁癖症患者看着难受.

短期 => 忍痛稍微重构下, 抽取成方法, 使用java8 lamda /stream api / regular expression.,

长期 => 从一开始就做code review, 配合Github + Zenhub, 新人不可直接push代码到主仓库, 这样新人才会进步.
dwingo
dwingo
第27,28行重复了两次 "if (field11.containsKey(keyName)) {" 是什么情况?
说明缺乏review, 也可能只是临时代码, 等需求稳定后再重构.
重构方法:
1.循环内层的大段代码考虑移出到新方法中.
2.有些if可以考虑改条件然后直接continue或return, 避免下面大段代码缩进.
3.利用lambda,stream等新语法和库方法简化代码逻辑.
4.给IDE安装lint插件, 自动识别坏味道的代码, 并强制要求检查通过.
海儿的
可以根据业务,将循环的和是的逻辑和否的逻辑进行拆分,例:外层部几层,是的逻辑是干什么,否的逻辑是干什么的,各自单独抽出方法,方法名一定要尽量描述要干什么,这样层级可能会多一点,但是思路还是比较明确的

最新评论(34

小杰瑞
小杰瑞
用goto啊
LGBoy
LGBoy
这样的代码好好呆着吧,只要不出问题,重构不存在的。
之渊
之渊
还好了,不长就好, 我觉得要改的话,无非就是一个 for一个方法了。 或者 同时写多一点注释,特别是业务上面的说明,为什么要这么写之类的
仿佛兮
仿佛兮
这是一架波音747
lejoy
lejoy
在不了解别人具体业务的情况下,吐槽别人代码是没有意义的。
吐槽别人之前,除非自己已经想好怎么重构了。
loyal
loyal
看见这样的代码了,你们都表现的多么高尚,但从业务功能上来说,很多情况下都比这个复杂,更多的if更多的循环.还有个问题是有些东西如果根本不可能复用,倒不如就摞着写,没什么.当你只为了找代码优不优雅的时候,别人原子弹都造完了.优雅不优雅有时候要看具体情况.比如业务上变了,你最快的方式是加个if就完事,但如果优雅可能要改很多底层逻辑.持续优化,而不要过早优化.
飞鸿眉敛
飞鸿眉敛
这已经不是优化的问题了,这是脚踩西瓜皮,滑到哪算哪,估计连业务都没想清楚
1
15168294649
@loyal 我是真服你,你写这样的代码到后期怎么维护你考虑过?假设你走了 留下这样的代码谁去维护,不要过早优化就是让你把代码写成这样? 连基本的逻辑拆分都没有 我也不知道给你点赞的人到底是什么样的心态,假设让你重构是不是就直接复制这样的垃圾代码?
瑾兔兔
瑾兔兔
有名的几何算法库CGAL 的狄洛尼网格九十多个if嵌套。😱。当时看源码时吓懵了。各种炫技,只有搞数学的才能写出这样的代码
f
freezingsky
各种Map拿Data, 然后还是基于字符串拿的. 拿也就算了, 拿出来,竟然还是各种Map,逗我呢!
m
malie0
最怕的是没有注释,重构都不敢随便动
飞鸿眉敛
飞鸿眉敛
if (recordList.size() > start) {
for (int i = start; i < end; i++)
如果recordList.size() < end怎么办
返回顶部
顶部