在开发过程中 很多时候会遇到一些很低端的错误 为了避免这些错误 通过定制规则来减少错误
开发相关
- 循环次数设置上限 避免使用递归 方式代码失控
- 字符串比较 最好用已知的固定的去比较不确定的
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
4ALTER 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
禁止使用float
和double
- [强制]不要使用
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
- 你可以使用