Красноречивый JavaScript: постоянная группа - PullRequest
0 голосов
/ 16 мая 2019

В книге Eloquent JavaScript предлагается создать класс PGroup, который похож на класс, созданный в предыдущем упражнении. В основном это похоже на упрощенный класс Set, в котором есть методы add, delete и методы. Конкретная часть, которую я совсем не понимаю, в конце. Это говорит:

"Конструктор не должен быть частью интерфейса класса (хотя Вы определенно захотите использовать его внутри). Вместо этого есть пустой экземпляр PGroup.empty, который можно использовать в качестве начального значения. Зачем вам нужно только одно значение Pgroup.empty, а не иметь функция, которая каждый раз создает новую пустую карту? "

Это ответ на вопрос:

class PGroup {
  constructor(members) {
    this.members = members;
  }

  add(value) {
    if (this.has(value)) return this;
    return new PGroup(this.members.concat([value]));
  }

  delete(value) {
    if (!this.has(value)) return this;
    return new PGroup(this.members.filter(m => m !== value));
  }

  has(value) {
    return this.members.includes(value);
  }
}

PGroup.empty = new PGroup([]);

let a = PGroup.empty.add("a");
let ab = a.add("b");
let b = ab.delete("a");

tldr: Что такое PGroup.empty?

edit: Чтобы прояснить путаницу, я имел в виду, что я не понимаю цели PGroup.empty или того, что она вообще имеет в отношении класса PGroup. Как, например, это свойство конструктора?

1 Ответ

1 голос
/ 16 мая 2019

PGroup.empty представляет пустой набор.Вы можете использовать PGroup.empty в качестве отправной точки для создания большего числа наборов.

Что делает эту конкретную реализацию PGroup интересной, так это то, что методы add и delete не изменяют существующий экземпляр PGroup, который вы 'работает на.Вместо этого add и delete возвращают совершенно новые экземпляры PGroup.Это означает, что каждый раз, когда вы добавляете или удаляете элемент из уже имеющейся у вас PGroup, вы создаете совершенно новый экземпляр PGroup, а не изменяете существующий экземпляр PGroup.

Использование этого шаблона означает, что задан пустой набор (в нашем случае PGroup.empty), мы можем создать целую кучу других PGroups, даже не используя явно ключевое слово new.В частности, если бы мы хотели получить набор ['a', 'b', 'c'], мы могли бы сделать следующее:

let abc = PGroup.empty.add('a').add('b').add('c');

Более того, поскольку сам экземпляр PGroup.empty не изменяется при вызове для него метода add, вы можете использовать повторно один и тот же экземпляр PGroup.empty сколько угодно раз.

let xyz = PGroup.empty.add('x').add('y').add('z');
let efg = PGroup.empty.add('e').add('f').add('g');

Этот аспект неизменности позволяет нам выполнить следующее требование:

Конструктор долженне является частью интерфейса класса

Вместо этого мы можем использовать add и delete для создания большего количества экземпляров PGroup.

Технический термин, обозначающий addи delete создание нового экземпляра PGroup вместо изменения существующего экземпляра PGroup называется неизменность .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...