喵♂呜 的博客

一个刚毕业就当爹的程序猿 正在迷雾中寻找道路...

程序编码规则

在开发过程中 很多时候会遇到一些很低端的错误 为了避免这些错误 通过定制规则来减少错误

开发相关

  • 循环次数设置上限 避免使用递归 方式代码失控
  • 字符串比较 最好用已知的固定的去比较不确定的
    • result.getString("error_code").equals("gw.TimestampExpired")
    • "gw.TimestampExpired".equals(result.getString("error_code"))
    • 上述两种方法 第一种可能会产生空指针错误 而第二种则不会

断言相关

  • 断言用于检查程序运行中本不应该出现的的异常情况 断言密度因保持在每个函数至少2个

    断言的另一个重要之处在于,它是防御性编程(Defensive Coding)策略的重要组成部分。我们可以使用断言验证函数执行前后的状况,函数的执行参数和返回值,以及循环不变式(Loop-Invariant)。在完成性能关键代码的测试工作后,可将断言选择性地禁用。

网络请求

  • 所有网络请求必须有超时时间设定 防止长时间请求占用资源

线程相关

  • 需要大量线程操作的地方必须使用线程池 线程的创建和销毁很消耗资源

数据库相关

  • [强制]所有表必须添加的字段
    • id 不得表示任何业务逻辑
    • gmt_create 创建时间 类型为 TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
      1
      ALTER TABLE `table` ADD gmt_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间';
    • gmt_modified 修改/更新时间 类型为 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL
      1
      ALTER TABLE `table` ADD gmt_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '修改时间';
    • is_deleted 软删除标记(1:已删除, 0:未删除) 类型为 TINYINT(1) UNSIGNED DEFAULT 0 NOT NULL
      1
      ALTER TABLE `table` ADD is_deleted TINYINT DEFAULT 0 NOT NULL COMMENT '软删除标记';
    • 统一字段添加SQL
      1
      2
      3
      4
      ALTER TABLE `table`
      ADD COLUMN `gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
      ADD COLUMN `gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间' AFTER `gmt_create`,
      ADD COLUMN `is_deleted` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '软删除标记' AFTER `gmt_modified`;
  • [强制]表达Boolean的类型 必须用 is_xxx 命名 数据类型都是 tinyint(1) UNSIGNED NOT NULL (1:True, 0:False)
  • [强制]小数类型请使用 decimal 禁止使用 floatdouble
  • [强制]不要使用 count(xxx)count(1) 之类来替代 count(*) 因为 count(*) 就是 SQL92 定义的标准统计行数的语法 跟数据库无关 跟 NULL 无关
  • [推荐]状态设计 必须使用数字 在程序使用枚举转换 数据库禁止使用字符串 (性能考虑) 为了防止修改需求插入状态 可以预先设计状态为 3 6 9
  • [推荐]把 IP 地址存成 UNSIGNED INT 尤其是当 你需要使用这样的WHERE条件 IP BETWEEN ip1 AND ip2 我们必需要使用 UNSIGNED INT 因为 IP地址会使用整个32位的无符号整形
    • 你可以使用 INET_ATON() 来把一个字符串IP转成一个整形 并使用 INET_NTOA() 把一个整形转成一个字符串IP

欢迎关注我的其它发布渠道