-
Notifications
You must be signed in to change notification settings - Fork 69
DDD中充血模型的贴身职责如何理解 #7
Copy link
Copy link
Open
Description
如何体现贴身职责,这里有个例子
敏捷开发中,有个功能是将一个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协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
关注我
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
