Позвольте мне познакомить вас с очень распространенным шаблоном, который широко используется разработчиками программного обеспечения. Я постараюсь немного разбавить примеры, чтобы концепция была ясной, но применение этого простого шаблона могло бы быть гораздо более сложным. Он стал очень известен несколько лет назад (2004 г.) благодаря знаменитой программе Google MapReduce: упрощенная обработка данных в больших кластерах. Ключевыми элементами в этом шаблоне являются две функции (что такое функции?): карта и уменьшить. Давайте пока не будем беспокоиться о том, что такое функция.

Что такое карта?

Предположим, вы идете в супермаркет, и я собираюсь использовать этот пример для этих концепций. Допустим, вы берете яблоко, банан и апельсин. Если я спрошу вас «что у вас в корзине?», вы можете ответить: яблоко, банан и апельсин.

Если я знаю, что вас спросят «сколько вы собираетесь потратить?», вы бы сделали следующее: у меня есть 1 яблоко стоимостью 0,5 доллара США, 1 банан стоимостью 1 доллар США и апельсин стоимостью 0,75 доллара США. А затем вы их сложите.

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

Давайте поговорим немного подробнее:

  1. mapItem(banana) это банан
  2. mapPrice(banana) составляет 1 доллар США
  3. mapCalories(banana) (скажем) 100 ккал

Если мы сделаем это для всех наших элементов, то увидим:

  1. mapItem([apple, banana, orange]) is [apple, banana, orange]
  2. mapPrice([apple, banana, orange]) is [0.5, 1, 0,75] USD
  3. mapCalories([apple, banana, orange]) is [50, 100, 75] calories.

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

Что такое сокращение?

В предыдущем примере карты одним из вопросов был «сколько вы собираетесь потратить?», на который я показал, как сопоставить каждый элемент со списком. Но у нас пока нет общей суммы цен на элементы. Для этого мы собираемся уменьшить наши цены до единственного значения. Reduce - это функция (снова это термин функции), которая получает список вещей и производит единственный результат.

В нашем случае это будет что-то вроде reduceSum([1, 0.5, 0.75] USD), что будет равно 2,25 доллара США.

Эта функция выглядит как map в том смысле, что мы получаем массив и просто суммируем его значения, но интересно отметить, что мы не просто сопоставляем отдельные элементы, но используем контекст (или ранее вычисленные значения ).

Если бы я попросил вас суммировать цены, вы бы сделали следующее:

  1. Первый элемент равен 1 доллару США, поэтому частичная сумма составляет 1 доллар США.
  2. Второй элемент составляет 0,5 доллара США, поэтому частичная сумма составляет 1,5 доллара США.
  3. Третий элемент составляет 0,75 доллара США, поэтому частичная сумма составляет 2,25 доллара США.
  4. Цен больше нет, поэтому моя частичная сумма - это моя общая сумма.

Этот «контекст», определяющий следующий (и, в конечном итоге, окончательный) результат, будет выглядеть примерно так:

Что-то более сложное

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

Что же тогда есть функция?

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

Это не требование функций, поскольку у вас могут быть функции без параметров, которые ничего не возвращают. В следующем примере у нас есть функция, которая загружает изображение на ваш диск. Он не принимает никаких параметров и не имеет возвращаемого значения. Но после него твоя последняя фотография останется в безопасности!