{"meta":{"title":"設計パターンを実装するためのリファクタリング","intro":"コパイロットチャット は、コードの改善に使用できる設計パターンを提案できます。","product":"GitHub Copilot","breadcrumbs":[{"href":"/ja/copilot","title":"GitHub Copilot"},{"href":"/ja/copilot/tutorials","title":"チュートリアル"},{"href":"/ja/copilot/tutorials/copilot-chat-cookbook","title":"GitHub Copilot チャットクックブック"},{"href":"/ja/copilot/tutorials/copilot-chat-cookbook/refactor-code","title":"コードのリファクタリング"},{"href":"/ja/copilot/tutorials/copilot-chat-cookbook/refactor-code/refactor-design-patterns","title":"設計パターンをリファクターする"}],"documentType":"article"},"body":"# 設計パターンを実装するためのリファクタリング\n\nコパイロットチャット は、コードの改善に使用できる設計パターンを提案できます。\n\n確立された設計パターン (シングルトン、ファクトリ、オブザーバーなど) に従っていないコードは、緊密な結合、柔軟性の欠如、重複するコードなどの問題につながる可能性があります。\n\nコパイロットチャット は、適切な設計パターンを使ってコードの柔軟性と保守性を高めるのに役立ちます。 たとえば、インスタンス化の繰り返しをファクトリ パターンに変換することや、オブザーバー パターンを使って緊密に接続されたクラスを分離することを推奨できます。\n\n> \\[!NOTE] この記事で説明されている応答は例です。 コパイロットチャット の応答は決定論的ではないため、ここで示したものとは異なる応答を受け取る可能性があります。\n\n## シナリオ例\n\nこの JavaScript コードでは、それぞれが `Person` と `name` プロパティを持つ 3 つの `age` オブジェクトが作成されます。 その後、人の名前を使って年齢を取得して出力します。\n\n```javascript id=person-module\nclass Person {\n  constructor(name, age) {\n    this.name = name;\n    this.age = age;\n  }\n}\n\nvar people = {};\n\nfunction addPerson(name, age) {\n  people[name] = new Person(name, age);\n}\n\nfunction getAge(name) {\n  if (people[name]) {\n    console.log(name + \" is \" + people[name].age + \" years old.\");\n  } else {\n    console.log(\"Person not found.\");\n  }\n}\n\naddPerson(\"Ana\", 30);\naddPerson(\"Mario\", 25);\naddPerson(\"Louise\", 40);\n\ngetAge(\"Mario\");\n```\n\n## プロンプトの例 1\n\n```copilot copy prompt ref=person-module\nWhat design patterns could improve this code? Don't show me code examples.\n```\n\n## 応答の例 1\n\nCopilot は、次のパターンを提案します。\n\n* **シングルトン パターン**: `people` オブジェクトのインスタンスを確実に 1 つだけにします。\n* **ファクトリ パターン**: `Person` オブジェクトを作成するためのファクトリを作成します。\n* **モジュール パターン**: `people` オブジェクトと関連する関数をモジュール内にカプセル化して、グローバル名前空間の汚染を防ぎます。\n\n## プロンプトの例 2\n\n次に、最も適切と思われるパターンを実装するよう Copilot に依頼できます。\n\n```copilot copy prompt ref=person-module\nRefactor this code using the module pattern\n```\n\n## 応答の例 2\n\n```javascript\nconst PersonModule = (function() {\n  class Person {\n    constructor(name, age) {\n      this.name = name;\n      this.age = age;\n    }\n  }\n\n  const people = {};\n\n  function addPerson(name, age) {\n    people[name] = new Person(name, age);\n  }\n\n  function getAge(name) {\n    if (people[name]) {\n      console.log(name + \" is \" + people[name].age + \" years old.\");\n    } else {\n      console.log(\"Person not found.\");\n    }\n  }\n\n  return {\n    addPerson,\n    getAge\n  };\n})();\n\nPersonModule.addPerson(\"Ana\", 30);\nPersonModule.addPerson(\"Mario\", 25);\nPersonModule.addPerson(\"Louise\", 40);\n\nPersonModule.getAge(\"Mario\");\n```\n\nモジュール パターンは、コードの編成を改善し、データのプライバシーを強化し、名前の競合のリスクを軽減するので、コードの保守性と拡張性が向上します。\n\n## 参考資料\n\n* [GitHub Copilot Chat のプロンプト エンジニアリング](/ja/copilot/using-github-copilot/prompt-engineering-for-github-copilot)\n* [GitHub Copilot の使用に関するベスト プラクティス](/ja/copilot/using-github-copilot/best-practices-for-using-github-copilot)"}