Особенности работы реестров.txt
2008-01-24 13:13Особенности работы реестров: В Zope в настоящий момент вся работа крутится вокруг двух типов реестров: реестра адаптеров и реестра утилит. ...
Особенности работы реестров:
В Zope в настоящий момент вся работа крутится вокруг двух типов реестров: реестра адаптеров и реестра утилит. Оба реестра обеспечивают подбор компонентов по интерфейсам. Ниже следуют некоторые неочевидные пояснения о том, как это делается.
- Реестр адаптеров не предусматривает построение цепочки адаптеров. Такое, в принципе, возможно, и еще более упростило бы повторное использование кода, но на сегодняшний день это невостребовано;
- Поиск и подбор адаптера является эвристическим процессом. При
подборе адаптера могут возникать ситуации, когда для приведения
объекта к интерфейсу подходит более одного адаптера. В этом случае
происходит выбор "наилучшего" адаптера на основе некоторой
эвристики. Множественный выбор адаптеров возникает из-за объектной
природы интерфейсов: интерфейсы _наследуются_ друг от друга. И, хотя
в реестре нельзя зарегистрировать два адаптера с одинаковым набором
входных и выходных интерфейсов, тем не менее могут существовать два
и более адаптеров, способных выполнить одну операцию приведения.
Фактически, если необходим адаптер (A1, ..., AN) -> B, то подойдет адаптер любого из суперинтерфейсов (A1,...,AN) к любому из субинтерфейсов B.
Выбор конкретного адаптера однозначен: если каждому адаптеру:
(A1',...,AN')i -> B'iпоставить в соответствие вектор:
(A1'',...,AN'', -B''i),каждый элемент которого это расстояние в __mro__ между требуемым интерфейсом и найденным, то реестр вернет адаптер с наименьшим значением вектора, при условии что происходит поэлементное сравнение:
C < D <=> Exist i : (All 0 < j < i (C[j] == D[j] && C[i] < D[i]) )О качестве такой эвристики можно спорить (можно было бы использовать норму расстояний между векторами), но из ее применения следует по крайней мере то, что выбор порядка аргументов адаптера __не__ произволен. Первыми должны идти более важные аргументы. Характерный пример: обслуживание скинов (см. Скины.txt) перестанет работать, если изменить порядок аргументов вида на обратный, впрочем, так же как и если изменить вышеописанную эвристику.
Подробнее о подборе адаптера см. исходный код:
zope.interface.adapter.AdapterLookupBase._uncached_lookup() zope.interface.adapter._lookup()



