Александр Щепановский «Почему каждому языку нужен...

Preview:

DESCRIPTION

Такие библиотеки как funcy и underscore часто связывают с функциональным программированием, но настоящий их фокус - это практичность. Задача их - упростить манипулирование данными, коллекциями, функциями и даже потоком управления, а также абстрагировать часто встречащиеся полезные поведения. В своём докладе я приведу жизненные примеры использования всего этого, а также расскажу об идеях заложенных в и продвигаемых funcy.

Citation preview

Почему каждому языку нужен свой _

Что такое _?

Underscore – библиотека для JavaScript, которая делает жизнь лучше, предоставляя кучу полезных утилит.

Что такое funcy?

funcy – библиотека для Python, ...

Запутанный кусок кода

images = []

for url in urls:

for attempt in range(TRIES):

try:

images.append(download_image(url))

break

except HttpError:

if attempt + 1 == TRIES:

raise

Распутанный кусок кода

http_retry = retry(TRIES, HttpError)

harder_download = http_retry(download_image)

images = map(harder_download, urls)

Словарь с грязными данными

d = {}

for k, v in request.items():

try:

d[k] = int(v)

except (TypeError, ValueError):

d[k] = None

Словарь с грязными данными

walk_values(silent(int), request)

Отслеживание предыдущего элемента

prev = None

is_ascending = True

for x in seq:

if prev and x >= seq:

is_ascending = False

break

prev = x

Отслеживание предыдущего элемента

is_ascending = all(l < r for l, r

in pairwise(seq))

Больше кода

● Дольше писать● Дольше читать● Дольше отлаживать● Больше ошибок

Зачем нужен _

● ...● …● …● ...

Запутанный кусок кода

images = []

for url in urls:

for attempt in range(TRIES):

try:

images.append(download_image(url))

break

except HttpError:

if attempt + 1 == TRIES:

raise

Что здесь происходит?

● Загрузка картинок (полезный экшн)● Повторные попытки загрузки● Итерация по адресам и сбор результатов

Запутанные аспекты

images = []

for url in urls:

for attempt in range(TRIES):

try:

images.append(download_image(url))

break

except HttpError:

if attempt + 1 == TRIES:

raise

Выделим повторные попытки

def retry(...):

...

http_retry = retry(TRIES, HttpError)

harder_download = http_retry(download_image)

images = []

for url in urls:

images.append(harder_download(url))

Свернём итерацию

def retry(...):

...

http_retry = retry(TRIES, HttpError)

harder_download = http_retry(download_image)

images = map(harder_download, urls)

Вынесем полезные шаблоны

● retry – в библиотеку● map – стандартная функция

(но если нет, то тоже в библиотеку)

Зачем нужен _

● содержит общие шаблоны● …● …● ...

Словарь с грязными данными

# вариант с циклом

d = {}

for k, v in request.items():

try:

d[k] = int(v)

except (TypeError, ValueError):

d[k] = None

# вариант с функцией

walk_values(silent(int), request)

Упрощённый вариант

# вариант с функцией

walk_values(int, request)

# вариант с генератором списков

{k: int(v) for k, v in request.items()}

Составляющие компоненты

# 3 составляющих

walk_values(int, data)

# около 8 составляющих

{k: int(v) for k, v in data.items()}

Высокий и низкий уровень

walk_values(int, data)

# красным выделены низкоуровневые детали

{k: int(v) for k, v in data.items()}

Зачем нужен _

● содержит общие шаблоны● скрывает низкоуровневые детали● …● ...

Естественный язык

# строю словарь из пар

# ключ-"значение, приведённое к целому числу"

# для каждой пары ключ-значение данного словаря

{k: int(v) for k, v in request.items()}

# привожу значения словаря к целым числам

walk_values(int, request)

Зачем нужен _

● содержит общие шаблоны● скрывает низкоуровневые детали● подстёгивает мышление на более абстрактном уровне● ...

Отслеживание предыдущего элемента

is_ascending = all(l < r for l, r

in pairwise(seq))

Порождение новых понятий

is_ascending = all(l < r for l, r

in pairwise(seq))

последовательность возрастает, если для всех её соседних пар левый сосед меньше правого.

Зачем нужен _

● содержит общие шаблоны● скрывает низкоуровневые детали● подстёгивает мышление на более абстрактном уровне● предоставляет набор высокоуровневых понятий

Ещё библиотеки

Java – FunctionalJava, lambdaj

Ещё библиотеки

Java – FunctionalJava, lambdaj

C# - LINQ

Ещё библиотеки

Java – FunctionalJava, lambdaj

C# - LINQ

Objective-C – Underscore.m

Зачем нужен _

● содержит общие шаблоны● скрывает низкоуровневые детали● подстёгивает мышление на более абстрактном уровне● предоставляет набор высокоуровневых понятий

Спасибо

hackflow.comgithub.com/Suor@hackflow

Recommended