Понимание архитектуры компонентов Zope и зависимостей компонентов
Довольно сложно иметь хорошее название моего вопроса. Насколько я понимаю, Адаптер предназначен для добавления дополнительных сервисов к компонентам без его изменения. Адаптер может расширять сервисы из нескольких компонентов.
Но как насчет зависимости между компонентами? Как я могу установить зависимость между компонентом A (Person) и компонентом B (Task), как этот обычный код Python
class Person:
pass
class Task:
def __init__(self, person):
self.owner = person
Если я реализую 2 класса
from zope.interface import Interface
from zope.interface import implements
class IPerson(Interface):
pass
class Person(object):
implements(IPerson)
class ITask(Interface):
pass
class Task(object):
implements(ITask)
def __init__(self, person):
self.owner = person
Это хорошая реализация?
1 ответ
Дело в том, что с ZCA вы не устанавливаете зависимость от конкретного объекта. Вместо этого вы используете утилиты.
Объект A реализует интерфейс, и вы ищите интерфейс в B, чтобы найти конкретную реализацию, которая может быть A, но это зависит от регистра.
Обратите внимание, что ZCA предназначен для того, чтобы позволить вам подключать различные реализации для данного интерфейса, и это не всегда необходимо.
Если ваш объект Task ожидает определенного типа, запишите это. Использование ZCA здесь не является обязательным требованием. Самое большее, вы можете попытаться адаптировать переданное значение к IPerson
; если переданный объект уже реализует этот интерфейс, это действие не допускается:
class Task(object):
implements(ITask)
def __init__(self, owner):
self.owner = IPerson(owner)
Это позволит вам гибко передавать что-то еще позже, что-то, что не является самой персоной, но может быть адаптировано к этому интерфейсу.