你疯了吧,竟然在代码里面“下毒”?

一、前言

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

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进行遍历。

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

三、总结

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335