Table of Contents
SOLID原則の理解
SOLID 原則は、開発者が保守、拡張、テストが容易であるシステムを作成するのに役立つ 5 つのオブジェクト指向設計ガイドラインです。 彼らは 2000 年代初頭にロバート C. マーティンによって導入され、以来、近代的なソフトウェアアーキテクチャの礎石になりました。 各原則は、ソフトウェア設計の特定の側面を置きます。
- [単一責任原則(SRP):[]])クラスは、単一の機能に対して責任を負うべき、変更する理由を1つだけ持っているべきです。
- []オープン/クローズド原則(OCP):[])クラスは拡張機能が開いているが、変更がクローズされるため、既存のコードを変更することなく新しい動作を追加できます。
- [リコフ置換原理(LSP):]] サブタイプは、システムを破壊することなく、ベースタイプに置換可能である必要があります。
- [インターフェイス分離原理(ISP):[]])クライアントは、使用しないインタフェースに依存しないべきではありません。 複数の小さな、特定のインターフェイスを1つの大きな、汎用インターフェイスよりも多く持っている方が良い。
- [] 依存性反転原理(DIP):[]) 高レベルモジュールは低レベルモジュールに依存しないべきではありません。 両方は抽象に依存する必要があります。 概要によっては、詳細に依存すべきではありません。 詳細は抽象化に依存する必要があります。
ソフトウェアアーキテクチャの可視化におけるUMLの役割
ユニファイドモデリング言語(UML)は、システム設計を視覚化するための標準化された表記を提供します。図は、開発者、建築家、利害関係者の間で共有言語として機能し、複雑な構造を簡単に通信できるようにします。SOLID準拠アーキテクチャに適用された場合、UML図は、設計が妥当性を要求する可能性のある原則と強調領域にどのように付着するかを明らかにします。
UMLには14の図形タイプが含まれているが、SOLIDの視覚化に最も関連しているのは、クラス図、コンポーネント図、シーケンス図、パッケージ図です。各図タイプは、原則の異なる側面を強調することができます。例えば、クラス図はクラスの責任とインターフェイスを示しています。コンポーネント図は依存性方向と拡張性ポイントを強調しています。
UML 図を各SOLID原則にマッピング
単一責任原則とクラス図
クラス図は、SRP のコンプライアンスを検証するのに理想的です。 よく設計されたクラス図は、各クラスに明確で焦点を絞った属性とメソッドのセットを示しています。 クラスに複数の責任がある場合、その図のボックスには関連のない操作が含まれているため、SRP 違反の赤いフラグが使用されます。
例えば、インボイスの計算とメール送信の両方を処理する「InvoiceManager」というクラスはSRPに違反します。クラス図は、同じボックス内で「calculateTotal()」「sendEmail()」のようなメソッドを表示し、クラスを「インボイス計算機」と「EmailService」に分割する必要があることをシグナル伝達します。 重要な境界線は、チームが早期に違反をキャッチするのに役立ちます。
開封/閉鎖原理とコンポーネント図
コンポーネント図は、システムの高いレベルの構造を記述し、コンポーネント(モジュール、サブシステムなど)がインターフェイスを介して接続する方法を示します。OCP に準拠するために、コンポーネントは既存のものを変更することなく、新しい実装を可能にするときに、固定インターフェイスを露出する必要があります。
コンポーネント図では、提供されたインターフェイスと必要なインターフェイスを使用してこれを表現することができます。たとえば、`PaymentProcessor`コンポーネントは `Payment` インターフェイスを定義するかもしれません。このインターフェイスを実装するコンポーネントとして、新しい支払い方法 (クレジットカード、ペイパル) が追加されます。この図は、コアプロセッサが変更する必要はありません。抽象化に依存するだけです。
リスコフ置換原理と継承階層
相続関係を持つクラス図は、LSPを直接テストします。サブクラスが、動作を侵害するような方法でベースクラスのメソッドを上書きする場合、階層は疑わしいです。UMLは、制約(例、ノートまたはOCL — オブジェクト制約言語)を使用して、事前条件、後方、および不変性をモデル化することができます。
古典的な LSP 違反は `Rectangle` から継承する `Square` クラスです。 図では `Square` が `setWidth()` を `height` に設定すると、 `Rectangle` 契約を破棄します。 図は `Square` が本当に置換可能ではないことを示すべきです。 これを修正するには、 `Rectangle` と `Srequa` を別々に `Shape` インターフェイスを使用するかもしれません。 は、クラスを継承するなら、そのクラスは、それらが直接表示されません。
インターフェイスの分離の原則およびインターフェイス図
UMLはインターフェイスボックス(`<
例えば、`print()`、`scan()`、`fax()` のインターフェイスではなく `MultiFunctionPrinter` インターフェイスの代わりに `printable`、`Scannable`、および `Faxable` に分割します。 クラス図は `BasicPrinter` が `Printable` だけを実装し、`AdvancedPrinter` は 3 つすべてを実装します。 このアプローチは、インターフェイスを無駄にし、クライアントが関連する操作に依存することを強制的に阻止します。
依存性反転原理と依存性図
両方のクラス図とパッケージ図は、DIP のコンプライアンスを記述することができます。DIP は、高レベルのモジュール(例えば、ビジネスロジック)が低レベルモジュール(例えば、データベースドライバ)に依存しない状態です。代わりに、両方の抽象化(インターフェイスまたは抽象クラス)に依存する必要があります。
パッケージ依存図では、依存関係の方向を示すことができます。高レベルのパッケージが低レベルのパッケージに直接ポイントする場合、図はDIP違反の警告をします。このソリューションは、そのインターフェイスに応じて低レベルのパッケージで、高レベルのパッケージの抽象化(インターフェイス)を導入することです。更新された図は、SOLID適合の明確な兆候である、逆の依存性を示しています。
SOLIDアーキテクチャ用のUML図を作成するための最良のプラクティス
SOLID 原則を強化する、清潔で有益な UML 図を生成するために、これらのガイドラインに従ってください。
- []ステレオタイプとノート:[ を適用します。`<
]>`、`< ]>`、および`< >`ステレオタイプ。 クラスが1つの責任しか持っていない理由など、設計決定を説明するメモを追加します。 - []Keep の図は、:[ を集中しました。単一の図は、一つの原則または関連する原則の小さなセットに対処する必要があります。すべてのクラスを 1 つの巨大な図にクレンジングしないでください。
- [関連関係のみを審議:[ 相続、関連付け、集計、およびそれらが問題のある依存関係の矢印を表示します。 関連する矢印のobscures SOLIDの順守をオーバーロードします。
- []ハイライト違反:[]]]さまざまな色またはハッシュされた線を使用して、問題のある関係をマークします。 例えば、高レベルから低レベルコードへの赤い依存矢印は、DIP違反をフラグすることができます。
- :]をリファクタリングして、SOLIDに会うように設計を再ファクタリングすると、図を更新します。 UMLは生きたアーティファクトです。コードの仲間として、ワンタイムスケッチではなく、それを処理します。
一般的な落札とテムを避ける方法
経験豊富な開発者も、UML を使用して SOLID アーキテクチャを設計する際にトラップに落ちることができます。以下は頻繁に間違いやそれらを横方向する方法です。
- []早期に抽象化:[。 あまりにも多くのインターフェイスやクラスから始まると、YAGNI(あなたAren't Gonna Need It)に違反することができます。 単純なクラス図から始めて、通常、SOLIDの原則で必要な場合にのみ抽象化を追加します。
- UML表記の併用:[ マウスの矢印タイプをマウスソーシング(例えば、依存矢印が正しい一般的な矢印を使用して)、誤解釈につながることができます。 曖昧さを避けるためにUML 2.5の仕様基本を勉強します。 ]OMG UML仕様は、決定的な参考です。
- [] 配列図で LSP を無視する:[[]] 配列図はランタイムインタラクションを表示します。サブクラスオブジェクトがベースクラスオブジェクトに置換され、インタラクションが予期しないと、LSP は壊れています。サブクラスインスタンスでシーケンスを検証します。
- []依存関係方向を無視する:[ DIPは依存関係の方向についてです。 パッケージ図では、クライアントからサーバーに矢印を描画します。 間違った方法を示すサイクルや矢印が表示された場合、抽象を再生成します。
- [] の図を詳細に示す:[ は、すべてのゲッタとセッターがビューを乱雑に示すクラス図です。 SOLID原則を強制するパブリックインターフェイスとキーの関係に焦点を当てます。
UML図の作成ツール
いくつかのツールは、コードと同期したままのUML図を作成するのに役立ちます。ワークフローに合ったものを選択してください。
- [PlantUML:]] テキストベースのダイアグラムツールで、バージョン管理と統合します。 プレーンテキストの説明を書き、自動的にダイアグラムを生成します。 図をコードとして望むチームに最適です。 []] で、PlantUMLで詳細を学ぶ。
- Draw.io(diagrams.net):[]]:無料のWebベースの図エディタ。 UMLのステンシルと簡単なエクスポートをサポートしています。 共同ホワイトボードに適しています。
- [Lucidchart:]] UMLテンプレートとリアルタイムコラボレーションによる有料プラットフォーム。 防弾とJiraとの統合を提供します。
- [Modelio:]] UMLとBPMNをサポートするオープンソースモデリングツール。 クラス図とリバースエンジニアリング既存のコードからコードを生成することができます。
- []IntelliJ IDEA Ultimate:[クラス、パッケージ、および依存関係図のための組み込みの図表を含む。 ライブ同期のためのあなたのコードベースと直接動作します。
SOLID原則とUML統合の深い理解のために、あなたはロバートC.マーティンのオリジナルライティングを]]にOODの原則(PDF)とWikipediaの記事]SOLID原則を参照してください。
コンテンツ
UML 図は、抽象的なSOLID原則を、開発者が検査、議論、改善できる具体的な視覚モデルに変換します。各原則を適切な図形タイプにマッピングすることで、SRPとISPのクラス図、OCPとDIPのコンポーネント図、およびLPSの継承階層は、アーキテクチャが柔軟で維持可能でスケーラブルな状態であることを体系的に検証することができます。
鍵は、UMLを不正なアーティファクトではなく、コードを進化させる生きたツールとして使うことです。自動図生成と定期的なコードレビューと組み合わせることで、UMLはSOLID準拠のシステムを構築し、時間のテストをスタンドする強力な味方になります。