2. Базис
идеи, ведущие к появлению BlueBream
Over-engineering Расширяемость как
через предвосхищение
необходимое условие
➔ ООП иерархии Есть такие проекты, где это
➔ Код для вставки хуков
необходимо
➔ Лишние абстракции
➔ Написание библиотек ➔ Проекты с постоянно
и фреймворков на ровном изменяемыми требованиями
месте ➔ Расширяемые продукты
КОНФЛИКТ
3. Вынос over-engineering
на сторону
Over-engineering Расширяемость как
через предвосхищение необходимое условие
➔ ООП иерархии Есть такие проекты, где это
➔ Код для вставки хуков необходимо
➔ Лишние абстракции
➔ Написание библиотек
➔ Проекты с постоянно
и фреймворков на ровном изменяемыми требованиями
месте ➔ Расширяемые продукты
Тулкит
5. Важные идеи BlueBream
● Интерфейсы ● Security Proxy
● Реестры компонент: ● Декларативный язык
глобальные и локальные ZCML
● Компонентная ● Развертывание:
архитектура, основанная Buildout
на адаптерах
6. ● Интерфейсы ● Security Proxy
● Реестры компонент: глобальные и ● Декларативный язык ZCML
локальные
● Развертывание: Buildout
● Компонентная архитектура, основанная на
адаптерах
from zope.interface import Interface, Attribute, implements
class IFoo(Interface):
bar = Attribute("Bar attribute")
def baaz():
"""Doc string"""
class Foo(object):
implements(IFoo)
bar = None
def baaz(self):
pass
7. ● Интерфейсы
● Security Proxy
● Реестры компонент: глобальные ● Декларативный язык ZCML
и локальные
● Компонентная архитектура, основанная на адаптерах
● Развертывание: Buildout
ЗАПРОC:
Python объекты становятся компонентами ● interface
тогда, когда они зарегистрированы в ● name
реестрах компонент
class Foo: class Foo:
pass implements(IFoo) Реестр
Выбирает компоненты
8. ● Интерфейсы
● Security Proxy
● Реестры компонент: глобальные и локальные
● Декларативный язык ZCML
● Компонентная архитектура, ● Развертывание: Buildout
основанная на адаптерах
class IPerson(Interface):
name = Attribute("Person Name")
class Article2Person(object):
implements(IPerson)
adapts(IArticle)
def __init__(self, article):
self.article = article
@property
def name(self):
return self.article.get_article_name()
# использование адаптера
adapter = IPerson(ob)
name = adapter.name
9. ● Интерфейсы ● Security Proxy
● Реестры компонент: глобальные и локальные
● Декларативный язык ZCML
● Компонентная архитектура, основанная на
адаптерах ● Развертывание: Buildout
Все объекты обернуты в
Security Proxy
10. ● Интерфейсы ● Security Proxy
Реестры компонент: глобальные и локальные
Декларативный язык
●
●
Компонентная архитектура, основанная на
ZCML
●
адаптерах
● Развертывание: Buildout
Декларативные конструкции - на
декларативном языке.
Простой XML с одним уровнем
вложенности.
11. ● Интерфейсы ● Security Proxy
● Реестры компонент: глобальные и локальные ● Декларативный язык ZCML
● Компонентная архитектура, основанная на ● Развертывание:
адаптерах
Buildout
$ python bootstrap.py
$ bin/buildout
$ bin/paster serve deploy.ini