確立された設計パターン (シングルトン、ファクトリ、オブザーバーなど) に従っていないコードは、緊密な結合、柔軟性の欠如、重複するコードなどの問題につながる可能性があります。
Copilot Chat は、適切な設計パターンを使用して、コードの柔軟性と保守性を高めるのに役立ちます。 たとえば、インスタンス化の繰り返しをファクトリ パターンに変換することや、オブザーバー パターンを使って緊密に接続されたクラスを分離することを推奨できます。
Note
この記事で説明されている応答は例です。 Copilot Chat の応答は非決定的であるため、ここに示されているものとは異なる応答が返される可能性があります。
サンプル シナリオ
この JavaScript コードでは、それぞれが name
と age
プロパティを持つ 3 つの Person
オブジェクトが作成されます。 その後、人の名前を使って年齢を取得して出力します。
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
var people = {};
function addPerson(name, age) {
people[name] = new Person(name, age);
}
function getAge(name) {
if (people[name]) {
console.log(name + " is " + people[name].age + " years old.");
} else {
console.log("Person not found.");
}
}
addPerson("Ana", 30);
addPerson("Mario", 25);
addPerson("Louise", 40);
getAge("Mario");
プロンプトの例 1
What design patterns could improve this code? Don't show me code examples.
応答の例 1
Copilot は、次のパターンを提案します。
- シングルトン パターン:
people
オブジェクトのインスタンスを確実に 1 つだけにします。 - ファクトリ パターン:
Person
オブジェクトを作成するためのファクトリを作成します。 - モジュール パターン:
people
オブジェクトと関連する関数をモジュール内にカプセル化して、グローバル名前空間の汚染を防ぎます。
プロンプトの例 2
次に、最も適切と思われるパターンを実装するよう Copilot に依頼できます。
Refactor this code using the module pattern
応答の例 2
const PersonModule = (function() {
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
const people = {};
function addPerson(name, age) {
people[name] = new Person(name, age);
}
function getAge(name) {
if (people[name]) {
console.log(name + " is " + people[name].age + " years old.");
} else {
console.log("Person not found.");
}
}
return {
addPerson,
getAge
};
})();
PersonModule.addPerson("Ana", 30);
PersonModule.addPerson("Mario", 25);
PersonModule.addPerson("Louise", 40);
PersonModule.getAge("Mario");
モジュール パターンは、コードの編成を改善し、データのプライバシーを強化し、名前の競合のリスクを軽減するので、コードの保守性と拡張性が向上します。