抽象化
詳細を隠蔽し本質だけを外部に公開する行為。
目的は関心の分離にあり、呼び出し側が実装の詳細を知らなくても済む状態を作ること。インターフェースの定義やレイヤー構造の導入が典型例。
共通化とは異なり、実装が一つしか存在しない場合でも有効。テスタビリティの確保や依存関係逆転の原則を適用する場合など。
抽象化の進化
間違った抽象化からの回復
React開発者であるSebastian Markbåge氏の格言:
「間違った抽象化から回復するより、抽象化がない状態から回復する方が簡単」
拙速な抽象化は、後から変更が困難になる可能性があります。
教訓:
- 抽象化は慎重に導入する
- 実装からのフィードバックを受けて改善
- 必要性が明確になってから抽象化
抽象化の段階的改善
[[Next.js]]のCache設計の変遷は、抽象化の進化の好例です:
- v13-14: 暗黙的なCache(開発者が意識しない抽象化)
- v14-15: 段階的な改善(ドキュメント、デフォルト変更)
- v16:
"use cache"による明示的な抽象化
当初は「開発者が意識しない」ことを目指しましたが、コミュニティのフィードバックを受けて、「開発者が明示的に制御できる」抽象化へと進化しました。
重要な点:
- 最初から完璧な抽象化は不可能
- フィードバックループを回して改善
- 必要に応じて根本的に設計を変更する勇気
抽象化の粒度
抽象化が粗すぎると柔軟性が失われ、細かすぎると複雑性が増します。適切な粒度を見つけることが重要。
Opt-in設計とOpt-out設計も、抽象化の制御方法の一つです。
関連
- 関心の分離
- 共通化
- 依存関係逆転の原則
- フィードバック
- Opt-in設計とOpt-out設計
- [[Next.js]]