引言
- 在开发系统资源库项目的过程中,发现自己的代码有多处不规范之处;
- 本文总结了JavaEE Web的一些开发规范,尤其是RESTful设计模式的一些常见的规范,以警示自己编写代码必须要规范、可维护、可扩展;
数据库设计和命名规范
- 库表名称、字段名称含义明确,并且使用snake_case命名,避免使用特殊符号和sql关键字;
- 字段应当具有原子性,不可再分;
- Table用单数,Column用单数;
- 代表个数、次数等数量概念的,用count,比如
xxx_count
; - 时间类型统一规定命名为xxx_date的形式,并且带上timezone;
- boolean类型的命名要用
is_xxx
格式,比如在业务上删除一条记录时,并不会将本条记录真正从数据库中删除,而是将is_deleted
字段置为相应的值; - 每个表都要有主键,名称是id,类型为bigint;
- 一个字段不要有多个用途;
- varchar的缺省长度是255,varchar(50)并不比varchar(255)节省空间,因为这个空间只在需要时才分配,而不会提前分配,使用varchar(255)可以提升系统的可持续性;
- 必须避免不同数据库表的数据冗余,数据冗余很容易造成数据的不一致性;
- 不同的数据库表间应当尽量解耦,这样可以保证每个表只存储他该存储的信息,库表间可用外键连接;
- 关于数据库表设计,可参考这里;
RESTful设计规范
- 我画了一张图清晰地说明了再用Java开发Web应用时,如果使用RESTful设计模式,应该遵循的架构:
- 对上图的说明:
- REST层只向client提供数据接口,不进行数据查询和处理;
- Service层向REST提供各种数据和服务,是进行数据处理最重要的一层;
- DAO层内含有各种SQL语句,以便查询;
- entity是数据库中一条记录的映射对象;
- entity manager对象根据相关的配置文件(如persistence.xml),在EJB容器中,负责数据库连接的管理、释放等工作;
- 数据库保存数据;
- 不同的REST和Dao之间不要传递数据,如果一个Service需要另一个Service的数据,可相互传递;
- EntityManager实例化的两种方式:
1
2
3
4
5//方法一:通过createEntityManagerFactory方法实例化
EntityManager em = Persistence.createEntityManagerFactory("cn.com.haohandata_ResourceStore_war_1.0-SNAPSHOTPU") .createEntityManager();
//方法二:通过@PersistenceContext注入
@PersistenceContext(unitName = "cn.com.haohandata_ResourceStore_war_1.0-SNAPSHOTPU")
private EntityManager em;
RESTful API设计规范(老师总结)
- 原则:
- 资源(URL)永远是名词,操作(HTTP方法)永远是动词;
- GET永远不应该修改对象内容;
- 基本形式
GET /weibo
- 获取微博列表GET /weibo/12
- 获取某个微博POST /weibo
- 创建微博PUT /weibo/12
- 修改某个微博PATCH /weibo/12
- 部分修改某个微博DELETE /weibo/12
- 删除某个微博
- 有关系的资源
GET /weibo/12/comment
- 获取某个微博的评论列表GET /weibo/12/comment/5
- 获取某个微博的某个评论POST /weibo/12/comment
- 创建微博的评论PUT /weibo/12/comment/5
- 修改某个微博的某个评论PATCH /weibo/12/comment/5
- 部分修改某个微博的某个评论DELETE /weibo/12/comment/5
- 删除某个微博的某个评论
- 不太能归类为CRUD的操作
PUT /weibo/12/like
- 给某个微博点赞DELETE /weibo/12/like
- 删除某个微博的赞
- 过滤、排序、搜索等
GET /weibo?deleted=true
- 得到所有标记为删除的微博GET /weibo?sort=-create-date
- 按照创建日期反序排序得到微博列表GET /weibo?sort=comment-count,-create-date
- 先按微博评论数再按创建日期反序排序得到微博列表GET /weibo?keyword=xxx
- 得到包含关键字xxx的微博列表GET /weibo?keyword=xxx&deleted=true&sort=comment-count,-create-date
- 搜索关键字包含xxx的标记为删除的微博,按照评论数再按创建日期反序排序得到微博列表
- 常用的查询可以独立出来
GET /weibo/top10
- 得到最热前10名的微博列表
- 这里写得非常不错
编写Java代码需要注意
- 参考这里
- 保持方法简短扼要
- 永远永远不要将同一个变量用于不同的目的
- 尽可能让变量和方法的名称能够描述要实现的功能
- 尽可能将变量定义在最靠近它们的地方
- 不要出现让人费解的数字
- 要像对待朋友一样对待你擅长的语言
- 不要逆常规而行
- 千万小心过早的优化代码
- 要常常重构经过测试的代码
- 不要沉溺于过度的设计技巧
- 随时随地学习新的知识