Является ли выполнение сопоставления без использования возвращаемого значения антипаттерном? - PullRequest
0 голосов
/ 05 июля 2019

Допустим, у меня есть список, и я хочу добавить в него некоторые значения, используя функцию отображения:

const arr = [1, 2, 3, 4, 5];
const anotherArr = [];

Я делаю это, используя функциональный подход:

arr.map((item) => anotherArr.push(item);

Является ли это антипаттерном / плохой логикой, то есть не использует возвращаемое значение операции отображения для чего-либо? Есть ли на это хорошие ресурсы?

(я знаю, что эта логика глупа, и я могу просто скопировать список - это не главное в моем вопросе)

1 Ответ

3 голосов
/ 05 июля 2019

Да, это анти-паттерн. Метод .map имеет очевидное применение - вы преобразовываете содержимое одного массива в другой. Вы делаете это, предоставляя функцию отображения, которая выражает отношение каждого элемента, например, чтобы преобразовать букву в ее позицию в алфавите, можно выразить через функцию:

function letterToPositionInAlphabet(letter) {
  return letter.toUpperCase().charCodeAt(0) - 64;
}

Таким образом, отображение массива букв с помощью этой функции даст вам массив с каждой из их позиций:

function letterToPositionInAlphabet(letter) {
  return letter.toUpperCase().charCodeAt(0) - 64;
}

const letters = ["a", "b", "c"];

console.log(letters.map(letterToPositionInAlphabet));

Операция отображения идиоматична и является частью понимания кода. Если вы видите, что someArr.map(someFn) устанавливает ожидания, и легко понять, какая операция происходит, без необходимости знать содержимое массива или функции. Когда вы видите letters.map(letterToPositionInAlphabet), должно быть тривиально понять, в чем заключается цель - получить позиции в алфавите некоторых букв.

Тем не менее, использование .map в качестве .forEach нарушает это предполагаемое значение и может сбивать с толку при чтении. Имея это

function playerToPlaceInRankList(player) {
   const position = lookupPlayerRank(player);
   positionsArr.push(position);
}

/* many lines later */

players.map(playerToPlaceInRankList);

/* more code */

Строка, которая выглядит как , в которой выполняется сопоставление, также сразу выглядит неправильно, поскольку возвращаемое значение игнорируется. Либо эта строка не нужна, либо вам нужно посмотреть, что делает playerToPlaceInRankList, чтобы узнать, что на самом деле здесь происходит. Это ненужная умственная нагрузка для простого чтения того, что должно быть прямой строкой и самодокументированной строкой кода.

То же самое относится к использованию других методов, таких как .filter, .find, .every, .some и т. Д. Не используйте их только потому, что они выполняют итерацию по массиву, если вы хотите не то, что они предназначены для этого.

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