自我日常开发规范
作者:互联网
1、controller定义
接口定义时,尽量向resultful 风格靠拢
比如创建一个用户的API,定义好统一的前缀,按照模块化设置名称,比如@RequestMapping("user")
增删改查接口不要定义为 addUser delUser这样
使用 @GetMapping、@PostMapping 比较简洁
@RestController
@RequestMapping("users")
public class UserController {
@GetMapping("/status/check")
public String status() {
return "working";
}
@GetMapping("/{id}")
public String getUser(@PathVariable String id) {
}
@PostMapping
public String createUser() {return "HTTP POST was called";
}
}
2、封装方法形参
调用其他方法时,参数三个以上必须封装成对象,禁止多个参数传递,容易出错,并且看着难受
@RequestMapping(path = "getVehicleList", method = RequestMethod.POST)
public Response getVehicleList(
@ApiParam("车辆品牌ID") @RequestParam(name = "brandId", required = false) Long brandId,
@ApiParam("车系ID") @RequestParam(name = "seriesId", required = false) Long seriesId,
@ApiParam("车型ID") @RequestParam(name = "modelId", required = false) Long modelId,
@ApiParam("vin") @RequestParam(name = "vin", required = false) String vin,
@ApiIgnore Page page) {
List<Vehicle> vehicles = vehicleHandler.getVehicleList(brandId,seriesId,modelId,vin,page);
3、封装业务逻辑
每一个方法做好一件事,禁止在一个方法体内堆砌代码,完成所有业务逻辑
主方法中调用这些方法,添加注释达到一目了然的效果
下面是一个很好的例子,一个大业务里面有多个小业务,不同的业务调用不同的 service 方法即可,后续接手的人即使没有流程图等相关文档也能快速理解这里的业务
@Transactional
public ChildOrder submit(Long orderId, OrderSubmitRequest.Shop shop) {
ChildOrder childOrder = this.generateOrder(shop);
// 校验优惠券
orderAdjustmentService.validate(shop.getOrderAdjustments());
// 订单商品
orderProductService.add(childOrder, shop);
// 处理订单地址信息
processAddress(childOrder, shop);
// 最后插入订单
childOrderMapper.insert(childOrder);
// 发送订单创建事件
applicationEventPublisher.publishEvent(new ChildOrderCreatedEvent(this, shop, childOrder));
return childOrder;
}
4、 映射数据库的属性尽量不要用基本类型
int/long 用它的包装类型Integer,Long, 入库时 没有就算null
int/long 等基本数据类型作为成员变量默认值是 0。 入库时 没有容易为 0
现在流行使用mybatis 等 ORM 框架,在进行插入或者更新的时候很容易会带着默认值插入更新到数据库。
5、 封装判断条件
当有很多条件判断时,也尽量去封装,提升可读性
public void method(LoanAppEntity loanAppEntity, long operatorId) {
if (LoanAppEntity.LoanAppStatus.OVERDUE != loanAppEntity.getStatus()
&& LoanAppEntity.LoanAppStatus.CURRENT != loanAppEntity.getStatus()
&& LoanAppEntity.LoanAppStatus.GRACE_PERIOD != loanAppEntity.getStatus()) { //... return; }
这段代码的可读性很差,这 if 里面谁知道干啥的?我们用面向对象的思想去给 loanApp 这个对象里面封装个方法不就行了么?
public void method(LoanAppEntity loan, long operatorId) {
if (!loan.finished()) {
//...
return;
}
6、不要重复造轮子
利用好现有的工具类和方法,比如对集合、时间的处理,一些现有的业务方法。尽量利用现有的
不要自己写,造成重复劳动,并且多搞了很多类和方法
7、使用 @ConfigurationProperties 代替 @Value
-
多个类似属性使用@ConfigurationProperties 是更好的
可以注入多个属性,@Value 只能一个一个写 -
在项目 application.yml 配置文件中按住 ctrl + 鼠标左键点击配置属性可以快速导航到配置类。写配置时也能自动补全、联想到注释。需要额外引入一个依赖 org.springframework.boot:spring-boot-configuration-processor 。
-
@ConfigurationProperties 支持 NACOS 配置自动刷新,使用 @Value 需要在 BEAN 上面使用 @RefreshScope 注解才能实现自动刷新
8、写有意义的方法注释
这样的注释就不好,第一描述过于简单,其次每个参数列出来却没有说明,不如不列参数
/**
* 请求电话验证
*
* @param credentialNum
* @param callback
* @param param
* @return PhoneVerifyResult
*/
###
标签:shop,childOrder,return,自我,Long,规范,日常,封装,public 来源: https://www.cnblogs.com/cherychina/p/16054222.html