用途
本技能用于 Rust 的类型驱动设计(Type-Driven Design),属于“语言机制”层。它要回答的核心问题是:类型系统如何阻止非法状态?在引入运行期检查之前,先追问:编译器能否捕获这个错误?非法状态能否变得不可表示?类型能否编码这个不变量?
主要能力
技能提供“错误 → 设计问题”的对照思路,把常见说法转化为设计提问:
- 原始类型偏执(primitive obsession):“它只是个字符串” → 这个值代表什么?
- 布尔标志:“加一个 is_valid 标志” → 状态能否成为类型?
- 到处使用 Option:“检查 None” → 缺失真的可能发生吗?
- 运行期校验:“非法就返回 Err” → 能否在构造时校验?
它还给出思考提示:在添加运行期校验前,先问类型能否编码约束(数值范围 → 有界类型或 newtype;合法状态 → 类型状态模式;语义含义 → newtype);校验在何时可能(构造时 → 已验证 newtype;状态转换时 → 类型状态;只能在运行期 → 带清晰错误的 Result);谁需要知道这个不变量(编译器 → 类型级编码;API 使用者 → 清晰的类型签名;仅运行期 → 文档)。
模式与示例
技能列出以下模式及其用途:
- Newtype:类型安全,示例
struct UserId(u64); - Type State:状态机,示例
Connection<Connected> - PhantomData:变型/生命周期,示例
PhantomData<&'a T> - Marker Trait:能力标记,示例
trait Validated {} - Builder:渐进式构造,示例
Builder::new().name("x").build() - Sealed Trait:阻止外部实现,示例
mod private { pub trait Sealed {} }
Newtype 示例展示了“校验一次,永久信任”:
struct Email(String); // Not just any string
impl Email {
pub fn new(s: &str) -> Result<Self, ValidationError> {
// Validate once, trust forever
validate_email(s)?;
Ok(Self(s.to_string()))
}
}
Type State 示例展示了编译期状态校验:
struct Connection<State>(TcpStream, PhantomData<State>);
struct Disconnected;
struct Connected;
struct Authenticated;
impl Connection<Disconnected> {
fn connect(self) -> Connection<Connected> { ... }
}
impl Connection<Connected> {
fn authenticate(self) -> Connection<Authenticated> { ... }
}
使用方式
技能提供“向上追溯”和“向下落地”的路径。向上追溯用于类型设计不清晰时,例如“需要校验邮箱格式”时,追问这是否是领域值对象,并检查 m09-domain(Email 作为值对象)以及 domain-*(校验需求)。向下落地用于从设计到实现:需要原始类型的类型安全包装 → Newtype;需要编译期状态校验 → Type State;需要追踪幻影类型参数 → PhantomData;需要能力标记 → Marker Trait;需要渐进式构造 → Builder。
决策指南
- 原始类型的类型安全 → Newtype
- 编译期状态校验 → Type State
- 生命周期/变型标记 → PhantomData
- 能力标志 → Marker Trait
- 渐进式构造 → Builder
- 封闭的实现集合 → Sealed Trait
- 零大小类型标记 → ZST struct
反模式
技能列出应避免的做法:用布尔标志表示状态(运行期错误,应改用类型状态);用字符串表示语义类型(无类型安全,应改用 newtype);用 Option 表示未初始化(不变量不清晰,应改用 builder);带不变量的公开字段(会破坏不变量,应改为私有字段加已验证的 new())。
适用场景与限制
适用于 Rust 项目中需要类型安全、状态机设计、能力标记、渐进式构造、封闭实现集合等场景。相关技能包括:领域建模见 m09-domain,trait 设计见 m04-zero-cost,构造函数中的错误处理见 m06-error-handling,反模式见 m15-anti-pattern。关于该技能的具体安装方式、收费情况、平台支持等信息,资料中暂未提供。