名称: 金融科技领域
描述: “构建金融科技应用时使用。关键词: 金融科技, 交易, 小数, 货币, 金融, 资金, 交易, 账本, 支付, 汇率, 精度, 舍入, 会计, 金融, 交易系统, 货币, 支付”
用户可调用: false
金融科技领域
层级3: 领域约束
领域约束 → 设计影响
| 领域规则 |
设计约束 |
Rust 实现含义 |
| 审计追踪 |
不可变记录 |
Arc<T>, 无突变 |
| 精度 |
不使用浮点数 |
rust_decimal |
| 一致性 |
交易边界 |
清晰的归属权 |
| 合规性 |
完整日志记录 |
结构化追踪 |
| 可重现性 |
确定性执行 |
无竞态条件 |
关键约束
金融精度
规则: 绝不使用 f64 表示货币
原因: 浮点数会丢失精度
RUST: 使用 rust_decimal::Decimal
审计要求
规则: 所有交易必须不可变且可追溯
原因: 监管合规, 争议解决
RUST: 使用 Arc<T> 共享, 事件溯源模式
一致性
规则: 资金不能凭空消失或出现
原因: 复式记账原则
RUST: 具有验证总额的交易类型
向下追踪 ↓
从约束到设计 (层级2):
"需要不可变的交易记录"
↓ m09-领域: 建模为值对象
↓ m01-所有权: 使用 Arc 共享不可变数据
"需要精确的小数运算"
↓ m05-类型驱动: 为货币/金额创建新类型
↓ rust_decimal: 使用 Decimal 类型
"需要交易边界"
↓ m12-生命周期: 使用 RAII 管理交易范围
↓ m09-领域: 聚合边界
关键库
| 用途 |
库 |
| 小数运算 |
rust_decimal |
| 日期/时间 |
chrono, time |
| UUID |
uuid |
| 序列化 |
serde |
| 验证 |
validator |
设计模式
| 模式 |
用途 |
实现 |
| 货币新类型 |
类型安全 |
struct Amount(Decimal); |
| 交易 |
原子操作 |
事件溯源 |
| 审计日志 |
可追溯性 |
带有追踪ID的结构化日志 |
| 账本 |
复式记账 |
借方/贷方余额 |
代码模式: 货币类型
use rust_decimal::Decimal;
#[derive(Clone, Debug, PartialEq)]
pub struct Amount {
value: Decimal,
currency: Currency,
}
impl Amount {
pub fn new(value: Decimal, currency: Currency) -> Self {
Self { value, currency }
}
pub fn add(&self, other: &Amount) -> Result<Amount, CurrencyMismatch> {
if self.currency != other.currency {
return Err(CurrencyMismatch);
}
Ok(Amount::new(self.value + other.value, self.currency))
}
}
常见错误
| 错误 |
领域违规 |
修复方法 |
| 使用 f64 |
精度损失 |
rust_decimal |
| 可变交易 |
审计追踪中断 |
不可变 + 事件 |
| 字符串表示金额 |
无验证 |
已验证的新类型 |
| 静默溢出 |
资金消失 |
检查算术运算 |
追踪到层级 1
| 约束 |
层级2 模式 |
层级1 实现 |
| 不可变记录 |
事件溯源 |
Arc<T>, Clone |
| 交易范围 |
聚合 |
拥有子对象 |
| 精度 |
值对象 |
rust_decimal 新类型 |
| 线程安全共享 |
共享不可变数据 |
Arc (非 Rc) |
相关技能
| 何时使用 |
参见 |
| 值对象设计 |
m09-领域 |
| 不可变数据的所有权 |
m01-所有权 |
| 共享的 Arc |
m02-资源 |
| 错误处理 |
m13-领域错误 |