查看原文
其他

你见过最烂的Java代码长什么样子?

Guide哥 JavaGuide 2022-03-15

经历了的项目越多,看过的奇葩代码也就越多。发现烂代码的目的并不是抨击和取笑,主要还是为了避免让自己或者身边的人写出类似的代码。

码云上面就有个热门仓库 bullshit-codes[1] 专门收集史上最坑爹的代码片段。下面放几个比较有意思的给大家看看:

1.一行代码就可以搞定的,非要写的啰里啰嗦。不要给我扯什么可读性,以下代码一行的写法可读性也更好。

private boolean isEligible(int age) {
    boolean result;
    if (age > 18) {
        result = true;
    } else {
        result = false;
    }
    return result;

}

2.前大厂程序员设计的智能 AI 客服系统

Scanner sc = new Scanner(System.in);
String str;
// 待优化
while (true) {
    str = sc.next();
    // 测试环境,正式环境从数据库中获取
    str = str.replace("吗""");
    str = str.replace("?""!");
    str = str.replace("?""!");
    str = str.replace("不""很");
    str = str.replace("你们""我们");
    str = str.replace("有""没有");

    System.out.println(str);
}

效果展示:

在吗?
在!
你好!
你好!
产品有问题啊
产品没有问题啊
你们的服务态度不好
我们的服务态度很好

3.只要我的代码够多,你就你很难看出有啥问题

/**
 * 三年前接手的一个政府网站项目,真假不知,据说是一个两年web开发经验的程序员写的, 用的spring系列还是3.x版本,前端还是jsp,可能是老项目。
 * 主要特点是:实体类中不写注释,数据库表中也没有注释,命名经常使用英文拼音混合,而且还可能是简写(grzlChangeStatus:个人资料变更状态)
 *
 * 挖坑不填坑,菊花塞电灯
 */

@Controller
public class DemoController {
 /**
  * 这个方法一共有800多行,有30多个if或else if的条件判断,只写代表性的几个
  *
  * 具体方法名称记不得,逻辑是这样,前端jsp提交一个请求过来,界面中除了一些必填信息外,还有有5个下拉框,后台判断各种组合,
  * 分别往request里面塞入不同的对象,返回的页面视图也可能不同。
  */

 @RequestMapping("/submit")
 public String template(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
  String param1 = request.getParameter("param1");
  String param2 = request.getParameter("param2");
  String param3 = request.getParameter("param3");
  String param4 = request.getParameter("param4");
  String param5 = request.getParameter("param5");
  // 你没看错,各种状态全部存字串,而且判断的时候不考虑空指针问题
  if (param1.equals("已消毒")) {
   // 逻辑
   request.setAttribute("attr""value");
   return "jsp1";
  } else if (param1.equals("已消毒") && param2.equals("1.8米以上")) {
   // 逻辑
   request.setAttribute("attr""value");
   // 你没看错,可能又是另一个视图
   return "jsp2";
   // 你没看错,还可能出现多个条件,|| 和 &&
  } else if (param1.equals("已消毒") && param2.equals("2米以上") || param3.equals("缅甸")) {
   // 逻辑
   request.setAttribute("attr""value");
   return "jsp3";
   // 你没看错,因为他的状态或选项没有用数字类型,所以不能用 > < 之类的来判断,要列举所有状态
  } else if (param1.equals("未进站") || param1.equals("已进站") || param1.equals("已消毒") && param2.equals("2米以上")) {
   request.setAttribute("attr""value");
   return "jsp3";
   //你没看错,还会出现 true==true 或false==false这样的代码
  }else if(param4.equals("禁止入境")==true && param5.equals("农用车")) {
   request.setAttribute("attr""value");
   return "jsp4";
   //你没看错,还会出现逻辑非,而且,要先判断什么条件,从来不用括号包起来,要理他的逻辑,还要先理条件判断优先级
  }else if(param1.equals("未进站") || param1.equals("已进站") || param1.equals("已消毒") && param2.equals("2米以上") && !param3.equals("缅甸")) {
   request.setAttribute("attr""value");
   return "jsp5";
  }
  //省略剩下的30多个类似的判断
  else {
   return "default";
  }
 }
}

以上代码的问题:

  • 空指针异常
  • 逻辑混乱,部分 else if 根本进不去

4.获取一天后的日期:让线程睡一会

public static Date getAfterDate(int day) {
    try {
        Thread.sleep(day * 24 * 60 * 60 * 1000);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return new Date();
}

5.新上的项目的代码命名,表示看不太懂

6.为了得到了一个用户总人数,把所有的 User 对象查询出来。

/**
  统计用户总数,来源于N年前某个用户抱怨执行效率低,贴出类似逻辑的代码.
  @author wendal
*/

@IocBean
public class CountUserTable {

    @Inject Dao dao;

    @Test
    public void test_user_count() {
        // 取出全部用户对象(dao.query返回List<User>),然后取list大小就可以啦,是不是很机智
        int count = dao.query(User.class, null).size();
        System.out.println("用户总数是" + count);
    }
}

参考资料

[1]

bullshit-codes: https://gitee.com/oschina/bullshit-codes

闲聊

我平时是一个特别喜欢记录的人,我遇到的好文章,看过的好书,学习过的好专栏,我都会记录下来,记录自己的所得所获。

Typora+Github同步是我目前记笔记的方式。不知道适不适合别人,反正目前来看这种方式我最喜欢。

简单给大家看一下我的笔记分类目录吧(挺杂的,最近会优化目录):

上周日和我们大学的传奇人物,研究生在华科,目前在华为的学长聊了一会。收获确实不少,果然优秀的人总有一些过人的地方(这周应该会把自己的所得所获分享出来)。

最近更新的一些文章推荐:


往期推荐



成人函授大专,采煤专业,我的魔幻编程之旅

我利用业余时间通过技术写作挣了3个顶配Mac Pro

被喷了?聊聊我开源RPC框架的那些事

工作中巧用了这几个设计模式重构代码,女同事直呼666

我在蚂蚁外包的这段时光

6k+点赞的SpringBoot+Netty分布式即时通讯系统!爱了爱了!


我整理的4本PDF文档,公众号“后端技术进阶”后台回复“面试突击”即可免费获取。

文章有帮助可以点个「在看」或「分享」,都是支持,我都喜欢!

我是Guide哥,Java后端开发,会一点前端知识,喜欢烹饪,自由的少年。一个三观比主角还正的技术人。我们下期再见!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存