SlideShare une entreprise Scribd logo
1  sur  36
За гранью ООП PEAK-Rules и PyProtocols
Работа программиста Алгоритмы и структуры данных Взаимодействие в команде Документация Исправление ошибок Изменения и дополнения запланированные  неожиданные миграция кода и рефакторинг
Организация кода Разделение кода на модули Разделение функциональности на функции и классы В конечном счете всё комбинируется компилятором или средой исполнения Как именно делить? Как именно комбинировать?
Подходы и их различия ,[object Object],императивное  функциональное  объектно-ориентированное смешанный подход  Отличия именно в том как позволяется организовывать код Обычно это напрямую диктуется языком
ООП Method dispatch Ключ: Класс экземпляра Имя метода Тип параметров (для мультиметодов) Расширение и переопределение [только] через подклассы Не зря пользователи динамических языков широко применяют альтернативные подходы super(…)
О чем речь в докладе PyProtocols Надстройка над ООП Протоколы (интерфейсы) и адаптеры Комбинация адаптеров PEAK-Rules Дополняет и усиливает любой подход Generic functions Самая мощная реализация GF ООП всего лишь частный случай Остальное тоже частный случай
Phillip J. Eby Гвидо пугают его библиотеки  BDFL: “And the word middleware (just like much of Phillip Eby's work, alas) scares me”. Бояться не стоит ,[object Object]
WSGI
PEAK-Rules
Trellis
PyProtocols
RuleDispatch
PEAK
Contextual
AddOns
DecoratorTools
BytecodeAssembler
Importing,[object Object]
Коротко о главном Протокол ≈Интерфейс Протокол это объект обозначающий набор требований Документация Один протокол может подразумевать другой протокол Подклассы в ООП Если объект соответствует одному протоколу, его можно адаптировать к другому
Базовые операции [1] Затребовать от объекта соответствие протоколу stream = adapt(stream, IStream) Объявить экземпляры класса соответствующими протоколу declareImplementation(Stream, [IStream]) declareAdapter(NO_ADAPTER_NEEDED, 				[IStream], forTypes=[Stream])
Базовые операции [2] Объявить способ адаптации между протоколами: declareAdapter(lambda file: file.open(), 			[IStream],forProtocols=[IFile]) Цепочки адаптеров выстраиваются автоматически Есть еще
Использование Проверка интерфейсов / типов  Инструмент рефакторинга Поддержка расширяемости Контекстное переопределение, «диалекты»
Проверка интерфейсов / типов  Обычная претензия к динамическим языкам: Что будет если методу передать неверный параметр? Класс как протокол Следующий шаг:  protocolForType(file, ['read'])
Пример №1 from protocols import *   class C(object):     pass   obj = C() assert adapt(obj, C) is obj
Рефакторинг Благодаря адаптации старый и новый код могут легко взаимодействовать Связующий код находится отдельно и его меньше Ни старые ни новые библиотеки не загрязнены проверками Когда рефакторинг завершен, очистить код от поддержки старых вызовов тривиально
Расширяемость Как сделать возможным взаимодействие с произвольными данными? Например: Вывод на печать Сериализация данных Преобразование данных Предоставление и поддержка разноуровневыхAPI Типичное решение – инверсия контроля (callbacks)
Пример 2: Сериализация в XML IXmlString = Protocol() IXmlNode = Protocol() declareAdapter(lambda node: node.xmlstr(), 			[IXmlString], forProtocols=[IXmlNode]) class XmlElement(object): 	def xmlstr(self): xml_body = adapt(self.body, IXmlString) return '<%s>%s</%s>' % (self.tag, xml_body, self.tag) declareImplements(XmlElement, [IXmlNode])   elem = XmlElement('parent', body=XmlElement('child')) assert adapt(elem, IXmlString) == '<parent><child/></parent>'
Контекстное переопределение? Как быть если нужно переопределить часть функциональности да еще и только временно? Как поддержать расширения не предугадывая  и не ограничивая их? Это редко встречается потому что в традиционном ООП это дается только большой кровью
Контекстное переопределение! Протокол это всего лишь объект – создаем сколько хотим Например для каждой задачи печати Исходный набор адаптеров получается сам собой Даем остальному коду переопределять любые из адаптеров – как угодно Изменения сами попадут в нужное место Паттерн ООП «это невозможно»
Идеи применения Адаптация к MIME типам text/html  text/*  */* text/x-rst text/html  application/pdf Page  text/x-rst  … Page  application/json Адаптация к возможностям браузера Адаптация к устройствам вывода Model View Controller
PEAK-Rules from peak.rules import *
История вопроса CLOS – Common Lisp Object System Dylan, Smalltalk, S#, Perl6, Cecil, Nice Multiple dispatch Не просто перегрузка методов Python 3000 RuleDispatch
Что такое generic function Функция которая переопределяется в зависимости от её аргументов не только по типу первого аргумента не только по типам аргументов не только переопределяется Метод в ООП это частный случай GF single dispatch только по типу
Где это уже было? str, int, bool, repr, pprint, Pickle, copy_reg Математические операции Сравнение
PEAK-Rules rules Любая функция может быть превращена в родовидовую (если есть func_code) Даже алгоритм диспетчеризации можно расширять или заменять AOP Собственные типы методов
Пример№6 frompeak.rulesimport *   @abstract defxmlstr(ob): “Convert any object to XML”   @when(xmlstr, (str,)) def xmlstr_nop(ob):     return ob

Contenu connexe

Tendances

C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.Igor Shkulipa
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»Unguryan Vitaliy
 
TMPA-2013 Pakulin: Automation of Conformance Testing of TLS
TMPA-2013 Pakulin: Automation of Conformance Testing of TLSTMPA-2013 Pakulin: Automation of Conformance Testing of TLS
TMPA-2013 Pakulin: Automation of Conformance Testing of TLSIosif Itkin
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
 
Design by Contract
Design by ContractDesign by Contract
Design by ContractKiev ALT.NET
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программированияAlexander Petrov
 
Predzazhita 2009 v16
Predzazhita 2009 v16Predzazhita 2009 v16
Predzazhita 2009 v16guest1ba51d
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) it-people
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...ScrumTrek
 
