概要
Daniel Terhorst-Northさんが提唱するSOLID原則を代替する設計原則です。
SOLID原則はプリンシパル(ルールやガイドライン)を定めたものであるのに対し、CUPIDはソフトウェアが持つべき性質・特徴を定めたものです。SOLID原則はOOPやプログラミング言語に依存するところがありますが、CUPIDは基本的にOOPやプログラミング言語に依存しません。
Thoughtworks社が発表しているTechnology Radar Volume 26においても紹介されています。
日本語で紹介された記事がなかったので簡単にまとめておきます。
CUPIDは下記の頭文字です。ソフトウェアはこれらの性質・特徴を持つように作るべきだというのがCUPIDが伝えるものです。
- Composable : 他のコンポーネントと組み合わせしやすいこと
- Unix philosophy : ひとつのことをうまくやること
- Predictable : なにをするのか予測できること
- Idiomatic : 自然に感じられること
- Domain-based : ドメイン言語とドメインの構造を使うこと
Composable
- 小さなインタフェース(Small "surface area")
- 意図が明確な名前と目的(Intention-revealing name and purpose)
- 最小限の依存(Minimal dependencies)
Unix philosophy
ひとつのことをうまくやるソフトウェア(コンポーネント)を作り、組み合わせによって目的を達成します。
これはSOLID原則のSRP(Single Responsibility Principal)とは異なります。
SRPはあるコンポーネントの変更は1つの理由で行われるべきというものですが、Unix philosophyではコードが行うことに焦点をあてています。
Predictable
- 期待通りの動きをすること。驚きがないこと。(Behaves as expected, with no surprises)
- 決定論的であること (Deterministic)
- 観測可能であること (Observable)
補足
観測可能とは、適切なログ出力やモニタリングのための実装などを指しています。
Idiomatic
- 言語のイディオムを使うこと
- 標準の機能、ライブラリ、フレームワーク、ツールを使うこと
- 自然に作業ができること
- ローカルイディオムを使うこと
- 社内またはデファクトのコーディングスタイルや設計に従うこと
- プロジェクト、依存するもの、プラットフォーム、組織の寄り添うこと
Domain-based
- ドメイン言語を使うこと
- ドメインの構造を使うこと
- ソースコードの構造にはドメインに従った構造を適用すべき。トップレベルでは models, views, controllersのようなものではなく、payments, loans, onboardingのようなものであるべき
- ドメイン境界を使うこと
- ドメインの境界をデプロイメントの単位にします。