产品-1-四眼原则

各位读者,早上好!

这里从产品角度介绍下“四眼原则”。自从产品有一次再开发中提出“四眼原则”的设计想法后,很多版本的迭代,凡是涉及到审核的,基本都需要运用这种规则。

四眼原则—— 一个人提交的某种东西,自己不能立马审核,需要过“冷静期”之后自己方能审核;或者自己提交东西团队中不同的人可以立马审核。

优点:
为了避免在团队中自己提交东西自己审核,加强团队之间的监督和制约,也让自己“冷静”一段时间后重新审核自己提交的东西,避免当时提交时的思维盲点。

这里涉及2点:
1、这个业务有提交、审核的流程;
2、提交人、审核人、提交时间、冷静时间 四个关键要素。

需求提出来了,代码怎么抽象呢?看下一这段代码:

/**
以下代码是简化版,并非真实业务代码,但足够表达我要表达的意思
*/
@GET
@Path("list")
@RolesAllowed('OPERATOR','OPERATOR_ADMIN')
public List<BusinessDTOs> list(@QueryParam("offset") @DefaultValue("10")int offset, @QueryParam("limit") @DefaultValue("10")int limit){

List<BusinessDTOs> dtos = businessService.query(offset,limit);
return dtos;

}

上面这段代码就是最终需要返回给前端的一个业务列表,具体什么列表是有业务决定的,四眼原则怎么抽象到代码中?加上四眼原则后,要达到的效果是这样的:
1、该列表有”审核“按钮,如果不满足四眼原则,”审核“按钮不展示;展示需要过冷静期后方可审核;
2、对于团队其他成员,审核按钮是可以看到的(冷静期只是限制提交人);
3、冷静期过后,自己方可提交;

抽象出来就是这样:

package com.cmh.business;

import org.joda.time.DateTime;

import java.io.Serializable;

/**
 * @author:起舞的日子
 * @date: 2020/4/10 上午7:19
 */
public abstract class FourEyePriciple implements Serializable {

    /**
     * 是否可操作
     */
    private boolean operable;

    /**
     * 不可操作原因
     */
    private String notOperableReason;

    public void apply(String submitter, String auditor, DateTime submittedTime, int fourEyeHours) {
        if (!submitter.equals(auditor)) {
            operable = true;
            return;
        }
        if (submittedTime == null) {
            operable = true;
            return;
        }
        if (submittedTime.plusHours(fourEyeHours).isBeforeNow()) {
            operable = true;
            return;
        }
        operable = false;
        notOperableReason = String.format("待团队成员确认,请于%d小时候操作", fourEyeHours);

    }
}


下一步让BusinessDTO继承一下FourEyePriciple,然后在Resource层遍历下DTOs调用下方法即可。

@GET
@Path("list")
@RolesAllowed('OPERATOR','OPERATOR_ADMIN')
public List<BusinessDTOs> list(@QueryParam("offset") @DefaultValue("10")int offset, @QueryParam("limit") @DefaultValue("10")int limit){

List<BusinessDTOs> dtos = businessService.query(offset,limit);
dtos.foreach(e->{
	e.apply(dto.getCreatedBy(),dto.getCurrentUserId(),dto.getCreatedTime,foreEyeHours);

});
return dtos;

}

这个fourEyeHours就走配置,支持灵活调整。

好了,以后关于设计的一些零碎想法就作为”产品“系列发布吧。

再会!

发布了181 篇原创文章 · 获赞 66 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/meiceatcsdn/article/details/105425071