Алгоритм работы HTTP-парсера
Алгоритм работы HTTP-парсераАлгоритм работы HTTP-парсера
Алгоритм работы HTTP-парсераguestbd1ac4
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5Technopark
 
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Tatyanazaxarova
 
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Elias Fofanov
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеElias Fofanov
 
подпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскальподпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскальArtem German
 

Tendances (20)

C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.C++ STL & Qt. Занятие 09.
C++ STL & Qt. Занятие 09.
 
Введение в язык программирования «Java»
Введение в язык программирования «Java»Введение в язык программирования «Java»
Введение в язык программирования «Java»
 
TMPA-2013 Pakulin: Automation of Conformance Testing of TLS
TMPA-2013 Pakulin: Automation of Conformance Testing of TLSTMPA-2013 Pakulin: Automation of Conformance Testing of TLS
TMPA-2013 Pakulin: Automation of Conformance Testing of TLS
 
анализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестированияанализ кода: от проверки стиля до автоматического тестирования
анализ кода: от проверки стиля до автоматического тестирования
 
Design by Contract
Design by ContractDesign by Contract
Design by Contract
 
инструменты параллельного программирования
инструменты параллельного программированияинструменты параллельного программирования
инструменты параллельного программирования
 
Rspec
RspecRspec
Rspec
 
Predzazhita 2009 v16
Predzazhita 2009 v16Predzazhita 2009 v16
Predzazhita 2009 v16
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art) DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
Кирилл Черятов. Эволюция системы логирования интеграционного ПО. Сокращаем вр...
 
Алгоритм работы HTTP-парсера
Алгоритм работы HTTP-парсераАлгоритм работы HTTP-парсера
Алгоритм работы HTTP-парсера
 
C++ весна 2014 лекция 5
C++ весна 2014 лекция 5C++ весна 2014 лекция 5
C++ весна 2014 лекция 5
 
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
Использование библиотеки анализа кода OpenC++: модификация, улучшение, исправ...
 
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#Фофанов Илья - Лучшие практики проектирования и реализации API на C#
Фофанов Илья - Лучшие практики проектирования и реализации API на C#
 
