握草!某程序员竟然在深夜偷偷在代码里下毒!

    科技2022-07-12  131

    Python实战社群

    Java实战社群

    长按识别下方二维码,按需求添加

    扫码关注添加客服

    进Python社群▲

    扫码关注添加客服

    进Java社群▲

    作者丨小傅哥

    来源丨bugstack虫洞栈(ID:bugstack)

    博客:https://bugstack.cn

    目录

    一、前言

    二、代码有毒!

    1. 方法命名

    2. 最佳排序

    3. 有点烧脑

    4. 迷之求和

    5. 花里胡哨

    6. 数字判断

    7. 代码健壮

    8. 性能优化

    9.  无用日志

    10. 耗时遍历

    三、总结

    一、前言

    学过的代码记不住?方式不对才记不住,你这么记!

    Git:上厕所不叫上厕所,叫拉分支!

    Socket:厕所就是服务器,坑就是端口!

    队列:上厕所叫入队列,先进先出!

    栈:去厨房????叫进栈,后进先出!

    架构:三居的格局叫MVC,四居的格局叫DDD!

    理论:系统结构设计定的好,有点bug没问题,能改。这就是茅坑跟坐便的区别。

    除了有点味道以外,这回是不记住了,我们编程写代码的过程和我们日常生活的例子,往往都是这样可以对应上,有了真实可以触及的实物,再去了解编程就会更加容易,也很难忘记。但可能会写着写着代码,就傻笑起来!

    除了这些正能量学习的例子,我们接下来再看看哪些有毒的代码!

    二、代码有毒!

    以下代码用好了升职加薪,用不好开除走人!

    1. 方法命名

    public List<UserInfo> queryBitchUserInfo(String req) {     return null; }

    指数:⭐⭐⭐

    解毒:小哥应该是想写批量查询用户的方法名,结果把batch(批量),写成了bitch(婊子)

    点评:接口是上午写的,人是下午走的!

    2. 最佳排序

    public static void main(String[] args) {     int[] numbers = new int[]{2, 30000000, 1, 6, 40000000, 5};     for (final int number : numbers) {         new Thread(new Runnable() {             @Override             public void run() {                 try {                     Thread.sleep(number);                     System.out.println(number);                 } catch (InterruptedException ignore) {                 }             }         }).start();     } }

    指数:⭐⭐⭐

    解毒:用数字休眠时常排序,谁醒来的时间早,谁就先输出。

    点评:思路清奇,要不是这次排序等了一天,老板也不能踢他!

    3. 有点烧脑

    @Test public void test_idx_hashMap() {     Map<String, String> map = new HashMap<>(64);     map.put("alderney", "未实现服务");     map.put("luminance", "未实现服务");     map.put("chorology", "未实现服务");     map.put("carline", "未实现服务");     map.put("fluorosis", "未实现服务");     map.put("angora", "未实现服务");     map.put("insititious", "未实现服务");     map.put("insincere", "已实现服务");          long startTime = System.currentTimeMillis();     for (int i = 0; i < 100000000; i++) {         map.get("insincere");     }     System.out.println("耗时(initialCapacity):" + (System.currentTimeMillis() - startTime)); }

    指数:⭐⭐⭐⭐⭐

    解毒:这是一个定义HashMap存放业务实现key,通过key调用服务的功能。但这里的key,只有insincere有用,其他的都是未实现服务。那你看到有啥问题了吗?

    这点代码乍一看没什么问题,看明白了就是代码里下砒霜!它的目的就一个,要让所有的key成一个链表放到HashMap中,而且把有用的key放到链表的最后,增加get时的耗时!

    首先,new HashMap<>(64);为啥默认初始化64个长度?因为默认长度是8,插入元素时,当链表长度为8时候会进行扩容和链表树化判断,此时就会把原有的key散列了,不能让所有key构成一个时间复杂度较高的链表。

    其次,所有的 key 都是刻意选出来的,因为他们在 HashMap 计算下标时,下标值都为0,idx = (size - 1) & (key.hashCode() ^ (key.hashCode() >>> 16)),这样就能让所有 key 都散列到同一个位置进行碰撞。而且单词 insincere 的意思是;不诚恳的、不真诚的!

    最后,前7个key其实都是废 key,不起任何作用,只有最后一个 key 有服务。那么这样就可以在HashMap中建出来很多这样耗时的碰撞链表,当然要满足0.75的负载因子,不要让HashMap扩容。

    整体的效果如下图,key并没有均匀散列;

    点评:能写出这种代码就是薪资没给够,等着代码优化提加薪呢!

    4. 迷之求和

    @Test public void test_add(){     int num = 0;     for (int i = 0; i < 100; i++) {         num = num++;     }     System.out.println(num); }

    指数:⭐⭐

    解毒:最终 num 结果为 0,num++ 根本没起啥作用。因为后++,是先用结果,在++操作,不会给赋值。正确写法是:num = ++ num;

    点评:这种错误就跟开车闯红灯似的,轻则扣分罚款,重则倾家荡产。

    5. 花里胡哨

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

    指数:⭐

    解毒:代码可以运行,但是可以优化为return age > 18。

    点评:你们公司是按照代码行数打绩效?不做格式化、不整洁、不看IDEA工具提示,代码是写给人看的!啥有不是!

    6. 数字判断

    public boolean isNumber(String str) {     try {         Integer.parseInt(str);         return true;     } catch (Exception e) {         return false;     } }

    指数:⭐⭐

    解毒:判断是不是数字,不抛异常就是,抛异常就不是。这可以使用 StringUtils 工具包判断,也可以自己写正则判断。

    点评:这代码真烧,用异常做业务。这不是把????蘑菇给狗狗吃吗!????狗狗没死你到是吃蘑菇呀,你吃狗粑粑。

    7. 代码健壮

    public void neverStop(){     //一直循环     while (true) {         try {             //业务处理流程         } catch (Exception e) {             //抓到异常,不处理、不打日志、就是不要停,继续跑             continue ;         }     } }

    指数:⭐⭐⭐

    解毒:把可能抛异常的代码用tryCatch包起来,一直跑,遇到异常也要跑。这个时候遇到异常,要做一些流程处理,最起码要打日志和报警。

    点评:业务开发很多时候都是为了解决异常流程,就像擦屁屁的纸80%的面积是保护手的。怎么滴,我看你这代码,是非要一直抠破呀!

    8. 性能优化

    // APP首页查询,优化前 public void queryInitInfo(){     Thread.sleep(3000); } // APP首页查询,优化后 public void queryInitInfo(){     Thread.sleep(500); }

    指数:⭐⭐⭐

    解毒:没啥解毒的,一公斤鹤顶红兑了一口口水!

    点评:点评不了啦,抓到就开了吧!

    9.  无用日志

    // 规则引擎校验 public boolean ruleEngine(MatterReq req) {     try {         // 业务流程     } catch (Exception e) {         logger.error(e);  // 只打异常,不打入参信息     } }

    指数:⭐

    解毒:日志里只打了异常,没有入参信息,当你的方法有大量的调用时,很难快速定位问题。

    点评:下次记得把产品经理也打日志里去,要死一起死!

    10. 耗时遍历

    @Test public void test_LinkedList() {  // 初始化100万数据     List<Integer> list = new LinkedList<Integer>(1000000);          // 遍历求和     int sum = 0;     for (int i = 0; i < list.size(); i++) {         sum += list.get(i);     }      }

    指数:⭐⭐⭐⭐

    解毒:乍一看可能觉得没什么问题,但是这个遍历求和会非常慢。主要因为链表的数据结构,每一次list.get(i)都是从链表的头开始查找,与ArrayList不同,LinkedList它时间复杂度是O(n)。那如果说你不知道对方传过来的是LinkedList还是ArrayList呢,其实可以通过list instanceof RandomAccess 进行判断。ArrayList 有随机访问的实现,LinkedList 是没有。同时也可以使用增强的for循环或者Iterator进行遍历。

    点评:根基不牢,地动山摇!一知半解,坑了老铁!

    三、总结

    好的代码千篇一律,差的程序升值加薪!,这些有毒的代码,淋漓尽致的展示了程序员的才华出众,同时也严重怀疑就是钱给少了!


    好!,本篇文章就到这里,有意思的代码还有很多,欢迎在评论区留下你的鬼畜代码!

    程序员专栏 扫码关注填加客服 长按识别下方二维码进群

    近期精彩内容推荐:  

     程序员写的这一行代码,被国家博物馆收藏了

     2020 年 9 月程序员工资统计,我扯后腿了~

     提高国内访问 GitHub 的速度的 9 种方案

     Python是强类型语言,还是弱类型语言?

    在看点这里好文分享给更多人↓↓

    Processed: 0.013, SQL: 8