zoukankan      html  css  js  c++  java
  • 设计模式之美学习-KISS原则(九)

    什么是KSS原则

    “Simple and Stupid” 尽量保证简单

    代码行数越少就越“简单”吗?

    需求

    一个合法的 IP 地址由四个数字组成,并且通过“.”来进行分割。每组数字的取值范围是 0~255。第一组数字比较特殊,不允许为 0。对比这三段代码,你觉得哪一段代码最符合 KISS 原则呢?如果让你来实现这个功能,你会选择用哪种实现方法呢?

    几种实现方式

    // 第一种实现方式: 使用正则表达式
    public boolean isValidIpAddressV1(String ipAddress) {
      if (StringUtils.isBlank(ipAddress)) return false;
      String regex = "^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\."
              + "(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\."
              + "(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)\."
              + "(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|\d)$";
      return ipAddress.matches(regex);
    }
    
    // 第二种实现方式: 使用现成的工具类
    public boolean isValidIpAddressV2(String ipAddress) {
      if (StringUtils.isBlank(ipAddress)) return false;
      String[] ipUnits = StringUtils.split(ipAddress, '.');
      if (ipUnits.length != 4) {
        return false;
      }
      for (int i = 0; i < 4; ++i) {
        int ipUnitIntValue;
        try {
          ipUnitIntValue = Integer.parseInt(ipUnits[i]);
        } catch (NumberFormatException e) {
          return false;
        }
        if (ipUnitIntValue < 0 || ipUnitIntValue > 255) {
          return false;
        }
        if (i == 0 && ipUnitIntValue == 0) {
          return false;
        }
      }
      return true;
    }
    
    // 第三种实现方式: 不使用任何工具类
    public boolean isValidIpAddressV3(String ipAddress) {
      char[] ipChars = ipAddress.toCharArray();
      int length = ipChars.length;
      int ipUnitIntValue = -1;
      boolean isFirstUnit = true;
      int unitsCount = 0;
      for (int i = 0; i < length; ++i) {
        char c = ipChars[i];
        if (c == '.') {
          if (ipUnitIntValue < 0 || ipUnitIntValue > 255) return false;
          if (isFirstUnit && ipUnitIntValue == 0) return false;
          if (isFirstUnit) isFirstUnit = false;
          ipUnitIntValue = -1;
          unitsCount++;
          continue;
        }
        if (c < '0' || c > '9') {
          return false;
        }
        if (ipUnitIntValue == -1) ipUnitIntValue = 0;
        ipUnitIntValue = ipUnitIntValue * 10 + (c - '0');
      }
      if (ipUnitIntValue < 0 || ipUnitIntValue > 255) return false;
      if (unitsCount != 3) return false;
      return true;
    }

    第一种实现代码最少 利用正则表达式,但是并不满足KSS原则虽然代码行数最少,看似最简单,实际上却很复杂。这正是因为它使用了正则表达式 如果不熟悉正则表达式的同事是很难理解的,

    第二种跟第三种比较 第二种使用java工具类StringUtils和Integer实现减少了bug的出错率 所以 第二种是满足KSS 第三种并不满足增加了代码的复杂度和bug的出现机率

    注意:但是并不是代码实现复杂就就代表不满足KSS原则,因为有些复杂的业务场景会使用很多复杂的业务代码是不能避免,但是如果一个简单的功能而复杂化就不满足

    如何写出满足 KISS 原则的代码?

    1. 不要使用同事可能不懂的技术来实现代码。比如前面例子中的正则表达式,还有一些编程语言中过于高级的语法等。
    2. 不要重复造轮子,要善于使用已经有的工具类库。经验证明,自己去实现这些类库,出 bug 的概率会更高,维护的成本也比较高
    3. 不要过度优化。不要过度使用一些奇技淫巧(比如,位运算代替算术运算、复杂的条件语句代替 if-else、使用一些过于底层的函数等)来优化代码,牺牲代码的可读性。
  • 相关阅读:
    Android 中的 Service 全面总结
    数据库事务
    ADB server didn't ACK
    Eclipse中10个最有用的快捷键组合
    IoC框架
    Wifi相关的操作
    Hibernate generator小结
    不朽的青春
    JSCPC 2020 摸鱼记
    CCPC 2020 秦皇岛站 H题
  • 原文地址:https://www.cnblogs.com/LQBlog/p/12133963.html
Copyright © 2011-2022 走看看