Skip to main content

重构以实现设计模式

Copilot Chat 可以建议可用于改进代码的设计模式。

不遵循既定设计模式(如单例模式、工厂模式或观察者模式)的代码可能会导致紧耦合、缺乏灵活性或代码重复等问题。

Copilot Chat 可以帮助你运用合适的设计模式,使你的代码更具灵活性且更易于维护。 例如,它可以建议将重复性的实例化转换为工厂模式,或者使用观察者模式来分离紧密相连的类。

Note

本文中所述的响应是示例。 Copilot Chat 响应是不确定的,所以你可能会得到与这里所显示的不同的响应。

示例方案

这段 JavaScript 代码创建了三个 Person 对象,每个对象都具有 nameage 属性。 然后它使用一个人的名字来检索并打印出其年龄。

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 对象只有一个实例。
  • 工厂模式****:创建用于创建 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");

模块模式可改善代码组织,增强数据隐私,并降低命名冲突的风险,从而使代码更易于维护和缩放。

其他阅读材料