Search
Write a publication
Pull to refresh

Comments 9

Есть ещё один пункт — это опасно. Библиотека, считая входящие данные чистой функцией может запросто на одном значении вызвать их два раза. И вы никогда не знаете когда это внезапно произойдёт.

Можно при возникновении ошибки валидации (andrew: null) заменять его на дефолтное значение (andrew: ["+99999999"]), это норм для практики некритичной отказоустойчивости. А ошибки эти ловить генератором, который будет работать по while(!checkPhoneBook(obj)), это уже просто в качестве упражнения

О чём вообще статья?
Вы взяли библиотеку валидации, добавили очень странный сайд-эффект в виде складывания в массив. Потом сказали, что это плохо (кто бы мог подумать).
И в завершении вместо этого метода сделали другой, уже без валидации, который перекладывает номера в массив (без валидации, повторю).
Какой вывод можно сделать?

Возникла идея использовать библиотеку валидации для декларативного описания стратегии итерации по вложений структуре данных объекту.
Эта идея меня позабавила. Я хотел такой идеей поделиться. Об этом и статья
А так как эта идея обладает отрицательными качествами, я решил о них написать, чтобы не возникло ощущения что я предлагаю использовать валидации для итерации в «серьезном» коде.

А почему не Object.values(phoneBook).flat() для последнего решения?

Да, действительно, хорошее решение. Я не против такого решения.
Могу отметить три различия: поддержка браузеров, производительность и читаемость.


Поддержка браузеров:


Object.keys + for-of: 94%
Object.values+.flat(): 91%


Производительность на входных данных из статьи на Node v12:
Внимание: бенчмарк на единственных входных данных на единственной версии интерпретатора JS. Не делайте решающих выводов на основании только этого бенчмарка


keys + for-of x 7,210,543 ops/sec ±2.47% (85 runs sampled)
values + flat x 747,610 ops/sec ±0.82% (91 runs sampled)
Fastest is keys + for-of

(Чем больше ops/sec тем лучше)


Код бенчмарка
const Benchmark = require("benchmark");

const suite = new Benchmark.Suite();

const phoneBook = {
  andrew: ["+345356245254", "+313232312312"],
  vasilina: ["+132313123123"],
  serhiy: ["+587234878234", "+321323124123"],
};

suite
  .add("keys + for-of", function () {
    const phoneNumbers = [];

    const personNames = Object.keys(phoneBook);

    for (const personName of personNames) {
      const personPhoneNumbers = phoneBook[personName];
      phoneNumbers.push(...personPhoneNumbers);
    }

    return phoneNumbers;
  })
  .add("values + flat", function () {
    return Object.values(phoneBook).flat();
  })
  .on("cycle", function (event) {
    console.log(String(event.target));
  })
  .on("complete", function () {
    console.log("Fastest is " + this.filter("fastest").map("name"));
  })
  .run({ async: true });

Читаемость вашего варианта очень хороша.


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


На мой взгляд читаемость важнее. Так что мой голос идёт в сторону Object.values(phoneBook).flat()

Sign up to leave a comment.

Articles