
関連サイト
本書の関連ページが用意されています。
内容紹介
ソフトウェア設計に対する新たな視点を提供する一冊。「結合」を活用し、システムの複雑性を管理、モジュール性を高める! 柔軟性の高い進化するシステムを構築。
「結合」とは、モジュール設計における基本概念の1つで、モジュール間の相互作用や依存関係の強さを表します。この「結合」を適切に管理することで、ソフトウェアシステムの保守性や拡張性、ひいては進化性を向上できます。
言い換えれば、ソフトウェアシステムの持続可能な成長には、「結合」の適切な管理が欠かせません。しかし、その重要性にも関わらず、「結合」の概念は深く理解されないまま使われているのが実情です。
本書は、「結合」という概念を現代のソフトウェアエンジニアリングに適応できる形で改めて解説することで、こうした状況に一石を投じます。
本書では、まず構造化設計やオブジェクト指向設計に用いられてきた「結合」に関するモデルや評価手法を包括的に解説します。さらに、複雑性を管理し、モジュール性を高める設計ツールとして「結合」を使用する新たなアプローチを提案します。
ソフトウェアアーキテクトや開発者だけでなく、ソフトウェア設計に関わるすべての人々にとって、ソフトウェア設計に対する新たな視点を提供する一冊です。
※本書は『Balancing Coupling in Software Design: Universal Design Principles for Architecting Modular Software Systems』の翻訳書です。
書誌情報
- 著者: Vlad Khononov(著), 島田 浩二(訳)
- 発行日: 2025-10-17 (紙書籍版発行日: 2025-10-17)
- 最終更新日: 2025-10-17
- バージョン: 1.0.0
- ページ数: 312ページ(PDF版換算)
- 対応フォーマット: PDF, EPUB
- 出版社: インプレス
対象読者
著者について
Vlad Khononov

20年以上にわたる業界経験を持ち、大小さまざまな企業で、ウェブマスターからチーフアーキテクトまでのさまざまな職務を経験。現在はコンサルタントやトレーナーとして、企業がビジネスドメインを理解し、レガシーシステムを整理して、複雑なアーキテクチャ上の課題に取り組むことを支援している。
著書に『ドメイン駆動設計をはじめよう』(オライリージャパン)がある。また、世界中の主要なソフトウェアエンジニアリングとアーキテクチャのカンファレンスで講演を行う。
島田 浩二

