欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

产品-1-四眼原则

程序员文章站 2022-05-29 22:48:17
...

各位读者,早上好!

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

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

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

这里涉及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就走配置,支持灵活调整。

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

再会!

相关标签: 产品