Why Every Language Needs Its Underscore (original) (raw)
1. Почему каждому языку нужен свой _
2. Что такое _? Underscore – библиотека для JavaScript, которая делает жизнь лучше, предоставляя кучу полезных утилит.
3. Что такое funcy? funcy – библиотека для Python, ...
4. Запутанный кусок кода images = [] for url in urls: for attempt in range(TRIES): try: images.append(download_image(url)) break except HttpError: if attempt + 1 == TRIES: raise
5. Распутанный кусок кода http_retry = retry(TRIES, HttpError) harder_download = http_retry(download_image) images = map(harder_download, urls)
6. Словарь с грязными данными d = {} for k, v in request.items(): try: d[k] = int(v) except (TypeError, ValueError): d[k] = None
7. Словарь с грязными данными walk_values(silent(int), request)
8. Отслеживание предыдущего элемента prev = None is_ascending = True for x in seq: if prev and x >= seq: is_ascending = False break prev = x
9. Отслеживание предыдущего элемента is_ascending = all(l < r for l, r in pairwise(seq))
10. Больше кода ● Дольше писать ● Дольше читать ● Дольше отлаживать ● Больше ошибок
11. Зачем нужен _ ● ... ● … ● … ● ...
12. Запутанный кусок кода images = [] for url in urls: for attempt in range(TRIES): try: images.append(download_image(url)) break except HttpError: if attempt + 1 == TRIES: raise
13. Что здесь происходит? ● Загрузка картинок (полезный экшн) ● Повторные попытки загрузки ● Итерация по адресам и сбор результатов
14. Запутанные аспекты images = [] for url in urls: for attempt in range(TRIES): try: images.append(download_image(url)) break except HttpError: if attempt + 1 == TRIES: raise
15. Выделим повторные попытки def retry(...): ... http_retry = retry(TRIES, HttpError) harder_download = http_retry(download_image) images = [] for url in urls: images.append(harder_download(url))
16. Свернём итерацию def retry(...): ... http_retry = retry(TRIES, HttpError) harder_download = http_retry(download_image) images = map(harder_download, urls)
17. Вынесем полезные шаблоны ● retry – в библиотеку ● map – стандартная функция (но если нет, то тоже в библиотеку)
18. Зачем нужен _ ● содержит общие шаблоны ● … ● … ● ...
19. Словарь с грязными данными # вариант с циклом d = {} for k, v in request.items(): try: d[k] = int(v) except (TypeError, ValueError): d[k] = None # вариант с функцией walk_values(silent(int), request)
20. Упрощённый вариант # вариант с функцией walk_values(int, request) # вариант с генератором списков {k: int(v) for k, v in request.items()}
21. Составляющие компоненты # 3 составляющих walk_values(int, data) # около 8 составляющих {k: int(v) for k, v in data.items()}
22. Высокий и низкий уровень walk_values(int, data) # красным выделены низкоуровневые детали {k: int(v) for k, v in data.items()}
23. Зачем нужен _ ● содержит общие шаблоны ● скрывает низкоуровневые детали ● … ● ...
24. Естественный язык # строю словарь из пар # ключ-"значение, приведённое к целому числу" # для каждой пары ключ-значение данного словаря {k: int(v) for k, v in request.items()} # привожу значения словаря к целым числам walk_values(int, request)
25. Зачем нужен _ ● содержит общие шаблоны ● скрывает низкоуровневые детали ● подстёгивает мышление на более абстрактном уровне ● ...
26. Отслеживание предыдущего элемента is_ascending = all(l < r for l, r in pairwise(seq))
27. Порождение новых понятий is_ascending = all(l < r for l, r in pairwise(seq)) последовательность возрастает, если для всех её соседних пар левый сосед меньше правого.
28. Зачем нужен _ ● содержит общие шаблоны ● скрывает низкоуровневые детали ● подстёгивает мышление на более абстрактном уровне ● предоставляет набор высокоуровневых понятий
29. Библиотеки JavaScript – Array, Function, Underscore, Lo-Dash Python – itertools, functools, funcy, toolz, fn.py Ruby – Enumerable, ActiveSupport PHP – functional-php, Underscore.php Clojure – clojure.core
30. Ещё библиотеки Java – FunctionalJava, lambdaj C# - LINQ Objective-C – Underscore.m
31. Зачем нужен _ ● содержит общие шаблоны ● скрывает низкоуровневые детали ● подстёгивает мышление на более абстрактном уровне ● предоставляет набор высокоуровневых понятий