JavaScript | continue文

JavaScript JavaScript
スポンサーリンク

では 部署ごとにカスタム条件・処理・集計をプラグイン化できる完全実務向けサンプル を作ります。


完全プラグイン化テンプレート

特徴:

  • 部署ごとに条件判定、非同期処理、集計方法をカスタマイズ可能
  • スキップ理由も自動記録
  • 非同期並列処理対応
  • JSONレポート出力
  • 新しい部署や条件も簡単に追加可能

コード例

// ==========================
// 汎用データ処理モジュール
// ==========================
async function fetchDepartmentData(deptName) {
  const sampleData = {
    "営業部": [
      {name:"Alice", active:true, score:85},
      {name:"Bob", active:false, score:90},
      {name:"Charlie", active:true, score:60},
    ],
    "開発部": [
      {name:"David", active:true, score:95},
      {name:"Eve", active:true, score:65},
      {name:"", active:true, score:80}
    ],
    "人事部": [
      {name:"", active:false, score:50},
      {name:"Frank", active:false, score:80}
    ]
  };
  return sampleData[deptName] || [];
}

// ==========================
// デフォルトプラグイン
// ==========================
const defaultValidator = (user, options={}) => {
  const {minScore=70} = options;
  if (!user.name) return {valid:false, reason:"名前なし"};
  if (!user.active) return {valid:false, reason:"非アクティブ"};
  if (user.score < minScore) return {valid:false, reason:`スコア不足 (${user.score} < ${minScore})`};
  return {valid:true, reason:null};
};

const defaultProcessor = user => new Promise(resolve => {
  setTimeout(() => {
    console.log(`処理完了: ${user.name}, score=${user.score}`);
    resolve();
  }, 200);
});

const defaultAggregator = (deptName, validUsers, skippedUsers) => {
  const avgScore = validUsers.length
    ? (validUsers.reduce((sum,u)=>sum+u.score,0)/validUsers.length).toFixed(2)
    : 0;
  return {
    department: deptName,
    validUsers: validUsers.map(u=>({name:u.name, score:u.score})),
    skippedUsers,
    totalValid: validUsers.length,
    averageScore: Number(avgScore)
  };
};

// ==========================
// 本番向けプラグイン化メイン処理
// ==========================
async function processDepartmentsWithPlugins(config) {
  const {departments, fetchData, plugins} = config;
  const reports = [];

  for (const dept of departments) {
    console.log(`--- ${dept} 処理開始 ---`);
    const users = await fetchData(dept);

    const validUsers = [];
    const skippedUsers = [];

    for (const user of users) {
      const check = (plugins.validator || defaultValidator)(user, plugins.validatorOptions || {});
      if (!check.valid) {
        skippedUsers.push({name:user.name || "不明", reason:check.reason});
        continue;
      }
      validUsers.push(user);
    }

    if (validUsers.length === 0) {
      console.log(`${dept} に条件を満たすユーザーなし → スキップ`);
      reports.push((plugins.aggregator || defaultAggregator)(dept, [], skippedUsers));
      continue;
    }

    // 並列非同期処理
    await Promise.all(validUsers.map(u => (plugins.processor || defaultProcessor)(u)));

    // 部署レポート作成
    const report = (plugins.aggregator || defaultAggregator)(dept, validUsers, skippedUsers);
    reports.push(report);

    console.log(`--- ${dept} 処理完了 ---`);
  }

  console.log("全部署処理完了\n");
  console.log("部署レポート(JSON形式):");
  console.log(JSON.stringify(reports, null, 2));

  return reports;
}

// ==========================
// 使用例:部署ごとにプラグインを差し替え
// ==========================
(async () => {
  const customPlugins = {
    validator: (user, options={minScore:80}) => {
      // 営業部だけスコア90以上を条件に変更
      if (user.name === "Alice") return {valid:false, reason:"営業部特別条件でスキップ"};
      return defaultValidator(user, options);
    },
    processor: async (user) => {
      await new Promise(r => setTimeout(r, 100)); // 高速処理例
      console.log(`ユーザー ${user.name} をカスタム処理`);
    },
    aggregator: (deptName, validUsers, skippedUsers) => {
      return {
        department: deptName,
        totalValid: validUsers.length,
        skippedUsers,
        validUserNames: validUsers.map(u=>u.name)
      };
    },
    validatorOptions: {minScore:70}
  };

  await processDepartmentsWithPlugins({
    departments: ["営業部", "開発部", "人事部"],
    fetchData: fetchDepartmentData,
    plugins: customPlugins
  });
})();
JavaScript

特徴・ポイント

  1. 部署ごとに条件・処理・集計をプラグイン化
    • 部署ごとに validatorprocessoraggregator を差し替え可能
  2. スキップ理由を自動記録
    • skippedUsers に理由を残すことで監査対応可能
  3. 非同期並列処理対応
    • 条件を満たすユーザーだけ Promise.all で高速処理
  4. JSONレポート出力
    • 集計・スキップ理由・有効ユーザーリストを一括取得
  5. 柔軟性
    • 新しい部署やルール追加、条件変更が容易
    • 実務で即活用できる大規模データ対応

💡 このテンプレートをさらに拡張すると、

  • 部署ごとの異なる API エンドポイント
  • 条件判定や集計ルールの完全モジュール化
  • 結果を外部DBやフロントに自動送信

など、 本番運用レベルのバッチ処理フレームワーク として使えます。

タイトルとURLをコピーしました