Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Why Every Language Needs Its Underscore

1,112 views

Published on

Slides for my PyCon and DevDay talk about the idea of Underscore spread onto other languages.

Video (in russian) is available here http://www.youtube.com/watch?v=lGAC6ftYUS0#t=12100

Published in: Software
  • Be the first to comment

Why Every Language Needs Its Underscore

  1. 1. Почему каждому языку нужен свой _
  2. 2. Что такое _? Underscore – библиотека для JavaScript, которая делает жизнь лучше, предоставляя кучу полезных утилит.
  3. 3. Что такое funcy? funcy – библиотека для Python, ...
  4. 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. 5. Распутанный кусок кода http_retry = retry(TRIES, HttpError) harder_download = http_retry(download_image) images = map(harder_download, urls)
  6. 6. Словарь с грязными данными d = {} for k, v in request.items(): try: d[k] = int(v) except (TypeError, ValueError): d[k] = None
  7. 7. Словарь с грязными данными walk_values(silent(int), request)
  8. 8. Отслеживание предыдущего элемента prev = None is_ascending = True for x in seq: if prev and x >= seq: is_ascending = False break prev = x
  9. 9. Отслеживание предыдущего элемента is_ascending = all(l < r for l, r in pairwise(seq))
  10. 10. Больше кода ● Дольше писать ● Дольше читать ● Дольше отлаживать ● Больше ошибок
  11. 11. Зачем нужен _ ● ... ● … ● … ● ...
  12. 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. 13. Что здесь происходит? ● Загрузка картинок (полезный экшн) ● Повторные попытки загрузки ● Итерация по адресам и сбор результатов
  14. 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. 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. 16. Свернём итерацию def retry(...): ... http_retry = retry(TRIES, HttpError) harder_download = http_retry(download_image) images = map(harder_download, urls)
  17. 17. Вынесем полезные шаблоны ● retry – в библиотеку ● map – стандартная функция (но если нет, то тоже в библиотеку)
  18. 18. Зачем нужен _ ● содержит общие шаблоны ● … ● … ● ...
  19. 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. 20. Упрощённый вариант # вариант с функцией walk_values(int, request) # вариант с генератором списков {k: int(v) for k, v in request.items()}
  21. 21. Составляющие компоненты # 3 составляющих walk_values(int, data) # около 8 составляющих {k: int(v) for k, v in data.items()}
  22. 22. Высокий и низкий уровень walk_values(int, data) # красным выделены низкоуровневые детали {k: int(v) for k, v in data.items()}
  23. 23. Зачем нужен _ ● содержит общие шаблоны ● скрывает низкоуровневые детали ● … ● ...
  24. 24. Естественный язык # строю словарь из пар # ключ-"значение, приведённое к целому числу" # для каждой пары ключ-значение данного словаря {k: int(v) for k, v in request.items()} # привожу значения словаря к целым числам walk_values(int, request)
  25. 25. Зачем нужен _ ● содержит общие шаблоны ● скрывает низкоуровневые детали ● подстёгивает мышление на более абстрактном уровне ● ...
  26. 26. Отслеживание предыдущего элемента is_ascending = all(l < r for l, r in pairwise(seq))
  27. 27. Порождение новых понятий is_ascending = all(l < r for l, r in pairwise(seq)) последовательность возрастает, если для всех её соседних пар левый сосед меньше правого.
  28. 28. Зачем нужен _ ● содержит общие шаблоны ● скрывает низкоуровневые детали ● подстёгивает мышление на более абстрактном уровне ● предоставляет набор высокоуровневых понятий
  29. 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. 30. Ещё библиотеки Java – FunctionalJava, lambdaj C# - LINQ Objective-C – Underscore.m
  31. 31. Зачем нужен _ ● содержит общие шаблоны ● скрывает низкоуровневые детали ● подстёгивает мышление на более абстрактном уровне ● предоставляет набор высокоуровневых понятий
  32. 32. Спасибо hackflow.comgithub.com/Suor@hackflow

×