美文网首页WEB学习笔记
代码写成这样,老夫无可奈何!

代码写成这样,老夫无可奈何!

作者: 赵客缦胡缨v吴钩霜雪明 | 来源:发表于2019-10-22 10:27 被阅读0次

    你见过最无可奈何的代码是什么?今天来总结一下我遇到过的一些神逻辑代码,不一定很全,但我真心写不出,真心让我自叹不如啊!

    1、耍猴的最佳手段

    还记得 XX 手机的抢购活动么,抢购按钮的代码类似是这样的:

    <a href="javasript:alert('抢购结束!')">立即抢购</a>
    

    活动还没开始就结束了。。

    后面有人挖出来这段神逻辑,大家真是哭晕在厕所了,还好,抢购买手机这种我从来不参加。。

    就是在前端写死代码造成抢购结束的假象,其实请求压根没有发送到服务器,或者休眠几秒直接跳转到抢购结束页面,良心点的,点 10 次有一次发到服务器就不错了,这样耍猴是不是太好玩了?

    类似的还有清除缓存的、提交投诉的等等。。。

    <a href="javasript:alert('清理完成!')">清理缓存</a>
    
    <a href="javasript:alert('提交成功!')">提交投诉</a>
    

    众所周知,为了提高服务器的承载能力,现在各类 APP、网页等都会或多或少加入前端缓存,但上面这种耍猴的代码也太无耻了。

    2、猪一样的队友

    大家有没有见过这样的代码:

    <!-- 原价 180 元,现在活动价 228 元,活动结束后恢复原价 -->
    ...
    

    这上面的活动价比原价还贵,真是哭笑不得……

    类似这样的代码,一些程序员在注释中说明活动的内容,又或者是把一些生产上环境的 IP、端口、用户名、密码等敏感信息把在注释中,好随时能切换……

    真是猪一样的队友,这样的程序员不开除么!?定时炸弹啊!

    3、最牛逼的排序算法

    据说是一个月薪 9K 的 Java 程序员,因老板让他写一个排序算法,然后他就写了一段屌炸天的休眠排序算法,接着他就被老板开除了……

    排序算法代码大概是这样的:

    这段代码有什么问题?

    这个程序员更屌啊,数字排序,用一行简单的 Arrays.sort 就搞定的东西,他竟用到了这么多概念。

    • 循环
    • 线程休眠
    • 多线程
    public class ArraySort implements Runnable {
    
        private int number;
    
        public ArraySort(int number) {
            this.number = number;
        }
    
        public static void main(String[] args) {
            int[] numbers = new int[]{102, 338, 62, 9132, 580, 666};
            for (int number : numbers) {
                new Thread(new ArraySort(number)).start();
            }
        }
    
        @Override
        public void run() {
            try {
                Thread.sleep(this.number);
                System.out.println(this.number);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    还好是数字小啊,还好休眠是毫秒啊,要是数字大,要是休眠时间是秒,那要等多少休眠时间才能排序完?

    按道理,他的程序也没问题啊,老板为什么要开除他?应用程序中出 BUG 不是很正常的事吗?但他这种排序思维,能写出这样的隐藏 BUG 也是绝了,创造性的发明了 "休眠排序" 算法,系统里面还不知道有多少这样的坑,不开除他开除谁啊?

    4、休眠的最高境界

    /**
     * 获取未来几天的日期
     * @param days 指定的天数
     * @return
     */
    public static Date getNextDays(int days){
        try {
            // 休眠指定的天数
            Thread.sleep(days * 24 * 60 * 60 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 休眠结束后返回日期
        return new Date();
    }
    

    获取指定日期用休眠?写完,已笑晕在厕所。。。

    想离职找不到借口?

    那还不容易,哥送你这段加强版,复制这段代码,提交打包测试上线,坐等开除。

    5、真就是假,假就是真

    boolean isBoy = user.isBoy() == true ? true: false;
    if (isBoy){
        ...
    } else {
        ...
    }
    

    布尔值可以直接拿来用,你硬要写个三元表达式?年底绩效考核了,代码量有 KPI 么?

    还有类似这样的:

    if (xx1 == true && xx2 !=  true){
        ...
    } else {
        ...
    }
    

    还有这样的:

    if (xx1 > xx2){
        return true;
    } else {
        return false;
    }
    

    写得太优雅了!

    6、循环循环循环

    for (int i = 0; i < 1; i++){    
    ...
    }
    

    一个循环也用循环,曾经就遇到过这么一段,不知所云了,要改这段代码,还要把他叫在旁边坐着,看着改才行。。

    for (;;){    
    ...
    }
    

    死循环这么写,我们就看不出来了么?

    7、魔法值的真谛

    曾经检查代码时,发现代码中很多魔法值,叫同事要定义成公共常量,结果来了这么一段:

    private final static int ZERO = 0;
    private final static int ONE = 1;
    private final static int TWO = 2;
    ...
    

    看到上面的常量定义,我真想打人,虽然魔法值是没了,但又定义了一些没有意义的常量,完全没有理解修改魔法值的真谛,这和脱裤子放屁有什么区别?

    上面还只是一个简单的示例,实际审查情况远比你想象的糟糕。

    8、看花眼的参数

    Order order = new Order(orderNo, 1678.13, "CNY", 1, 3, "wx", 5, "1", 0, "8", 0, 1, new Date());
    

    看到这样的代码,我也是醉醉的了。

    我就见过同事写出这样的代码,是赶时间呢,还是真的不会设计模式,一个构造函数参数能写这么多,且不说魔法值,这么长,看一眼都觉得头大。

    9、消失的异常

    try {
        ...
    } catch (Exception e) {}
    

    程序捕捉了异常,却不打印。

    try {
        ...
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    错误是输出来了,但没有输出到日志文件。

    try {
        ...
    } catch (Exception e) {
        logger.info("...", e);
    }
    

    日志级别用的不对,去错误日志文件里面死活找不着错误日志。

    上面的种种不规范的写法,在生产环境出现问题时,一方面导致排查问题艰难,另一方面,监控系统也不能及时地监控到异常。

    10、神奇的if

    最后一个了,压轴了。。

    来,我们一起赏析下这段神奇的 if 代码:

    if(user.getFirstName() != null)
        if(user.getMiddleName() != null)
            if(user.getLastName() != null)
                if(user.getNickName() != null)
                    if(user.getShortName() != null)
                        if(user.getFullName() != null)
                            if(user.getFamilyName() != null)
                                if(user.getEnglishName() != null)
                                    ...
                                    return true;
    return false;                                    
    

    这段代码够奇葩了吧,一个 if 能搞定的非要写这么长,还缩进得这么有层次感。。

    相关文章

      网友评论

        本文标题:代码写成这样,老夫无可奈何!

        本文链接:https://www.haomeiwen.com/subject/hkofvctx.html