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

AIコードをDRY/KISSで徹底リファクタ!
コードレビュー道場 #1:DRY/KISS

公開日:
最終更新日:

このページでは、AIが生成しがちな冗長・重複・やりすぎなコードを題材に、DRY / KISSを武器にしたコードレビュー形式の4択クイズで実戦力を鍛えます。理屈を読むだけでなく、「どこがまずい?どう直す?」を自分の判断として身につけるのが狙いです。

4択クイズ(10問・全問解説付き)で腕試し → 解説でなぜその修正が効くのかを腹落ち。「読む→解く→わかる」で、AIコードをスリムに整えるリファクタの勘所を鍛えていきましょう!

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

#1 DRY/KISS:AIコードをリファクタせよ! 目次

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

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

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

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

1. 次のコードは、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'
  });
}

2. 次の2つの関数は、ほとんど同じメール送信処理を行っています。DRYの観点から、最も良い改善はどれでしょうか?
function sendWelcomeMail(user) {
  const subject = 'ようこそ!';
  const body = `こんにちは ${user.name} さん`;
  mailer.send(user.email, subject, body);
}

function sendByeMail(user) {
  const subject = 'ご利用ありがとうございました';
  const body = `さようなら ${user.name} さん`;
  mailer.send(user.email, subject, body);
}

3. 次のコードでは、配列のフィルタリングとマッピングが重複しています。DRYとKISSの両方を意識した改善として、最もよいものはどれでしょうか?
const activeUserNames = users
  .filter(user => user.active)
  .map(user => user.name);

const activeUserEmails = users
  .filter(user => user.active)
  .map(user => user.email);

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

5. 次の関数は、複数のモードに応じて処理を切り替えています。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');
  }
}

6. 次のコードは、「分かりやすさ」よりも「1行で書くこと」を優先してしまっています。KISSの観点から、どの書き方がより望ましいでしょうか?
const isAdult = (age) => age != null && age >= 18 ? true : false;

7. 次のコードは、ユーザー名ラベルを作る処理です。DRYの観点から、最も問題がある部分はどこでしょうか?
function createUserLabel(user) {
  return user.lastName + ' ' + user.firstName + '(' + user.id + ')';
}

function createOrderLabel(order) {
  const user = order.user;
  return user.lastName + ' ' + user.firstName + '(' + user.id + ')';
}

8. 次のコードでは、同じ「合計金額のフォーマット処理」が重複しています。DRYの観点から、最も適切な改善はどれでしょうか?
function showCartTotal(cart) {
  const total = cart.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  const label = total.toLocaleString() + '円(税込)';
  document.getElementById('cart-total').textContent = label;
}

function showOrderTotal(order) {
  const total = order.items.reduce((sum, item) => sum + item.price * item.quantity, 0);
  const label = total.toLocaleString() + '円(税込)';
  document.getElementById('order-total').textContent = label;
}

9. 次の2つの関数は、データ取得後のエラーハンドリングがコピペになっています。DRYの観点から、どう改善するのがよいでしょうか?
function loadUsers() {
  return fetch('/api/users')
    .then(res => {
      if (!res.ok) {
        throw new Error('ユーザーの取得に失敗しました');
      }
      return res.json();
    });
}

function loadProjects() {
  return fetch('/api/projects')
    .then(res => {
      if (!res.ok) {
        throw new Error('プロジェクトの取得に失敗しました');
      }
      return res.json();
    });
}

10. 次の関数は、ネストが3段階の三項演算子になっています。KISSの観点から、どのような改善が望ましいでしょうか?
function getStatusLabel(status) {
  return status === 'active'
    ? '有効'
    : status === 'pending'
    ? '承認待ち'
    : status === 'suspended'
    ? '停止中'
    : '不明';
}

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
と言ったジェネレーターを用意してます。

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