『プリンシプル オブ プログラミング』を10問で学べるクイズサイト

AIが迷わない疎結合設計へリファクタ!
コードレビュー道場 #2:凝集度/結合度

公開日:
最終更新日:

このページでは、AIが作りがちな密結合な設計を題材に、凝集度/結合度の観点で読み解くコードレビュー形式の4択クイズに挑戦します。AIに任せるほど、境界と責務を人間が設計できるかが差になります。

4択クイズ(10問・全問解説付き)で腕試し → 解説で責務の切り方・依存の減らし方を復習。「読む→解く→わかる」で、AIが迷わない疎結合設計へ導く視点を鍛えましょう!

今すぐクイズに挑戦
(10問・約3分・解説つき)
プリンシプルオブプログラミング
AI時代を生き抜く「101の設計原則」

#2 凝集度/結合度:疎結合へリファクタ! 目次

  1. クイズに挑戦する(10問)

  1. プログラミング クイズ一覧へ
  2. コードレビュー道場 目次へ
  3. 次のクイズへ(#3 非機能要件:落ちるコードを鍛え直せ!)
  4. 前のクイズへ(#1 DRY/KISS:AIコードをリファクタせよ!)
  5. 『プリンシプル オブ プログラミング』101の原理・原則総まとめ

  1. 参考文献・出典
  2. このページの著者
  3. シェア

コードレビュー道場 #2~密結合な設計を疎結合に変えよ!~

1. 次のクラスは、「メール送信」と「テンプレート生成」を同じ場所で行っています。凝集度/結合度の観点から、どの設計が望ましいでしょうか?

class MailService {
  constructor(client) {
    this.client = client;
  }

  sendWelcomeMail(user) {
    const body = `ようこそ ${user.name} さん`;
    this.client.send(user.email, body);
  }

  sendByeMail(user) {
    const body = `ご利用ありがとうございました ${user.name} さん`;
    this.client.send(user.email, body);
  }
}

2. 次の2つの関数は、どちらもログイン状態に依存する処理です。結合度/凝集度の観点から、どのような改善が望ましいでしょうか?

function showMyPage() {
  if (!window.currentUser) {
    throw new Error('ログインしていません');
  }
  // 画面描画
}

function showSettings() {
  if (!window.currentUser) {
    throw new Error('ログインしていません');
  }
  // 設定画面描画
}

3. 次のコードは、注文処理とメール送信を1つの関数にまとめています。凝集度/結合度の観点から、最も問題がある点はどれでしょうか?

function placeOrder(order, db, mailer) {
  // DBへ保存
  db.insert('orders', order);

  // ユーザーにメール送信
  const message = `ご注文ありがとうございます:${order.id}`;
  mailer.send(order.userEmail, message);

  // 画面用メッセージを返す
  return {
    message: '注文完了しました',
    orderId: order.id
  };
}

4. 次のコードは、法則的には「デメテルの法則(LoD)」に違反しやすいパターンです。結合度の観点から、最も問題になりやすい点はどれでしょうか?

function getCustomerCity(order) {
  return order.customer.address.city;
}

5. 次の関数は、複数のオブジェクトにまたがって状態を更新しています。結合度/凝集度の観点から、どのような設計リスクがありますか?

function completeTask(task, user, project) {
  task.completed = true;
  task.completedAt = new Date();

  user.completedTaskCount++;

  project.lastActivityAt = new Date();
}

6. 次のクラスは、リポジトリとサービスが分かれていません。結合度/凝集度の観点から、改善ポイントはどこでしょうか?

class UserManager {
  constructor(db) {
    this.db = db;
  }

  async findById(id) {
    return this.db.query('SELECT * FROM users WHERE id = ?', [id]);
  }

  async changeEmail(id, newEmail) {
    const user = await this.findById(id);
    // ドメインルールのチェック(省略)
    await this.db.execute('UPDATE users SET email = ? WHERE id = ?', [newEmail, id]);
  }
}

7. 次のコードでは、テストしづらい結合が生まれています。結合度の観点から、どこが問題でしょうか?

function calculateDiscount(user, now = new Date()) {
  if (user.isPremium && now.getDay() === 5) {
    return 0.2;
  }
  return 0;
}

8. 次のコードは、メール送信の方法が直接固定されています。結合度の観点から、どの改善が望ましいでしょうか?

function sendPasswordReset(user, token) {
  const url = `https://example.com/reset?token=${token}`;
  const message = `こちらからパスワードを再設定してください: ${url}`;
  SmtpClient.send(user.email, message);
}

9. 次のコードは、UI層からドメインロジックへアクセスする際の結合の仕方を示しています。結合度を下げるために、最も有効な改善はどれでしょうか?

function onClickSaveButton() {
  const user = collectFormData();

  // ドメインロジックを直接 new
  const service = new UserService();
  service.save(user);

  alert('保存しました');
}

10. 次のコードは、「凝集度が低いクラス」の例です。どこが問題でしょうか?

class Utils {
  static formatDate(date) { /* ... */ }
  static calculateTax(price) { /* ... */ }
  static validateEmail(email) { /* ... */ }
  static sendMail(to, body) { /* ... */ }
}

密結合な設計を疎結合に変えよ!
採点結果

正答率:0%

-

-

参考文献・出典

  • プリンシプル オブ プログラミング ~3年目までに身につけたい一生役立つ101の原理原則~
  • 上田 勲(著)/秀和システム/第1版14刷/2025年/ISBN978-4-7980-4614-3

※本ページは学習支援を目的とした要約です。実務適用時は原典もご参照ください。

このサイトの運営者

もちもちみかん(社内SE)

運営者は、グループ企業向けの業務アプリを要件定義から運用まで担当している社内SEです。PHP・JavaScript・MySQL・CSSを使った実務経験をもとに、一次情報や実際の運用で得た気づきを整理しています。

AIにコードを書かせて終わりではなく、どこで迷ったか・どこを人がレビューすべきかまで含めて、 やさしく噛みくだいてまとめています。

経験:Webアプリ・業務システム

得意:PHP・JavaScript・MySQL・CSS

制作・運用中:フォーム生成基盤クイズ学習プラットフォームhtmx逆引きレシピ

AI時代のエンジニアタイプ診断:CSPF/とろとろみかん

詳しいプロフィールはこちら!  もちもちみかんのプロフィール

もちもちみかん0系くん
TOPへ

もちもちみかん.comとは


もちもちみかん.com は、AI時代に必要なプログラミングの基礎・設計・改善の考え方を、やさしく学べるサイトです。


『プリンシプル オブ プログラミング』の原則まとめ、用語集、クイズ、htmx逆引きレシピを通じて、「分かったつもり」で終わらず、実際に使える判断軸まで身につくようにしています。


フォームジェネレーターなどの便利ツールも用意しつつ、AIにコードを書かせる時代にこそ大切な設計・責務・レビューの視点を、実務と検証の目線で届けます。


むずかしい内容でも親しみやすく学べるように、「もちもちみかん」らしいやわらかさも大切にしています!