Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Почему каждому языку
нужен свой _
Что такое _?
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))
последовательность возрастает, если для всех
её соседних пар левый сосед меньше правого.
Зачем нужен _
● содержит общие шаблоны
● скрывает низкоуровневые детали
● подстёгивает мышление на более абстрактном уровне
● предоставляет набор высокоуровневых понятий
Библиотеки
JavaScript – Array, Function, Underscore, Lo-Dash
Библиотеки
JavaScript – Array, Function, Underscore, Lo-Dash
Python – itertools, functools, funcy, toolz, fn.py
Библиотеки
JavaScript – Array, Function, Underscore, Lo-Dash
Python – itertools, functools, funcy, toolz, fn.py
Ruby – Enumerable, ActiveSupport
Библиотеки
JavaScript – Array, Function, Underscore, Lo-Dash
Python – itertools, functools, funcy, toolz, fn.py
Ruby – Enumerable, ActiveSupport
PHP – functional-php, Underscore.php
Библиотеки
JavaScript – Array, Function, Underscore, Lo-Dash
Python – itertools, functools, funcy, toolz, fn.py
Ruby – Enumerable, ActiveSupport
PHP – functional-php, Underscore.php
Clojure – clojure.core
Ещё библиотеки
Java – FunctionalJava, lambdaj
Ещё библиотеки
Java – FunctionalJava, lambdaj
C# - LINQ
Ещё библиотеки
Java – FunctionalJava, lambdaj
C# - LINQ
Objective-C – Underscore.m
Зачем нужен _
● содержит общие шаблоны
● скрывает низкоуровневые детали
● подстёгивает мышление на более абстрактном уровне
● предоставляет набор высокоуровневых понятий
Спасибо
hackflow.comgithub.com/Suor@hackflow

More Related Content

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