DDD从值对象列表中删除文本值对象

时间:2018-01-15 04:27:20

标签: go domain-driven-design value-objects

我有一个像这样的值对象列表的实体:
(我使用Go,但我希望它通常有意义)

// this is my Crop entity
type Crop struct {
    UID uuid.UUID
    Name string
    Type string
    Notes []CropNote // This is a list of value object.
} 

// This is my CropNote value object
type CropNote struct {
    Content string
    CreatedDate time.Time
}

我有AddNewNote(content string)的裁剪行为。但业务流程也需要删除注释行为。我在思考类似RemoveNote(content string)行为的事情。因此,我将迭代Crop.Notes,找到具有相同content的行,然后从Crop.Notes列表中删除该行。但我认为通过其笔记的内容找到价值是容易出错的。从API的角度来看也很奇怪,因为我需要将内容发送到参数。

我的问题是,如何在上面实现我的删除注释行为?

编辑: 对不起,我想我自己也不清楚 我知道如何从切片中删除一个值 我的问题是关于DDD。关于如何从Crop.Notes列表中删除仅包含上述字段的值对象。因为我们知道Value Object不能有Identifier 如果我真的只能使用我的值对象中的ContentCreatedDate字段,那么当我执行REST API请求时,我应该将ContentCreatedDate值发送到端点这很奇怪。

2 个答案:

答案 0 :(得分:0)

除了@WeiHuang的回答: 如果您的笔记是无序列表,则可以使用swap而不是appendcopy

func (c Crop) removeNote(content string) {
    j:=len(c.Notes)
    for i:=0;i<j;i++ {
        if c.Notes[i]==content {
            j--
            c.Notes[j],c.Notes[i]=c.Notes[j],c.Notes[i]
        }
    }
    c.Notes=c.Notes[:j]
}

答案 1 :(得分:0)

只需使用CropNote本身的实例:

/* sorry for sudo code, not up with GO */
func (c Crop) removeNote(noteToRemove CropNote) {
    c.Notes= c.Notes.RemoveItem(noteToRemove); /* RemoveItem() is your own array manipulation code */
}

现在由您的应用层确定并调用删除注释。

要考虑的其他事项:

为什么作物笔记是Crop聚合根的一部分?作物的行为受到音符的影响还是作物行为会影响音符?不要尝试在域内重建您的数据模型,它没有意义。如果您的系统需要独立添加/删除/更新作物注释,它们可能更好地作为它们自己的聚合根,它们间接依赖于现有的作物实体,例如:

/*again, not proficiant with GO - treat as sudo code */
private type CropNote struct {
    UID uuid.UUID
    CropUID uuid.UUID
    Content string
    CreatedDate time.Time
}

function NewCropNote(crop Crop, content string) *CropNote{
    cn := new(CropNote)
    cn.UUID = uuid.new()
    cn.CropUID = crop.UUID
    cn.CreatedDate = now()
    cn.Content = content
    return cn
}