По ту сторону ООП: PEAK-Rules и PyProtocols

1,000 views

Published on

Доклад был дан на конференции Exception #07 в апреле 2008.

Published in: Technology
2 Comments
0 Likes
Statistics
Notes
  • Обалденный доклад! Спасибо большое, заинтересовали PEAK...
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Доклад был дан на конференции Exception #07 в апреле 2008.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total views
1,000
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
2
Likes
0
Embeds 0
No embeds

No notes for slide

По ту сторону ООП: PEAK-Rules и PyProtocols

  1. 1. За гранью ООП<br />PEAK-Rules и PyProtocols<br />
  2. 2. Работа программиста<br />Алгоритмы и структуры данных<br />Взаимодействие в команде<br />Документация<br />Исправление ошибок<br />Изменения и дополнения<br />запланированные <br />неожиданные<br />миграция кода и рефакторинг<br />
  3. 3. Организация кода<br />Разделение кода на модули<br />Разделение функциональности на функции и классы<br />В конечном счете всё комбинируется компилятором или средой исполнения<br />Как именно делить?<br />Как именно комбинировать?<br />
  4. 4. Подходы и их различия<br /><ul><li>Рассматриваем только широко используемые подходы к программированию:</li></ul>императивное <br />функциональное <br />объектно-ориентированное<br />смешанный подход <br />Отличия именно в том как позволяется организовывать код<br />Обычно это напрямую диктуется языком<br />
  5. 5. ООП<br />Method dispatch<br />Ключ:<br />Класс экземпляра<br />Имя метода<br />Тип параметров (для мультиметодов)<br />Расширение и переопределение [только] через подклассы<br />Не зря пользователи динамических языков широко применяют альтернативные подходы<br />super(…)<br />
  6. 6. О чем речь в докладе<br />PyProtocols<br />Надстройка над ООП<br />Протоколы (интерфейсы) и адаптеры<br />Комбинация адаптеров<br />PEAK-Rules<br />Дополняет и усиливает любой подход<br />Generic functions<br />Самая мощная реализация GF<br />ООП всего лишь частный случай<br />Остальное тоже частный случай<br />
  7. 7. Phillip J. Eby<br />Гвидо пугают его библиотеки <br />BDFL: “And the word middleware (just like much of Phillip Eby's work, alas) scares me”.<br />Бояться не стоит<br /><ul><li>setuptools
  8. 8. WSGI
  9. 9. PEAK-Rules
  10. 10. Trellis
  11. 11. PyProtocols
  12. 12. RuleDispatch
  13. 13. PEAK
  14. 14. Contextual
  15. 15. AddOns
  16. 16. DecoratorTools
  17. 17. BytecodeAssembler
  18. 18. Importing</li></li></ul><li>PyProtocols<br />from protocols import *<br />
  19. 19. Коротко о главном<br />Протокол ≈Интерфейс<br />Протокол это объект обозначающий набор требований<br />Документация<br />Один протокол может подразумевать другой протокол<br />Подклассы в ООП<br />Если объект соответствует одному протоколу, его можно адаптировать к другому<br />
  20. 20. Базовые операции [1]<br />Затребовать от объекта соответствие протоколу<br />stream = adapt(stream, IStream)<br />Объявить экземпляры класса соответствующими протоколу<br />declareImplementation(Stream, [IStream])<br />declareAdapter(NO_ADAPTER_NEEDED, [IStream], forTypes=[Stream])<br />
  21. 21. Базовые операции [2]<br />Объявить способ адаптации между протоколами:<br />declareAdapter(lambda file: file.open(), [IStream],forProtocols=[IFile])<br />Цепочки адаптеров выстраиваются автоматически<br />Есть еще<br />
  22. 22. Использование<br />Проверка интерфейсов / типов <br />Инструмент рефакторинга<br />Поддержка расширяемости<br />Контекстное переопределение, «диалекты» <br />
  23. 23. Проверка интерфейсов / типов <br />Обычная претензия к динамическим языкам:<br />Что будет если методу передать неверный параметр?<br />Класс как протокол<br />Следующий шаг: <br />protocolForType(file, ['read'])<br />
  24. 24. Пример №1<br />from protocols import *<br /> <br />class C(object):<br /> pass<br /> <br />obj = C()<br />assert adapt(obj, C) is obj<br />
  25. 25. Рефакторинг<br />Благодаря адаптации старый и новый код могут легко взаимодействовать<br />Связующий код находится отдельно и его меньше<br />Ни старые ни новые библиотеки не загрязнены проверками<br />Когда рефакторинг завершен, очистить код от поддержки старых вызовов тривиально<br />
  26. 26. Расширяемость<br />Как сделать возможным взаимодействие с произвольными данными?<br />Например:<br />Вывод на печать<br />Сериализация данных<br />Преобразование данных<br />Предоставление и поддержка разноуровневыхAPI<br />Типичное решение – инверсия контроля (callbacks)<br />
  27. 27. Пример 2: Сериализация в XML<br />IXmlString = Protocol()<br />IXmlNode = Protocol()<br />declareAdapter(lambda node: node.xmlstr(),<br /> [IXmlString], forProtocols=[IXmlNode])<br />class XmlElement(object):<br /> def xmlstr(self):<br />xml_body = adapt(self.body, IXmlString)<br />return '<%s>%s</%s>' % (self.tag, xml_body, self.tag)<br />declareImplements(XmlElement, [IXmlNode])<br /> <br />elem = XmlElement('parent', body=XmlElement('child'))<br />assert adapt(elem, IXmlString) == '<parent><child/></parent>'<br />
  28. 28. Контекстное переопределение?<br />Как быть если нужно переопределить часть функциональности да еще и только временно?<br />Как поддержать расширения не предугадывая и не ограничивая их?<br />Это редко встречается потому что в традиционном ООП это дается только большой кровью<br />
  29. 29. Контекстное переопределение!<br />Протокол это всего лишь объект – создаем сколько хотим<br />Например для каждой задачи печати<br />Исходный набор адаптеров получается сам собой<br />Даем остальному коду переопределять любые из адаптеров – как угодно<br />Изменения сами попадут в нужное место<br />Паттерн ООП «это невозможно»<br />
  30. 30. Идеи применения<br />Адаптация к MIME типам<br />text/html  text/*  */*<br />text/x-rst text/html  application/pdf<br />Page  text/x-rst  …<br />Page  application/json<br />Адаптация к возможностям браузера<br />Адаптация к устройствам вывода<br />Model View Controller<br />
  31. 31. PEAK-Rules<br />from peak.rules import *<br />
  32. 32. История вопроса<br />CLOS – Common Lisp Object System<br />Dylan, Smalltalk, S#, Perl6, Cecil, Nice<br />Multiple dispatch<br />Не просто перегрузка методов<br />Python 3000<br />RuleDispatch<br />
  33. 33. Что такое generic function<br />Функция которая переопределяется в зависимости от её аргументов<br />не только по типу первого аргумента<br />не только по типам аргументов<br />не только переопределяется<br />Метод в ООП это частный случай GF<br />single dispatch<br />только по типу<br />
  34. 34. Где это уже было?<br />str, int, bool, repr, pprint, Pickle, copy_reg<br />Математические операции<br />Сравнение<br />
  35. 35. PEAK-Rules rules<br />Любая функция может быть превращена в родовидовую (если есть func_code)<br />Даже алгоритм диспетчеризации можно расширять или заменять<br />AOP<br />Собственные типы методов<br />
  36. 36. Пример№6<br />frompeak.rulesimport *<br /> <br />@abstract<br />defxmlstr(ob):<br />“Convert any object to XML”<br /> <br />@when(xmlstr, (str,))<br />def xmlstr_nop(ob):<br /> return ob<br />
  37. 37. Запросто расширяем чужие функции<br />@when(urllib.urlopen, <br />“url.startswith(‘foobar:’)”)<br />
  38. 38. Реализация: if elifelifelifelif else?<br />Как в классическом ООП<br />Конфликты<br />Порядок проверок условий<br />Отношения следования<br />assert implies((int, str), (int,))<br />@when(implies, …)<br />
  39. 39. Еще возможности<br />next_method<br />Аналог super<br />before, after<br />around<br />MethodType<br />
  40. 40. Уникальные возможности<br />Примеры критериев:<br />uri.fragment is not None<br />hasattr(ob, ‘read’)<br />issubclass(A, B)<br />Любые комбинации:<br />isinstance(a, int) and a > 0<br />В коде выглядит так:<br /> @when(func, “issubclass(A, B)”)<br />
  41. 41. eval? Нет.<br />Строки разбираются<br />Разбиваются на отдельные условия<br />Приводятся к ДНФ<br />По возможности упорядочиваются<br />Компилируются в байт-код<br />Повторяющиеся условия вычисляются лишь однажды<br />Это отдельный движок (обратно совместимый)<br />
  42. 42. Пример: скидки и наценки<br />Скидки<br />Наценки<br />
  43. 43. Всё – частный случай<br />Объекты и наследование<br />adapt – generic function<br />
  44. 44. Еще раз<br />Алгоритмы и структуры данных<br />Взаимодействие в команде<br />Документация<br />Исправление ошибок<br />Изменения и дополнения<br />запланированные <br />неожиданные<br />миграция кода и рефакторинг<br />Организация кода<br />
  45. 45. Я ищу программистов на Python<br />Направления работы<br />Веб-сервис платформы (без акцента на SOAP или WS-*)<br />Кросс-платформенные настольные приложения<br />Масштабируемые решения<br />Чего попроще<br />Отличные условия<br />Интересные, толковые проекты<br />
  46. 46. Спасибо!<br />Вопросы?<br />

×