Почему этот фрагмент не является чистым? - PullRequest
0 голосов
/ 08 февраля 2020

Когда я смотрю Google Chrome Разработчики, https://youtu.be/qaGjS7-qWzg?t=636

Они сказали, что этот фрагмент не чистый. Я не знаю почему.

const g = new Map();

for (const [u,v] of edges) {
    if (!g.has(u))
        g.set(u, []);
    if (!g.has(v))
        g.set(v, []);
    g.get(u).push(v)
}

И они также упомянули, что это чисто,

const startPoints = new Set(edges.map(([u, v]) => u));

const g = new Map(
  [...startPoints].map(startPoint =>
    edges.filter(([u, v]) => u == startPoint).map(([u, v]) => v)
  )
);

1 Ответ

4 голосов
/ 08 февраля 2020

Когда мы говорим о чистоте в системе, мы говорим о системе, которая не изменяет наблюдаемое состояние.

  • В первом сценарии в строке 1 g есть пустое Map и последней строкой это не так. Его значение было видоизменено.
  • Во втором сценарии startPoints - это то же самое в первой строке и в конце.

Чтобы сделать это немного проще, позвольте мне объяснить это с функцией. Предположим, у вас есть функция, которая дает массив чисел, умножает ее на 2. Так что если:

var a = [1,2,3];
multiply(a)
// a = [2, 4, 6]

Эта функция не является чистой. Это изменило наблюдаемое состояние системы, которое в этом случае a. Но если:

var a = [1,2,3];
var b = multiply(a)
// a = [1, 2, 3]
// b = [2, 4, 6]

Эта функция является чистой. a не изменилось.

...