后端编码规范
后端代码规范是一组约定和准则,旨在规范后端开发人员编写代码的风格、结构和组织方式,以提高代码的可读性、可维护性和可扩展性。默认以阿里规约为准。
除了阿里规约里的约束外,以下几点必须要遵守:
- 避免for循环嵌套超过2层。
- if、else嵌套不超过2层。不满足的条件的情况可以业务及时返回。
- 避免for 循环增删改查。
- 禁止controller层写很多业务代码实现。
- 减少代码中的魔鬼文。
后端代码规范。持续补充...
关键词解释
【强制】必须遵守。其他视实际情况而定。
参数合法性验证
统一使用spring boot validate
提供的验证注解来实现以及框架自带的自定义验证注解。以下是一些示例
java
/**
* 签到任务
*
* @author mjyang
* @date 2022/10/17 10:51
*/
@Data
public class SigninTaskInputDto {
@ApiModelProperty("是否启用")
private Boolean enabled;
@ApiModelProperty("图标")
@NotBlank(message = "图标不能为空")
private String iconUrl;
@ApiModelProperty(value = "签到方式", notes = "com.wmeimob.mall.core.mall.user.signin.value.SigninType")
@NotNull(message = "签到不能为空")
@RangeExtend(value = SigninType.class, message = "签到方式有误")
private Integer type;
@ApiModelProperty("签到周期")
@NotNull(message = "签到周期不能为空")
@Range(min = 1, max = 1, message = "签到周期应为1")
private Integer cycle;
@ApiModelProperty("奖励方式 1: 积分")
@NotNull(message = "奖励方式不能为空")
@Range(min = 1, max = 1, message = "奖励方式应为1")
private Integer rewardType;
@ApiModelProperty("说明")
private String description;
}
以下是内置的注解
注解 | 校验功能 |
---|---|
@AssertFalse | 必须是false |
@AssertTrue | 必须是true |
@DecimalMax | 小于等于给定的值 |
@DecimalMin | 大于等于给定的值 |
@Digits | 可设定最大整数位数和最大小数位数 |
@Email | 校验是否符合Email格式 |
@Future | 必须是将来的时间 |
@FutureOrPresent | 当前或将来时间 |
@Max | 最大值 |
@Min | 最小值 |
@Negative | 负数(不包括0) |
@NegativeOrZero | 负数或0 |
@NotBlank | 不为null并且包含至少一个非空白字符 |
@NotEmpty | 不为null并且不为空 |
@Null | 为null |
@Past | 必须是过去的时间 |
@PastOrPresent | 必须是过去的时间,包含现在 |
@PositiveOrZero | 正数或0 |
@Size | 校验容器的元素个数 |
@Pattern | 正则验证 |
除上面所列的之外,还可以查看框架目前支持的自定义验证注解,另外还可以自己扩展。如下:
java
/**
* 枚举扩展验证
*
* @author mjyang
* @date 2022/11/11 15:35
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Constraint(validatedBy = RangeExtendValidatorClass.class)
public @interface RangeExtend {
Class<? extends EnumValue>[] value();
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
java
/**
* 枚举扩展验证器
*
* @author mjyang
* @date 2022/11/11 15:35
*/
public class RangeExtendValidatorClass implements ConstraintValidator<RangeExtend, Integer> {
private Class<? extends EnumValue>[] values;
@Override
public void initialize(RangeExtend flagValidator) {
this.values = flagValidator.value();
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
if (ObjectUtil.isNull(value)) {
return true;
}
for (Class<?> clazz : this.values) {
if (!EnumValue.class.isAssignableFrom(clazz)) {
continue;
}
final Enum<?>[] enums = (Enum<?>[]) clazz.getEnumConstants();
if (null == enums) {
return false;
}
return Arrays.stream(enums).anyMatch(x -> ObjectUtil.equal(((EnumValue) x).getValue(), value));
}
return true;
}
}