Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ソフトウェア設計の結合とバランス_1章
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
渡邉 巽/watanabe tatsumi
August 03, 2026
Programming
18
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ソフトウェア設計の結合とバランス_1章
渡邉 巽/watanabe tatsumi
August 03, 2026
More Decks by 渡邉 巽/watanabe tatsumi
See All by 渡邉 巽/watanabe tatsumi
効果を正しく検証するには?
watanabetatsumi
0
460
Other Decks in Programming
See All in Programming
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
200
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
170
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
520
Agents on Rails - Rails at Scale 2026
irinanazarova
0
310
カツオ、ご期待ください
suneo3476
0
130
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
380
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
410
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
220
すこし踏み込む CancellationToken
htkym
2
1.5k
iOSDC2026登壇資料.pdf
riofujimon
0
200
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
590
AWSに止められる覚悟してますか?
morizo_1984
2
490
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
550
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
690
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
380
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Paper Plane
katiecoart
PRO
4
53k
How GitHub (no longer) Works
holman
316
150k
sira's awesome portfolio website redesign presentation
elsirapls
0
430
Become a Pro
speakerdeck
PRO
31
6.3k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
Transcript
ソフトウェア設計の 結合とバランス 持続可能な成長を支えるモジュール化の原則 1章 結合とシステム設計
はじめに • • • ソフトウェア設計に関する書籍で結合の説明に割かれるのは、通常数ページほど 『結合(依存)は悪』という言葉をどこでも耳にする。 『マイクロサービスは疎結合を実現するためのアーキテクチャである。』 ↓ 2014年ごろ、猫も杓子もマイクロサービスについて語っていたが、同時は誰もマイクロ サービスが実際に何なのか定義出来ていなかった。
『Structured Design』(邦訳『ソフトウェアの構造化設計手法』)の6章に、そのヒントが書 かれていた。その章のタイトルは・・・『結合』だった。 2
イントロダクション 一流のスイス時計を想像してみてほしい。スイス公認のクロノメーター検査協会は、 15日間の試験期間中、平均して遅れが4秒以内、進みが6秒以内でなければなら ないと定められている。加えて、現代の時計には、クロノグラフ、日付表示 etc… と いった複雑な機構も組み込まれている。これらは全て、何百もの微小な部品によっ て実現されている。 部品間の相互作用の精度は最も重要。例えば、 •
• 潤滑が不十分なために接続がきつすぎると、過度な摩擦によって時計の動きが遅 くなってしまう。 逆に部品が潤滑されすぎていると、歯車やバネが自由に動きすぎて時計の動きが 速くなってしまう。 3
イントロダクション 結合はなぜ重要なのか? 高級機械式時計は、単に時間を刻む機械ではない。時間の経過とともに大きな価値を 蓄積する有形資産。 ↓ これは、成功したソフトウェアシステムにも当てはまる。 ソフトウェアシステムの価値とは、現在備えている機能だけではなく、進化や成長、将来 の要求にも応える能力も反映したもの。本書で学ぶように、時の試練に耐えるシステム を構築するには、コンポーネント間の相互作用を効率的に設計することが不可欠。 なぜ、ある設計の決定が複雑性をもたらし、他の決定がシステムのモジュール性を高め
るのかを探る。 4
結合とは何か 結合は、世界中のソフトウェアエンジニアの宿敵となるずっと前から存在していた。結合 (coupling)はラテン語の”copulare”に由来する。 copulare = ともに固定する、物事を結びつける(connected) 結合は、接合されたコンポーネント間の関係を示している。もしコンポーネントが結合さ れているなら、それらは何らかの形で影響を及ぼし合う可能性がある。 5
結合の強度 ソフトウェア設計では、結合度が高ければ高いほど、結合されたコンポーネントを一緒に 変更する頻度が高くなる。 しかし、なぜ一緒に変更しなければならないのだろうか。 その理由は、 1. 2. ライフサイクルの共有 知識の共有 にある。
6
結合の強度(ライフサイクルの共有) 複数のコンポーネントを一緒にする必要がある単純な理由は、それらのライフサイクル が結合されている点にある。 同じモノリシックアプリケーション内に共存しているモジュールは、一緒にテスト・デプロイ ・メンテナンスをする必要がある。 ↓ 一方、モジュールを異なるサービスに分離すると、 それらのライフサイクルの結合度は低くなり、 それぞれのモジュールをより独立して開発・ メンテナンスできるようになる。
7
結合の強度(知識の共有) 結合されたコンポーネントが強調して動作するには、それらの間で知識を共有する必要 がある。その形は、統合インターフェイス、機能要件、対応するモジュールの実装詳細に まで及ぶ。 共有されている知識の一部を変更した場合には、接続されたモジュールも同様に変更さ れなければならない。 そのため、境界を超えてコンポーネント間で共有している知識が多ければ多いほ ど、より多くの連鎖的な変更が発生する。 8
結合の強度(知識の共有) 共有する知識の量が異なる3つの設計 9
結合の強度(知識の共有) まとめると、 • • • 設計Aは、使用している具体的なデータベース(MySQL)という最も多くの知識を共 有している。 設計Bは、知識をデータベースの種類に縮小している。 設計Cはさらにカプセル化し、CustomerServiceモジュールが機能を実装するため に必要な最小限の知識のみを公開している。
『知識』に対する変更は、影響を受けるコンポーネント全体に伝播させる必要がある。(さ らに、コンポーネントは、明示的に定められたり共有されたりしていない知識であっても、 システムの他の部分について暗黙の前提を持つ可能性がある。(システムが特定の バージョンのやOS、特定のハードに依存するなど。)) そのため、共有される知識が多いほど、変更する理由も多く共有されることになる。 10
知識の流れ 2つの結合されたコンポーネントを考えてみる。 下の例では、Distributionコンポーネントは、CRMコンポーネントを参照(に依存)してい る。この時、DistributionコンポーネントはCRMコンポーネントの統合インターフェース、 機能、運用についての詳細を認識している必要がある。 • • Distributionコンポーネントは、統合インターフェイスを通じて、CRMモジュールから これらの知識を共有されている。 結果として、知識の流れは、依存関係とは逆の方向に発生している。(これらの知
識の流れに関して、上流/下流と表現する。) 11
システム 盲目的に、相互依存を導入すれば良い設計になるというわけではないが、システムの目 的を拡張したい場合は、コンポーネントを変更する必要がある。さらにコンポーネントを 変更する際には、相互作用(統合の仕方、通信の仕方)の変更が必要になる。 12
まとめ システムは目的とコンポーネントから構成される。コンポーネントがシステムの目的を達 成するには、コンポーネント間の相互作用(結合)が必要。 結合は、各コンポーネントが知識やライフサイクル、あるいはその両方を共有しなけれ ばいけないことから生じる 13
演習問題 14