Понимание архитектуры компонентов 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)

Это позволит вам гибко передавать что-то еще позже, что-то, что не является самой персоной, но может быть адаптировано к этому интерфейсу.

Другие вопросы по тегам