лекция 4
лекция 4лекция 4
лекция 4
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзе
 
подпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскальподпрограммы в языке программирования паскаль
подпрограммы в языке программирования паскаль
 

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

Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeSQALab
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentationsef2009
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftAnton Loginov
 
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Mail.ru Group
 
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел КрынецкийJSC “Arcadia Inc”
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямSergey Staroletov
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...yaevents
 
[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)Alexander Bausk
 
Создание и развитие отечественной платформы с открытым программным кодом для ...
Создание и развитие отечественной платформы с открытым программным кодом для ...Создание и развитие отечественной платформы с открытым программным кодом для ...
Создание и развитие отечественной платформы с открытым программным кодом для ...ARCCN
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
 
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Cisco Russia
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...DevDay
 
RUNOS OpenFlow controller (ru)
RUNOS OpenFlow controller (ru)RUNOS OpenFlow controller (ru)
RUNOS OpenFlow controller (ru)Alexander Shalimov
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.Igor Shkulipa
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
F# функциональный язык "новой" волны
F# функциональный язык "новой" волныF# функциональный язык "новой" волны
F# функциональный язык "новой" волныArtem Prysyazhnuk
 
Тестирование QoS на экспериментальном стенде
Тестирование QoS на экспериментальном стендеТестирование QoS на экспериментальном стенде
Тестирование QoS на экспериментальном стендеARCCN
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Sergey Nemchinsky
 
Автоматизация задач с помощью EEM
Автоматизация задач с помощью EEMАвтоматизация задач с помощью EEM
Автоматизация задач с помощью EEMCisco Russia
 

Similaire à По ту сторону ООП: PEAK-Rules и PyProtocols (20)

Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Evgeny Rybak Presentation
Evgeny Rybak PresentationEvgeny Rybak Presentation
Evgeny Rybak Presentation
 
Как пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на SwiftКак пройти собеседование и получить первую работу на Swift
Как пройти собеседование и получить первую работу на Swift
 
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
 
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
Модели в профессиональной инженерии и тестировании программ. Александр Петрен...
 
[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)[RU] Connecting AutoCAD and Python (by Alex Bausk)
[RU] Connecting AutoCAD and Python (by Alex Bausk)
 
Создание и развитие отечественной платформы с открытым программным кодом для ...
Создание и развитие отечественной платформы с открытым программным кодом для ...Создание и развитие отечественной платформы с открытым программным кодом для ...
Создание и развитие отечественной платформы с открытым программным кодом для ...
 
Современный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтерыСовременный статический анализ кода: что умеет он, чего не умели линтеры
Современный статический анализ кода: что умеет он, чего не умели линтеры
 
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
Сетевой инженер 2.0. Что нужно знать о программируемости в корпоративной сети?
 
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...Платформа для автоматического тестирования Erlang проектов на примере UserGat...
Платформа для автоматического тестирования Erlang проектов на примере UserGat...
 
RUNOS OpenFlow controller (ru)
RUNOS OpenFlow controller (ru)RUNOS OpenFlow controller (ru)
RUNOS OpenFlow controller (ru)
 
C# Desktop. Занятие 01.
C# Desktop. Занятие 01.C# Desktop. Занятие 01.
C# Desktop. Занятие 01.
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
F# функциональный язык "новой" волны
F# функциональный язык "новой" волныF# функциональный язык "новой" волны
F# функциональный язык "новой" волны
 
Тестирование QoS на экспериментальном стенде
Тестирование QoS на экспериментальном стендеТестирование QoS на экспериментальном стенде
Тестирование QoS на экспериментальном стенде
 
Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"Конспект лекций по курсу "Шаблоны разработки ПО"
Конспект лекций по курсу "Шаблоны разработки ПО"
 
Автоматизация задач с помощью EEM
Автоматизация задач с помощью EEMАвтоматизация задач с помощью EEM
Автоматизация задач с помощью EEM
 

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

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