デザイン原則

一般的なデザイン原則の概要


SOLID

CRP(複合再利用の原則)または継承よりコンポジション

「クラスは、基底クラスや親クラスからの継承よりも、コンポジション(望ましい機能を実装する他のクラスのインスタンスを含めること)によって、ポリモーフィックな動作とコードの再利用を優先すべきであるという原則」 - Knoernschild, Kirk (2002). Java Design - Objects, UML, and Process

DRY (Don’t Repeat Yourself)

「すべての知識は、システム内で単一、明確、権威ある表現を持たなければならない」

KISS原則

ほとんどのシステムは、複雑にするよりもシンプルに保つことで最もうまく機能します。したがって、シンプルさは設計における主要な目標であるべきであり、不要な複雑さは避けるべきです。

デメテルの法則 (LoD)

特定のオブジェクトは、「情報隠蔽」の原則に従って、他のもの(そのサブコンポーネントを含む)の構造やプロパティについて、可能な限り少ない仮定をすべきです。

契約による設計 (DbC)

ソフトウェア設計者は、ソフトウェアコンポーネントの正式で正確かつ検証可能なインターフェース仕様を定義すべきです。これは、抽象データ型の通常の定義を、事前条件、事後条件、不変条件で拡張したものです。

カプセル化

データと、そのデータを操作するメソッドとのバンドリング、またはオブジェクトのコンポーネントの一部への直接アクセスの制限。カプセル化は、構造化されたデータオブジェクトの値や状態をクラス内に隠し、権限のない者による直接アクセスを防ぐために使用されます。

コマンド・クエリ分離 (CQS)

「関数は抽象的な副作用を生成すべきではない…コマンド(手続き)のみが副作用を生成することが許される。」 - Bertrand Meyer: Object-Oriented Software Construction

最小驚きの原則 (POLA)

システムのコンポーネントは、ほとんどのユーザーが期待する方法で動作すべきです。その動作はユーザーを驚かせたり、当惑させたりすべきではありません。

言語的モジュール単位

「モジュールは、使用される言語の構文単位に対応しなければならない。」 - Bertrand Meyer: Object-Oriented Software Construction

自己文書化

「モジュールの設計者は、モジュールに関するすべての情報をモジュール自体の一部にするよう努めるべきです。」 - Bertrand Meyer: Object-Oriented Software Construction

統一アクセス

「モジュールが提供するすべてのサービスは、それらがストレージを通じて実装されているか、計算を通じて実装されているかを明かさない統一された表記法を通じて利用可能であるべきです。」 - Bertrand Meyer: Object-Oriented Software Construction

単一選択

「ソフトウェアシステムが一連の選択肢をサポートする必要がある場合、システム内の1つのモジュールのみが、それらの完全なリストを知っているべきです。」 - Bertrand Meyer: Object-Oriented Software Construction

永続性クロージャ

「ストレージメカニズムがオブジェクトを格納するときは必ず、そのオブジェクトの依存物も一緒に格納しなければなりません。検索メカニズムが以前に格納されたオブジェクトを取り出すときは必ず、まだ取り出されていないそのオブジェクトの依存物も取り出さなければなりません。」 - Bertrand Meyer: Object-Oriented Software Construction