JavaScript | 配列で返している既存コードをオブジェクトにリファクタリングする実務的な例

JavaScript
スポンサーリンク

では、実務でよくあるパターンとして「配列で返している関数」をオブジェクトで返す形にリファクタリングする例を、元コード → 修正版コード → 呼び出し例 でステップごとに解説します。


例題:配列で返している統計関数

元コード(配列で返す)

function calcStats(values) {
  const sum = values.reduce((a, b) => a + b, 0);
  const avg = sum / values.length;
  const max = Math.max(...values);
  const min = Math.min(...values);
  return [sum, avg, max, min]; // 配列で返す
}

// 呼び出し側
const [sum, avg, max, min] = calcStats([10, 20, 30]);
console.log(sum, avg, max, min); // 60 20 30 10
JavaScript

問題点(実務上のデメリット)

  1. 順番依存
    • [sum, avg, max, min] の順番を覚えておかないと、間違えやすい。
  2. 可読性が低い
    • sumresult[0] が直感的に結びつかない。
  3. 拡張が難しい
    • 例えば「中央値」を返す場合、呼び出し側の分割代入も修正が必要。

修正版コード(オブジェクトで返す)

function calcStatsObj(values) {
  const sum = values.reduce((a, b) => a + b, 0);
  const avg = sum / values.length;
  const max = Math.max(...values);
  const min = Math.min(...values);
  const median = values.sort((a, b) => a - b)[Math.floor(values.length / 2)];
  
  return { sum, avg, max, min, median }; // オブジェクトで返す
}
JavaScript

呼び出し側

const { sum, avg, max, min, median } = calcStatsObj([10, 20, 30]);
console.log("合計:", sum);       // 合計: 60
console.log("平均:", avg);       // 平均: 20
console.log("最大:", max);       // 最大: 30
console.log("最小:", min);       // 最小: 10
console.log("中央値:", median);   // 中央値: 20
JavaScript

修正版のメリット(実務的視点)

  1. 意味が明確
    • mediansum など変数名で直接意味が分かる。
  2. 順番に依存しない
    • オブジェクトなので [0] のように番号を覚える必要なし。
  3. 拡張しやすい
    • 将来 variancestdDev を追加しても、呼び出し側のコードは変わらずに { variance, stdDev } を追加するだけ。
  4. チーム開発向き
    • コードレビューやバグ防止に効果大。

実務Tips

  • 配列で返すのは「順序が固定され意味が揃った値」だけ。
  • 意味のある異種データや将来拡張の可能性がある場合はオブジェクトで返すのがベストプラクティス
  • APIやライブラリ設計では、ほとんどオブジェクトで返す形が主流。

💡 応用例として、この関数を APIレスポンス用 に書き換えるとこんな形になります:

function getStatsApi(values) {
  const { sum, avg, max, min, median } = calcStatsObj(values);
  return {
    success: true,
    data: { sum, avg, max, min, median },
    errors: []
  };
}

const response = getStatsApi([10, 20, 30]);
console.log(response.data.sum);   // 60
console.log(response.data.median);// 20
JavaScript
  • APIでは data にオブジェクト、エラーや成功状態も一緒に返すのが現場標準です。
タイトルとURLをコピーしました