1978年、神奈川県生まれ。電気通信大学電気通信学部卒業。2009年に株式会社えにしテックを設立。2011年からは一般社団法人日本Rubyの会の理事も務める。主な訳書に『エンジニアリング統括責任者の手引き』『スタッフエンジニアの道』『ソフトウェアアーキテクチャの基礎』『ソフトウェアアーキテクチャ・ハードパーツ』『モノリスからマイクロサービスへ』『Design It!』『ユニコーン企業のひみつ』(オライリー・ジャパン)、『ソフトウェアアーキテクトのための意思決定術』(インプレス)など。
目次
本書への推薦の言葉
- シリーズ編集者による序文
- Rebecca J. Wirfs-Brockによる序文
- Kent Beckによる序文
はじめに
- 謝辞
- 著者について
イントロダクション
目次
第I部 結合
第1章 結合とシステム設計
- 1.1 結合とは何か
- 1.2 結合の強度
- 1.2.1 ライフサイクルの共有
- 1.2.2 知識の共有
- 1.3 知識の流れ
- 1.4 システム
- 1.4.1 システムにおける結合
- 1.4.2 オプション:機械工学における結合とコスト管理
- 1.5 まとめ
- 1.6 演習問題
第2章 結合と複雑性:クネビン
- 2.1 複雑性とは何か
- 2.1.1 ソフトウェア設計における複雑性
- 2.1.2 複雑性は主観
- 2.2 クネビンフレームワーク
- 2.2.1 明確系(Clear)
- 2.2.2 煩雑系(Complicated)
- 2.2.3 複雑系(Complex)
- 2.2.4 混沌系(Chaotic)
- 2.2.5 無秩序(Disorder)
- 2.3 クネビンフレームワークのドメインの比較
- 2.4 ソフトウェア設計におけるクネビンフレームワーク
- 2.4.1 例A:外部サービスの統合
- 2.4.2 例B:データベースインデックスの変更
- 2.5 クネビンフレームワークの適用
- 2.6 クネビンフレームワークと複雑性
- 2.7 まとめ
- 2.8 演習問題
第3章 結合と複雑性:相互作用
- 3.1 複雑性の本質
- 3.2 複雑性とシステム設計
- 3.2.1 線形な相互作用
- 3.2.2 複雑な相互作用
- 3.2.3 複雑性とシステムの規模
- 3.3 階層的複雑性
- 3.3.1 大域的複雑性だけを最適化する
- 3.3.2 局所的複雑性だけを最適化する
- 3.3.3 複雑性のバランスを調整する
- 3.4 自由度
- 3.4.1 ソフトウェア設計における自由度
- 3.4.2 自由度と複雑な相互作用
- 3.5 複雑性と制約
- 3.5.1 例:自由度を制約する
- 3.5.2 クネビンフレームワークのドメインにおける制約
- 3.6 結合と複雑な相互作用
- 3.7 例:結合と複雑性を結びつける
- 3.7.1 設計A:SQLを使用してサポートケースをフィルタリングする
- 3.7.2 設計B:QueryObjectを使用する
- 3.7.3 設計C:特化したファインダーメソッドを使用する
- 3.7.4 結合、自由度、制約
- 3.8 まとめ
- 3.9 演習問題
第4章 結合とモジュール性
- 4.1 モジュール性
- 4.2 モジュール
- 4.2.1 LEGOブロック
- 4.2.2 カメラの交換レンズ
- 4.3 ソフトウェアシステムにおけるモジュール性
- 4.3.1 ソフトウェアモジュール
- 4.3.2 ソフトウェアモジュールの機能、ロジック、コンテキスト
- 4.3.3 効果的なモジュール
- 4.3.4 抽象としてのモジュール
- 4.4 モジュール性、複雑性、結合
- 4.4.1 深いモジュール
- 4.4.2 モジュール性と複雑性
- 4.4.3 モジュール性:過ぎたるはなお及ばざるがごとし
- 4.5 モジュール性における結合
- 4.6 まとめ
- 4.7 演習問題
第II部 次元
第5章 構造化設計におけるモジュール結合
- 5.1 構造化設計
- 5.2 モジュール結合
- 5.2.1 内容結合(Content Coupling)
- 5.2.2 共通結合(Common Coupling)
- 5.2.3 外部結合(External Coupling)
- 5.2.4 制御結合(Control Coupling)
- 5.2.5 スタンプ結合(Stamp Coupling)
- 5.2.6 データ結合(Data Coupling)
- 5.3 モジュール結合レベルの比較
- 5.4 まとめ
- 5.5 演習問題
第6章 コナーセンス
- 6.1 コナーセンスとは
- 6.2 静的コナーセンス
- 6.2.1 名前のコナーセンス
- 6.2.2 型のコナーセンス
- 6.2.3 意味のコナーセンス
- 6.2.4 アルゴリズムのコナーセンス
- 6.2.5 位置のコナーセンス
- 6.3 動的コナーセンス
- 6.3.1 実行のコナーセンス
- 6.3.2 タイミングのコナーセンス
- 6.3.3 値のコナーセンス
- 6.3.4 同一性のコナーセンス
- 6.4 コナーセンスの評価
- 6.4.1 コナーセンスの管理
- 6.4.2 構造化設計のモジュール結合とコナーセンス
- 6.5 まとめ
- 6.6 演習問題
第7章 統合強度
- 7.1 結合の強さ
- 7.1.1 モジュール結合、コナーセンス、それとも両方?
- 7.1.2 構造化設計とコナーセンスの盲点
- 7.1.3 異なる戦略
- 7.2 統合強度
- 7.2.1 具体例:データベースの共有
- 7.3 侵入結合
- 7.3.1 侵入結合の例
- 7.3.2 具体例:データベースの共有による侵入結合
- 7.3.3 侵入結合の影響
- 7.4 機能結合
- 7.4.1 機能結合の度合い
- 7.4.2 機能結合の原因
- 7.4.3 具体例:データベースの共有による機能結合
- 7.4.4 機能結合の影響
- 7.5 モデル結合
- 7.5.1 モデル結合の度合い
- 7.5.2 具体例:データベースの共有によるモデル結合
- 7.5.3 モデル結合の影響
- 7.6 コントラクト結合
- 7.6.1 コントラクト結合の例
- 7.6.2 コントラクト結合の度合い
- 7.6.3 コントラクト結合の深さ
- 7.6.4 具体例:データベースの共有によるコントラクト結合
- 7.6.5 コントラクト結合の影響
- 7.7 統合強度の議論
- 7.7.1 分散システムの例
- 7.8 統合強度と非同期実行
- 7.9 まとめ
- 7.10 演習問題
第8章 距離
- 8.1 距離とカプセル化境界
- 8.1.1 距離のコスト
- 8.1.2 ライフサイクル結合としての距離
- 8.1.3 距離の評価
- 8.2 距離に影響を与える追加の要因
- 8.2.1 距離とソシオテクニカルデザイン
- 8.2.2 距離と実行時結合
- 8.2.3 非同期通信と変更コスト
- 8.3 距離と近接性
- 8.4 距離と統合強度
- 8.5 まとめ
- 8.6 演習問題
第9章 変動性
- 9.1 変更と結合
- 9.2 ソフトウェアが変更される理由
- 9.2.1 ソリューションの変更
- 9.2.2 問題の変更
- 9.3 変更率の評価
- 9.3.1 ドメイン分析
- 9.3.2 ソースコード分析
- 9.4 変動性と統合強度
- 9.5 推定変動性
- 9.6 まとめ
- 9.7 演習問題
第III部 バランス
第10章 結合の均衡化
- 10.1 結合の次元を組み合わせる
- 10.1.1 測定単位
- 10.1.2 安定性:変動性と強度
- 10.1.3 実コスト:変動性と距離
- 10.1.4 モジュール性と複雑性:強度と距離
- 10.2 強度、距離、変動性の組み合わせ
- 10.2.1 メンテナンスの労力:強度、距離、変動性
- 10.2.2 均衡結合:強度、距離、変動性
- 10.3 結合の均衡度を数値スケールで評価する
- 10.3.1 均衡結合方程式
- 10.3.2 均衡結合:例
- 10.4 まとめ
- 10.5 演習問題
第11章 結合の再均衡化
- 11.1 変更に強い設計
- 11.2 ソフトウェア変更の要因
- 11.2.1 戦術的変更
- 11.2.2 戦略的変更
- 11.3 結合の再均衡化
- 11.3.1 強度
- 11.3.2 変動性
- 11.3.3 距離
- 11.3.4 複雑性の再均衡化
- 11.4 まとめ
- 11.5 演習問題
第12章 ソフトウェア設計のフラクタル幾何学的性質
- 12.1 成長
- 12.1.1 ネットワーク型システム
- 12.1.2 ソフトウェア設計はネットワーク型システム
- 12.1.3 なぜシステムは成長するのか
- 12.1.4 成長の限界
- 12.1.5 ソフトウェア設計における成長のダイナミクス
- 12.2 イノベーション
- 12.2.1 ソフトウェア設計におけるイノベーション
- 12.2.2 イノベーションとしての抽象化
- 12.3 フラクタル幾何学的性質
- 12.4 フラクタルモジュール性
- 12.5 まとめ
- 12.6 演習問題
第13章 均衡結合の実践
- 13.1 マイクロサービス
- 13.1.1 ケーススタディ1:イベントによる余分な知識の共有
- 13.1.2 ケーススタディ2:十分な統合
- 13.2 アーキテクチャパターン
- 13.2.1 ケーススタディ3:複雑性の軽減
- 13.2.2 ケーススタディ4:レイヤー、ポート、アダプター
- 13.3 ビジネスオブジェクト
- 13.3.1 ケーススタディ5:エンティティと集約
- 13.3.2 ケーススタディ6:クラスの編成
- 13.4 メソッド
- 13.4.1 ケーススタディ7:分割統治
- 13.4.2 ケーススタディ8:コードの臭い
- 13.5 まとめ
- 13.6 演習問題