Skip to content

DDD中充血模型的贴身职责如何理解 #7

@JoeCao

Description

@JoeCao

如何体现贴身职责,这里有个例子
敏捷开发中,有个功能是将一个BackLog Item提交到某个Sprint中,我们要用代码体现出来这个行为

public class BacklogItem extends Entity {
    private String sprintId;   //标识backlog item属于哪个sprint
    private BacklogItemStatusType status;   //标识当前backlog状态,是已经加入sprint,还是在待制品中,还是完成了
     ...
    public void setSprintId(String sprintId) {
       this.sprintId = sprintId
    }  
    public void setStatus(BacklogItemStatusType status) {
        this.status = status
    }
}

按照平常的习惯,客户端发起将backlog加入sprint,会把spintId填入,然后修改backlog item的状态为committed。

backlogitem.setSprintId(sprintId)
backlogitem.setStatus(BacklogItemStatusType.COMMITTED)

但是这样的写法完全是把内部逻辑暴露到客户端了,后续接手的人也搞不清楚commit到sprint的动作,是需要填写一个id,再改一个状态的
如果该backlog已经被提交到一个sprint了,还需要检查是否已经被提交过?
万一客户端忘了改状态怎么办?
万一后面还要增加改一个backlog的type属性怎么办?
最好的办法是把commit操作丢给backlog自己实现

public class BacklogItem extends Entity {
    private String sprintId;   //标识backlog item属于哪个sprint
    private BacklogItemStatusType status;   //标识当前backlog状态,是已经加入sprint,还是在待制品中,还是完成了
    public void commitTo(Sprint aSprint) {
        if (!this.isScheduledForRelease()) {
           throw new IllegalStateException(“Must be scheduled for release to commit to sprint.”);
        }
        if (this.isCommittedToSprint()) {
            if (!aSprint.getSprintId().equals(this.sprintId)) {
                this.uncommitFromSprint();
            }
        }
        this.elevateStatusWith(BacklogItemStatus.COMMITED);
        this.setSprintId(aSprint.getSprintId());
        //下面该发布Event了,代码略

    }
}

这样的话客户端的代码是

backlogitem.commitTo(sprint);

这个代码就完全体现了领域行为,将backlog提交到sprint中

版权说明

本文采用 CC BY 3.0 CN协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。

关注我

微信公众号
qrcode_for_8

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions