抽象化の目的
抽象化は変更の影響範囲を小さくし、重要なルールを守りやすくするために使います。trait object、ジェネリクス、モジュール境界、依存性注入は道具です。
trait UserRepository{fn find_name(&self,id:u64)->Option<String>;}
struct UserService<R>{repository:R}
impl<R:UserRepository>UserService<R>{
fn display_name(&self,id:u64)->String{
self.repository.find_name(id).unwrap_or_else(||"unknown".to_string())
}
}
ドメインロジックがHTTPやDBの具体実装へ直接依存しないよう、traitで必要な操作を定義できます。
ADR
背景・選択肢・決定・結果を記録し、性能、複雑さ、変更容易性、運用コストを比較します。
設計演習
HTTPハンドラー・ユースケース・リポジトリの3層を設計し、責務、依存方向、エラー境界、テスト方法、代替案とのトレードオフを説明してください。