工单 id (Ticket ids)

让我们再思考一下我们的工单管理系统。
当前我们的工单模型是这样:

pub struct Ticket {
    pub title: TicketTitle,
    pub description: TicketDescription,
    pub status: Status
}

这里漏了一样东西:用来唯一标识工单的标识符 (identifier)
该标识符对每张工单都应当唯一。这点可以通过在新工单创建时自动生成来保证。

细化模型 (Refining the model)

id 应当存放在哪里?
我们可以给 Ticket 结构体加一个新字段:

pub struct Ticket {
    pub id: TicketId,
    pub title: TicketTitle,
    pub description: TicketDescription,
    pub status: Status
}

但在创建工单之前我们并不知道 id,所以它不能从一开始就在那。
那它必须是可选的:

pub struct Ticket {
    pub id: Option<TicketId>,
    pub title: TicketTitle,
    pub description: TicketDescription,
    pub status: Status
}

这也不理想——每次从存储中取出工单时都要处理 None 情况,尽管我们知道工单创建之后 id 总应当存在。

最好的方案是:用两种独立的类型表示工单的两种状态 (state)——TicketDraftTicket

pub struct TicketDraft {
    pub title: TicketTitle,
    pub description: TicketDescription
}

pub struct Ticket {
    pub id: TicketId,
    pub title: TicketTitle,
    pub description: TicketDescription,
    pub status: Status
}

TicketDraft 是尚未创建的工单。它没有 id,也没有状态。
Ticket 是已创建的工单。它有 id 和状态。
由于 TicketDraftTicket 中每个字段都内嵌了自己的约束,我们不需要在两个类型间复制逻辑。

原文链接:英文原文