持续补充中...
原作者@小松
Java后端开发规约补充
命名规范
命名常常被认为是编程中的细节问题,但是其重要性往往被低估。而所谓的优雅代码往往就体现在这些细节当中,一个名字虽然不能影响程序的执行,但是却对代码的表达力和可读性有着重要的影响。在程序员工作中,大部分的时间都是在阅读和理解代码,好的命名能够让代码的概念清晰,增加代码的表达力;词不达意的命名会破幻我们思考的连贯性,分散有限的注意力。
有意义的命名
- 变量名
变量名应该是名称,能够正确的描述业务,有表达力。如果一个变量名需要注释来补充说明,很有可能说明命名就有问题。
- int day; //表示过去的天数
- int pastDays;
观察上面的第一个命名,不看注释的情况下,我们第一直觉就是"天",阅读代码的人为了知道这个‘day’的含义,就得去结合上下推测其含义。类似的还有一些‘魔法字符’,应该尽可能使用常量定义。
- 函数名
函数命名要具体,空泛的命名没有意义。例如“processData()”就不是一个好的命名,因为绝大多数的防范都是对数据的处理,这样的命名并没有表面要做什么事情,相比之下 “validateBill()” 类似的具体的命名就要好得多。
- 类名
类是面向对象中最关键的概念之一,是一组数据和操作的封装。对于一个系统而言,其实可以大致分为两大类:实体类和辅助类。
实体类承载核心的业务数据和核心的业务逻辑,其命名应该充分体现业务语义,并在团队内部达成共识,例如 Customer、Employee 等等。
辅助类是辅助实体一起完成业务逻辑的,其命名要能够通过后缀来体现功能。例如用来为 customer做控制路由的控制类 CustomerController,提供Customer服务的服务类 CustomerService。
- 包名
包代表着一组有关系的类的集合,往往起到分类组合和命名空间的作用。包名应该能够反映一组类在更高层面的抽象,例如有一组类:Apple、Pear、Orange,我们可以考虑将其放入名为 ‘fruit’ 包中。
- 模块名
TODO
保持命名的一致性
每个概念或者动作应该对应一个词.例如,get、find、query、fetch 都可以表示查询的意思,理想状况下对一些标准的CURD操作应该统一固定。
*
CRUD操作 | 方法名约定 |
新增 | create |
添加 | add |
删除 | remove |
修改 | update |
查询单个 | get |
查询列表 | list |
分页查询 | page |
统计 | cout |
使用对仗词汇
使用对仗词的命名规则有助于保持一致性,从而提高代码的可读性。实例如下:
- add/remove(delete)
- increment/decrement
- open/close
- insert/delete
- ......
使用后置限定词
日常开发中经常会有表示计算结果的变量,例如总金额、平均值、最大值等等。我们可以使用
Total 、Sum、Average、Max、Min 这样的限定词加到名字最后面,例如:revenueTotal(总收入)。
统一业务语言
为什么要统一业务语言呢?试想一下如果你明天和需求或者业务方讨论的是一种编程语言,而在团队内部交流、设计画图、建模使用的是另外一种语言,这大概率会降低代码的拜倒能力,在业务语言和文档、代码之间出现一条巨大的鸿沟。
统一语言就是要保证团队在内部的交流、模型、代码和文档中都要使用同一种语言。实际上统一语言也是领域驱动设计的最为重要的的概念之一。
编码规范
代码风格规约
- 写完代码记得ctrl+alt+L对齐代码(统一使用idea默认字符格式)
分支管理规范
分支命名规约
*
前缀 | 含义 |
master | 主分支,可用的、稳定的、可直接发布的版本 |
develop | 开发主分支,最新的代码分支 |
feature-** | 功能开发分支 |
bugfix-** | 未发布bug修复分支 |
release-** | 预发布分支 |
hotfix-** | 已发布bug修复分支 |
提交命名规约
除了分支的名称需要规范,提交的命名也同样如此。
格式为:[操作类型]操作对象名称,如[ADD]readme,代表增加了readme描述文件。
常见的操作类型有:(待定:可结合IDEA commit 插件、或者其他工具)
- [IML] 实现正在开发的功能
- [UPDATE] 更新或改善已经实现的功能
- [FIX] 修复BUG
- [REF] 重构一个功能,对功能重写
- [ADD] 添加实现新功能
- [DEL] 删除不需要的文件
版本号规范
版本格式:主版本号.次版本号.修订号,版本号递增规则如下:
- 主版本号:当你做了不兼容的 API 修改。
- 次版本号:当你做了向下兼容的功能性新增。
- 修订号:当你做了向下兼容的问题修正。
先行版本号及版本编译信息可以加到“主版本号.次版本号.修订号”的后面,作为延伸。
数据库设计规范
TODO
Redis使用规范
键值设计
- Key名设计
- 可读性与可管理性
- -- 业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id
- ugc:video:1
- 简洁性
- -- 证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:
- user:{uid}:friends:messages:{mid} 简化为 u:{uid}:fr:m:{mid}。
- 不要包含特殊字符
反例:包含空格、换行、单双引号以及其他转义字符
- Value值设计
防止BigKey
string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000
反例:一个包含200万个元素的list。
字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除,同时要注意防止bigkey过期时间自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞。
命令使用
- O(N)命令需要考虑N的数量
...