domain-fintech について
金融ソフトウェア向けの Rust ドメインスキルです。正確な十進演算、不変の監査記録、トランザクションの一貫性を重視し、金額や台帳操作、追跡可能な記録のモデル化を支援します。
主な機能
- 01Decimal による金額精度の確保
- 02不変の取引と監査記録
- 03通貨・金額型のモデル化
- 04複式簿記の台帳パターン
- 05取引検証と構造化ログ
活用シーン
- 01通貨付き金額型のモデル化
- 02追跡可能な取引イベントの記録
- 03借方・貸方が一致する台帳の設計
- 04金額計算の精度損失の防止
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ actionbook/ rust-skills --skill domain-fintechインストール後、Claude Code で/domain-fintechを入力して読み込まれたか確認します。
詳細
フィンテック分野
レイヤー 3:ドメイン制約
ドメイン制約 → 設計への影響
| ドメインルール | 設計上の制約 | Rust への影響 |
|---|---|---|
| 監査証跡 | 不変レコード | Arc、変更なし |
| 精度 | 浮動小数点数を使わない | rust_decimal |
| 一貫性 | トランザクション境界 | 明確な所有権 |
| コンプライアンス | 完全なログ記録 | 構造化トレーシング |
| 再現性 | 決定論的な実行 | 競合状態なし |
重要な制約
金融精度
RULE: Never use f64 for money
WHY: Floating point loses precision
RUST: Use rust_decimal::Decimal
監査要件
RULE: All transactions must be immutable and traceable
WHY: Regulatory compliance, dispute resolution
RUST: Arc<T> for sharing, event sourcing pattern
一貫性
RULE: Money can't disappear or appear
WHY: Double-entry accounting principles
RUST: Transaction types with validated totals
たどる ↓
制約から設計へ(レイヤー 2):
"Need immutable transaction records"
↓ m09-domain: Model as Value Objects
↓ m01-ownership: Use Arc for shared immutable data
"Need precise decimal math"
↓ m05-type-driven: Newtype for Currency/Amount
↓ rust_decimal: Use Decimal type
"Need transaction boundaries"
↓ m12-lifecycle: RAII for transaction scope
↓ m09-domain: Aggregate boundaries
主要なクレート
| 用途 | クレート |
|---|---|
| 10進演算 | 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 |
| 変更可能なトランザクション | 監査証跡が損なわれる | 不変性 + イベント |
| 金額に String を使う | 検証できない | 検証済みニュータイプ |
| オーバーフローを黙って許す | 資金が消失する | チェック付き算術 |
レイヤー 1 までたどる
| 制約 | レイヤー 2 のパターン | レイヤー 1 の実装 |
|---|---|---|
| 不変レコード | イベントソーシング | Arc、Clone |
| トランザクションのスコープ | 集約 | 子要素の所有 |
| 精度 | 値オブジェクト | rust_decimal のニュータイプ |
| スレッドセーフな共有 | 不変データの共有 | Arc(Rc ではない) |
関連スキル
| 場面 | 参照先 |
|---|---|
| 値オブジェクトの設計 | m09-domain |
| 不変性のための所有権 | m01-ownership |
| 共有のための Arc | m02-resource |
| エラー処理 | m13-domain-error |
コメント
Markdown 対応