38
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SOLIDを代替する設計原則、CUPIDについて

Last updated at Posted at 2022-09-14

概要

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のようなものであるべき
  • ドメイン境界を使うこと
    • ドメインの境界をデプロイメントの単位にします。

参考

38
34
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
34

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?