何が違うの?疎結合設計と密結合設計|システム開発 必須知識
2021.11.30 (更新日 2024.5.08)
こんにちは。PIVOTコラム編集部です。
さて、今回も表題のとおり設計の話です。
以前、PoC開発における設計(何が違うの? PoC開発と本開発の設計)をしたときに、解説すると約束した話題ですね。
概念的な話が多くなってしまうので難しく感じてしまうかもしれませんが、きちんと理解すれば、世の中の見え方がちょっと変わるくらいインパクトのある話だと思っています!
※内容としてはあくまでも初学者向けのものになっています。この辺の話を深く真面目にし始めるとデジタル宗教戦争(?)が勃発するので、お手柔らかにお願いします…!
もくじ
壁についているコンセントで例えてみる
早速ですが、日本の一般的なコンセントを想像してみてください。
プラグを差し込むための四角い穴が2つあいているものがほとんどですね。このコンセント、細かい話は置いておいて、基本的に全て同じ形状をしていると思います。
当たり前の話ですが、リビングのコンセントと寝室のコンセントの穴の幅が違って、挿さるものと挿さらないものがあるなんてことは滅多にないと思います。
このようなコンセントとプラグの関係は「疎結合である」と言えます。なんのこっちゃ状態の人がほとんどだと思うので、もう少し解説しますね。
コンセント側は、どんなプラグが挿されようが「挿されたものに対して電力を送る」という役割に徹していると思います。
対して、プラグ側も同様に、「挿されたところから電力を受け取る」ということに徹していますよね。
システムの設計の世界では、このように個々の役割が明確になっていて、規格さえ揃っていれば組み合わせるだけで、それぞれが機能するような状態のことを「疎結合」と言います。
※USBやHDMIといったその他の端子類にも同じことが言えます。プログラム的にはこのような接点のことを「インターフェース」と呼びます。
「疎結合」をもう少し具体例で
では次に、もう少し具体的な状況で説明してみます。
通販サイトの買い物カゴ機能を想像してみてください。
商品を選んで買い物カゴに追加すると、「いま合計でいくら分の商品がカゴに入っていますよ」という金額の合算値が表示されるとします。この金額の合算値を求める処理を以下のようなイメージで実装してみるとどうなるでしょう?
1. インプット:どんな商品がいくつ入ってきてもOK。実際に何がインプットされるかは処理が始まるまで知らない。
2. 処理内容:インプットとして入ってきたそれぞれの商品の中から、金額情報を取得して、合算値を計算する。
3. アウトプット:計算した合算値をアウトプットとして外部に吐き出す。自分のアウトプットを誰が使うかは知らない。
つまり、この「合計金額計算くん」は、どんな商品が入って来ようがとにかく商品の合計金額を計算し、結果を外に投げることに徹する作りにします。
流れ作業の中で、自分が作業全体のどこに位置しているのか、ベルトコンベアの両隣に誰がいるのかは知らないが、とにかくインプットに対して決められた処理を施して、アウトプットとして次の誰かに流す、といったイメージですね。
このような設計にしておくと、合計金額を表示しなければいけないあらゆる場所で「合計金額計算くん」を使い回すことができます。
注文実行の画面や最終的な注文内容の確認の際にも、合計金額は表示されていて欲しいですよね。
じゃあ密結合ってどんな状態なの?
コンセントの例で例えると、「密結合な状態」とはコンセントとプラグの概念がない状態のことを指します。
新しい家電を使いたくなったら、家の外にある電柱から自分で電線を引いてきて、家電と直接繋がなければいけないような状況になるので、とっても不便ですね。
通販サイトの例だと、合計金額を計算しなければいけないそれぞれの場所でそれぞれの金額計算機能を実装しているような状況です。
汎用的な「合計金額計算くん」ではなく、「買い物カゴの中の合計金額計算くん」や、「注文確認画面の合計金額計算くん」がそれぞれ独立して存在するイメージです。
どうやって使い分けるの?何が嬉しいの?
疎結合と密結合がどんな状態を指すのかは理解できたと思いますが、どのようなメリット、デメリットがあって、どう使い分ければ良いのでしょうか?前回のPoC開発の話も絡めながら、それぞれ見ていきましょう。
疎結合な設計を採用するメリット、デメリット
疎結合な状態になると、個々の機能をブロックのように組み合わせて色々なところで資源を流用することができ、状況に応じて他の資源へ差し替えることも容易になります。
先の通販サイトの例で、特定の会員が利用している場合のみ、合計金額が常に5%OFFになるような機能を後から追加する必要が出てきた状況を想像してみてください。
その場合は「合計金額計算くん 5%OFFバージョン」を新規作成して、会員種別に応じて使い分ければ良いのです。側から見れば、中身でどんな処理をしているのかは気にしない作りになっているので、全体の設計が破綻することはありません。
デメリットとしては工数がかかる点が挙げられます。コンセントのように、お互いがつながる口の規格を別途定義してあげる(穴のサイズはどれくらい?それぞれの穴はどれくらい離れているべき?…etc)必要があるので、純粋な手数が増えてしまいます。
このことから、疎結合な設計はPoC開発などではなく、腰を据えて長期間保守運用していくことが見込まれる本開発に向いています。
密結合な設計を採用するメリット、デメリット
密結合の場合は悪いところしかないような説明の仕方をしてしまいましたがちゃんとメリットもあります!
疎結合な状態の対局にあるものなので、実装工数が抑えられるのです。他の場所への流用は難しくなりますが、とりあえずきちんと動くものをサクッと実装する際には非常に便利です。そのため、比較的規模の小さいプロダクトや、PoCレベルの開発に向いています。
まとめ
今回は設計における密結合と疎結合に関して、身近なものに例えて解説してみました。
前回投稿したPoCにおける設計の話とも深く関わる内容ですので、合わせて読んでみていただけると幸いです。
「真ん中に『人』がいる
デジタルサービス」をつくりませんか。
お仕事のご相談やお見積もりのご依頼、具体的なご相談は、こちらからお問い合わせください。