設計のよしあしを測る2つのものさし
結合度と凝集度は、ソフトウェアの設計のよしあしを測る、2つのものさしです。結合度は部品どうしの頼り方、凝集度は1つの部品の中身のまとまりを見ます。
設計が悪いと、1か所を直しただけで、思わぬ所が壊れます。このレッスンでは、部品とつながりを数えて、変更が広がる範囲を見積もります。
このレッスンのゴール
メモ
結合度と凝集度で、設計のよしあしを判断できる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| 部品 | 1つの仕事を受け持つ、プログラムのまとまり | 注文、在庫 |
| 依存 | ある部品が、別の部品を使うこと | |
| 結合度 | 部品どうしが、どれだけ強く頼り合うか | |
| 凝集度 | 1つの部品の中身が、どれだけ同じ仕事に向かうか | |
| 変更の波及 | 1か所の変更が、他の部品に広がること |
学生が入力するセルは、このプレビューでは空白です。
結合度は部品どうしの頼り方
部品Aが部品Bを使うとき、AはBに依存します。依存が多く、強いほど、結合度は高いと言います。
Bを変えると、Aも直す必要が出ます。結合度が低ければ、変更は部品の中で終わります。目指すのは、低い結合度です。
凝集度は1つの部品のまとまり
1つの部品の中身が、同じ仕事に向かっているとき、凝集度は高いと言います。仕事がばらばらだと、凝集度は低くなります。
「注文と在庫とメール送信」を1つにした部品は、凝集度が低い例です。メールの文面を直すだけで、注文の部品を開くことになります。
例: 凝集度の高い部品と低い部品
| 部品 | 中身 | 凝集度 |
|---|---|---|
| 注文 | 注文を受ける。合計を計算する。注文を保存する | 高い。注文だけの仕事 |
| 何でも屋 | 注文を受ける。メールを送る。ログを消す | 低い。仕事がばらばら |
| 在庫 | 在庫を数える。在庫を減らす | 高い。在庫だけの仕事 |
学生が入力するセルは、このプレビューでは空白です。
変更が広がるかをラボで見る
ラボの API は、アプリとデータベースの間の部品です。アプリが列の名前を知っていると、アプリはデータベースに頼ります。
表に列を足したときと、列の名前を変えたときで、同じ読み取りの結果がどう変わるかを見ます。順に Run してください。
文房具の表を作る
PGPASSWORD=shop psql -h db -U shop -c "drop table if exists items; create table items (id serial primary key, name text not null, price_yen int not null); insert into items (name, price_yen) values ('Notebook', 180), ('Pen', 120); notify pgrst, 'reload schema'"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
名前と値段を読む
curl -s -w "\n" "http://api:3000/items?select=name,price_yen&order=id"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
表に列を足す
PGPASSWORD=shop psql -h db -U shop -c "alter table items add column note text; notify pgrst, 'reload schema'"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
同じ読み取りをもう一度
curl -s -w "\n" "http://api:3000/items?select=name,price_yen&order=id"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
列の名前を変える
PGPASSWORD=shop psql -h db -U shop -c "alter table items rename column price_yen to price; notify pgrst, 'reload schema'"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
古い名前で読む
curl -s -w "\n%{http_code}\n" "http://api:3000/items?select=name,price_yen&order=id"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
部品どうしがまったく頼り合わなければ、最良だと考えがちです。部品が何も頼らなければ、システムは何もできません。目指すのは、必要な頼り方だけを、少なくすることです。
例: 変更と広がり
| 変更 | 同じ読み取りの結果 | 広がり |
|---|---|---|
| 表に列を足す | 前と同じ2件 | 広がらない。結合度は低い |
| 列の名前を変える | 400。読み取りが壊れた | アプリまで広がる。結合度は高い |
学生が入力するセルは、このプレビューでは空白です。