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

コードレビュー道場 #1
DRY/KISSで太りすぎた関数を救え!

公開日:
最終更新日:

このページでは、『プリンシプル オブ プログラミング』で登場するDRY / KISSの考え方を、実際のコード断片を使ったコードレビュー形式の4択クイズで体験します。

コピペだらけの処理や太りすぎた関数、ネストが深すぎる条件分岐などの4択クイズに挑戦し、「どこがまずいのか?」を読み解きながら、シンプルで重複の少ないコードへ導く視点を鍛えていきましょう!

今すぐクイズに挑戦
(10問・約3分・解説つき)
プリンシプルオブプログラミング
1分で理解&101の原則総まとめ!

目次

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

  1. プログラミング クイズ一覧へ
  2. コードレビュー道場 目次へ
  3. 次のクイズへ(密結合な設計を疎結合に変えよ!)
  4. 前のクイズへ(落ちるコードを非機能要件で鍛え直せ!)
  5. 『プリンシプル オブ プログラミング』101の原理・原則総まとめ

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

コードレビュー道場 #1~DRY/KISSで太りすぎた関数を救え!~

1. 次のコードは、「とりあえずなんでも詰め込んだユーティリティ関数」です。KISSの観点から、どのような改善方針がよいでしょうか?
function doMagic(obj, options) {
  // ログ出力
  console.log('start', obj, options);

  // バリデーション
  // ...

  // データ変換
  // ...

  // API呼び出し
  // ...

  // 画面更新
  // ...
}

2. 次のコードでは、10という値が複数の場所で使われています。DRYの観点から、最も良い改善はどれでしょうか?
function isNewUser(user) {
  return user.daysSinceRegistered < 10;
}

function isRecentOrder(order) {
  return order.daysSincePlaced < 10;
}

3. 次のコードでは、バリデーションメッセージがコピペされています。DRYの観点から、どこを改善するとよいでしょうか?
function validateName(name) {
  if (!name) {
    return '名前は必須です';
  }
  if (name.length > 20) {
    return '名前は必須です';
  }
  return '';
}

4. 次の関数は、画面ごとにほぼ同じローディング表示ロジックをコピペしています。DRYの観点から、最も適切な改善はどれでしょうか?
function showUserLoading() {
  const el = document.getElementById('user-section');
  el.innerHTML = '

読み込み中...

'; } function showOrderLoading() { const el = document.getElementById('order-section'); el.innerHTML = '

読み込み中...

'; }

5. 次の関数は、かなり多くの責務を抱えて太りすぎています。DRY/KISS の観点から、最も問題がある点はどれでしょうか?
function handleCheckout(cart, user) {
  // 合計計算
  // クーポン適用
  // 在庫チェック
  // 配送先住所チェック
  // 支払情報チェック
  // 決済API呼び出し
  // 注文レコード作成
  // メール送信
  // 画面遷移
}

6. 次の関数は、バリデーション・保存・画面遷移までを1つに詰め込んだ例です。KISSの観点から、最も優先して行うべき改善はどれでしょうか?
function submitForm(data) {
  // 入力チェック
  if (!data.name) {
    alert('名前は必須です');
    return;
  }
  if (!data.email) {
    alert('メールアドレスは必須です');
    return;
  }

  // 保存用データ整形
  const payload = {
    name: data.name,
    email: data.email,
    createdAt: new Date().toISOString()
  };

  // 保存API
  fetch('/api/contacts', {
    method: 'POST',
    body: JSON.stringify(payload)
  }).then(() => {
    alert('送信しました');
    location.href = '/thanks';
  }).catch(() => {
    alert('送信に失敗しました');
  });
}

7. 次の2つの関数は、ほとんど同じログ出力を行っています。DRYとKISSの観点から、より良い設計はどれでしょうか?
function logUserLogin(user) {
  console.log('[LOGIN]', new Date().toISOString(), user.id, user.name);
}

function logUserLogout(user) {
  console.log('[LOGOUT]', new Date().toISOString(), user.id, user.name);
}

8. 次の if 文は、KISSの観点から少し読みにくい書き方になっています。最も改善したいポイントはどれでしょうか?
function canShip(order) {
  if (order && order.paid && !order.canceled && !order.refunded && order.items && order.items.length > 0) {
    return true;
  }
  return false;
}

9. 次のコードは、API呼び出しのオプションを毎回ベタ書きしています。DRYの観点から、最も効果的な改善はどれでしょうか?
function fetchUsers() {
  return fetch('/api/users', {
    method: 'GET',
    headers: { 'Content-Type': 'application/json' },
    credentials: 'include'
  });
}

function fetchOrders() {
  return fetch('/api/orders', {
    method: 'GET',
    headers: { 'Content-Type': 'application/json' },
    credentials: 'include'
  });
}

10. 次の関数は、複数のモードに応じて処理を切り替えています。KISSの観点から、最も問題になりやすい点はどれでしょうか?
function handleAction(mode, data) {
  if (mode === 'create') {
    // 作成処理
    // ...
  } else if (mode === 'update') {
    // 更新処理
    // ...
  } else if (mode === 'delete') {
    // 削除処理
    // ...
  } else if (mode === 'copy') {
    // コピー処理
    // ...
  } else if (mode === 'archive') {
    // アーカイブ処理
    // ...
  } else {
    throw new Error('Unknown mode');
  }
}

次のクイズ(密結合な設計を疎結合に変えよ!)へ

DRY/KISSで太りすぎた関数を救え!
採点結果

正答率:0%

-

-

参考文献・出典

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

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

このページの著者

もちもちみかん(システムエンジニア)

社内SEとしてグループ企業向けの業務アプリを要件定義〜運用まで一気通貫で担当しています。

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

得意:PHP・JavaScript・MySQL・CSS

個人実績:フォーム生成基盤クイズ学習プラットフォーム

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

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

もちもちみかん.comとは


このサイトでは、コーディングがめんどうくさい人向けのお助けツールとして、フォームやCSSをノーコードで生成できる、
 もちもちみかん.forms
 もちもちみかん.css1
 もちもちみかん.css2
と言ったジェネレーターを用意してます。

また、このサイトを通じて、「もちもちみかん」のかわいさを普及したいとかんがえてます!