Skip to content

后端编码规范

后端代码规范是一组约定和准则,旨在规范后端开发人员编写代码的风格、结构和组织方式,以提高代码的可读性、可维护性和可扩展性。默认以阿里规约为准。

除了阿里规约里的约束外,以下几点必须要遵守:

  • 避免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;
    }
}