2008-01-24

Особенности работы реестров.txt

  2008-01-24 13:13

Особенности работы реестров: В Zope в настоящий момент вся работа крутится вокруг двух типов реестров: реестра адаптеров и реестра утилит. ...

Особенности работы реестров:

В Zope в настоящий момент вся работа крутится вокруг двух типов реестров: реестра адаптеров и реестра утилит. Оба реестра обеспечивают подбор компонентов по интерфейсам. Ниже следуют некоторые неочевидные пояснения о том, как это делается.

  1. Реестр адаптеров не предусматривает построение цепочки адаптеров. Такое, в принципе, возможно, и еще более упростило бы повторное использование кода, но на сегодняшний день это невостребовано;
  2. Поиск и подбор адаптера является эвристическим процессом. При подборе адаптера могут возникать ситуации, когда для приведения объекта к интерфейсу подходит более одного адаптера. В этом случае происходит выбор "наилучшего" адаптера на основе некоторой эвристики. Множественный выбор адаптеров возникает из-за объектной природы интерфейсов: интерфейсы _наследуются_ друг от друга. И, хотя в реестре нельзя зарегистрировать два адаптера с одинаковым набором входных и выходных интерфейсов, тем не менее могут существовать два и более адаптеров, способных выполнить одну операцию приведения.

    Фактически, если необходим адаптер (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()
    

Официальный сайт Zope3 Московская группа изучения реактивного движения The Dream Bot Site noooxml