【01】アーキテクチャは縦と横の基本構造を持つ
ソフトウェア開発では、問題領域自体の複雑さ、ソフトウェアの規模やスケーラビリティの要求による複雑さ、プロジェクトの制約による複雑さ、ソフトウェア技術や開発環境が生み出す複雑さの 4 つの複雑さがあります。それに対して、抽象化、直交化、類型化などで複雑さを解決していくことが求められます。
現実世界は、経済、社会現象、造船、化学反応などに見られるように、一般に非線形なモデルで表現されるので、そこに生じる課題の解決、要求を実現する上で必要な仕組みも非線形を扱う影響で複雑になりえます。非線形なものを抽象化して、分割可能とし、また、複合化可能とすることで疑似的に線形化する一方で、抽象化したモデル要素間の関係に非線形の本質的な意味が現れるようにモデルを定義します。つまり、現実世界がもたらす価値は関係に表れると言えるでしょう。完全な現実世界の複雑さを隠蔽するモデルは、モデルの価値を失わせるため、どこかに価値の表現を残す必要があるからです。
たとえば、RDB は現実の要求に応じて実行時にジョインで関係を作ることで、実行時まで可変性の解決を遅延させて、一定の柔軟性を確保しました。そこでは、エンティティ間のリレーションシップが価値を表現します。
この RDB のデータモデル、エンティティとリレーションシップによる抽象化は、アーキテクチャの縦と横の構造の一例です。縦の構造は抽象化したモデル、エンティティによって安定した構造を与えて、横の構造、リレーションシップは縦の構造を連携させて、外部に対して機能(ユースケース、サービスなど)を提供します。この縦と横の構造こそがアーキテクチャの普遍の基本構造です。
このアーキテクチャの基本構造は、RDB のデータモデルだけでなく、UML モデルが表現する各種の構造と振る舞い、アーキテクチャスタイル、メタ階層構造など、ソフトウェアによる抽象化、直交化、類型化などのモデル表現の全般に適用可能です。
たとえば、エンティティとリレーションシップ、状態と遷移、コンテンツとスタイル、インターフェイスと実装、クラスとアスペクト(ロール)、コンポーネントとコネクタ、パイプとフィルタ、パターンとコンテキスト、メタモデルとモデルなどで縦と横の構造を見ることができます。
アーキテクチャの縦と横の基本構造によりシステム全体を俯瞰して、高い保守性と柔軟な可変性の 2 つの相反する要求のトレードオフを考えていくことが大切です。