• 失火的夏天
    2020-01-20
    争哥,老实说,这个小王是不是曾经的你
     7
     25
  • 李小四
    2020-01-20

    设计模式_34
    Logger的方法一般不会有未决行为,不影响可测试性,不用依赖注入。

    以前看代码质量是看感觉,现在开始有章法了。
    
     10
  • 辣么大
    2020-01-20
    小wang同学的代码还是有小问题。随机字符的代码是无法取到小写字母z的。
    因为业务要求随机字符包括大小写和数字,在代码中写到 int randomAscii = random.nextInt(122)
    java中nextInt取的是[lower, upper),z的ascii是122,所以程序是取不到z字符的。
    争哥的例子告诉我们尽量不要用魔数,不但可读性不好,有时我们自己都糊涂,边界容易搞错。

    我试着重写了一下,一起讨论讨论!
    https://github.com/gdhucoder/Algorithms4/blob/master/designpattern/u34/IdGenerator.java

      public static final String BASE62 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
      private static final char[] CHAR_SET = BASE62.toCharArray();

      public static String generate() {

        // get host name
        String hostName = null;
        try {
          hostName = InetAddress.getLocalHost().getHostName();
          String[] tokens = hostName.split("\\.");
          hostName = tokens[tokens.length - 1];
        } catch (UnknownHostException e) {
          hostName = "UNKNOWN";
        }

        // random chars
        char[] randomChars = new char[8];
        Random random = new Random();
        for (int i = 0; i < randomChars.length; i++) {
          int rndIdx = random.nextInt(CHAR_SET.length);
          randomChars[i] = CHAR_SET[rndIdx];
        }

        // generate id
        String id = String.format("%s-%d-%s", hostName,
            System.currentTimeMillis(), new String(randomChars));

        return id;
      }
    展开

    作者回复: 😂 我改下

     3
     9
  • pedro
    2020-01-20
    争哥这一节跟马丁那本<重构>的第一章有异曲同工之妙。
    如果大家觉得意犹未尽,可以尝试动手去学学重构的第一章,然后动手实践一下🤪
    
     5
  • Jackey
    2020-01-20
    我要把这个checklist打印出来贴桌子上
    
     4
  • seckiller
    2020-01-20
    王争大佬以后课多带点实战代码

    作者回复: 这节课里的代码不就是吗

    
     4
  • 程斌
    2020-01-20
    很好的一篇checklist,算是对我们前边学的整理起来了。棒棒。
    
     2
  • liu_liu
    2020-01-20
    没有必要,不需要在这里测试 logger
    
     2
  • 下雨天
    2020-01-20
    课堂讨论
        日志系统设计属非业务相关模块,从可复用性,单一职责,高内聚低耦合考虑,最好设计成单独模块,以便其他类复用!
        Logger对象是一个单例全局对象才合理,如果通过依赖注入到IdGenerator中就显得有点多余了!
    
     2
  • 平风造雨
    2020-01-20
    slf4j本身已经支持的不同Logger的实现,配合lombok,自己直接定义static logger是没有必要的,可以替换掉。Logger本身并不是业务需求关注的点,也不是非功能性需求特别关注的点,没必要为了依赖注入而注入,更何况Logger本身可以通过配置的方式改变处理log的方式,已经很灵活了。
    
     2
  • potato00fa
    2020-01-24
    真干货,妙啊
    
     1
  • 相逢是缘
    2020-01-23
    打卡,这个是后续可以打印出来,对代码进行检测
    如何发现代码质量问题:
    大的方向是否可读、可扩展、可维护、灵活、简洁、可复用、可测试
    具体落实,通用的关注点有:
    1)目录设置是否合理、模块划分是否清晰、代码结构是否满足“高内聚、松耦合”?
    2)是否遵循经典的设计原则和设计思想(SOLID、DRY、KISS、YAGNI、LOD 等)?
    3)设计模式是否应用得当?是否有过度设计?
    4)代码是否容易扩展?如果要添加新功能,是否容易实现?
    5)代码是否可以复用?是否可以复用已有的项目代码或类库?是否有重复造轮子?
    6)代码是否容易测试?单元测试是否全面覆盖了各种正常和异常的情况?
    7)代码是否易读?是否符合编码规范(比如命名和注释是否恰当、代码风格是否一致等)?

    关于业务的一些通用关注点:
    1)代码是否实现了预期的业务需求?
    2)逻辑是否正确?是否处理了各种异常情况?
    3)日志打印是否得当?是否方便 debug 排查问题?
    4)接口是否易用?是否支持幂等、事务等?
    5)代码是否存在并发问题?是否线程安全?
    6)性能是否有优化空间,比如,SQL、算法是否可以优化?
    7)是否有安全漏洞?比如输入输出校验是否全面?
    展开
    
     1
  • 黄林晴
    2020-01-20
    打卡✔
    
     1
  • 代码搬运工
    2020-01-20
    我做的项目开发都是这样定义的,这个有问题吗?
     1
     1
  • 小晏子
    2020-01-20
    不必要把logger依赖注入进去,logger是可以直接初始化的业务无关的,不依赖于外部接口,不影响单元测试,可以忽略掉,所以不需要改成依赖注入的。
    
     1
  • whistleman
    2020-01-20
    滴滴。打卡~
    
     1
  • 0bug
    2020-01-20
    catch包裹的代码太多了
    
     1
  • aof
    2020-02-06
    这个两个checklist可以作为以后检查自己代码的标准了
    
    
  • Monday
    2020-01-31
    新年第一卡
    
    
  • javaadu
    2020-01-25
    这个logger没有未决行为,不影响可测试性。我之前的一篇文章里提到过,将logger对象设置成static的原因是确保日志对象每个类一份、设置成final的原因是避免日志对象在运行时被修改。https://mp.weixin.qq.com/s/1OpvN8_dzIDWYBDiICU6yw
    
    
我们在线,来聊聊吧