Шаблон свойств привязки
![]() | Эта статья может сбивать с толку или быть непонятной читателям . ( Май 2017 г. ) |
Шаблон привязки свойств объединяет несколько наблюдателей для принудительной синхронизации или координации свойств различных объектов каким-либо образом. Этот паттерн был впервые описан как техника Виктором Портоном. [1] [2] Этот шаблон относится к шаблонам параллелизма .
Сравнение с аспектно-ориентированной реализацией
[ редактировать ]В качестве альтернативы аспектно-ориентированной реализации взаимных свойств можно предложить привязку свойств. В библиотеке C++ LibPropC++ это тоже реализовано. [3]
Некоторая слабость в LibPropC++ (с привязкой свойств):
- Его использование непрозрачно, поскольку необходимо объявить необходимые атрибуты объекта в качестве свойств и предоставить соответствующие методы доступа.
- Привязка атрибутов в LibPropC++ не предназначена для замены вызовов методов.
- Библиотека не ведет историю взаимодействия. [3]
Выполнение
[ редактировать ]Существует два типа привязки. Одностороннюю привязку следует применять, когда одно из свойств доступно только для чтения. В других случаях необходимо применять двустороннюю привязку. [2] [3]
Бесконечные циклы можно устранить, заблокировав сигнал или сравнив назначенное значение со значением свойства перед присвоением, или исключив ненужные назначения. [2] [3]
Связывание свойств разных типов может быть достигнуто путем преобразования типов . [2] [3]
Связывание свойств с помощью преобразований может быть достигнуто за счет сведения функции преобразования к проблеме связывания свойств, и эту функцию можно условно рассматривать как преобразование типов. [2] [3]
Результирующий контекст
[ редактировать ]Свойства синхронизируются автоматически. Между вызовами библиотеки они всегда имеют значения, выраженные EqualityConstraints. [3]
Недостатки
[ редактировать ]Механизм наблюдения за изменениями свойств приобретает некоторые ресурсы. [3]
Пример кода
[ редактировать ]Эскиз кода для односторонней привязки может выглядеть следующим образом:
bind_multiple_one_way(src_obj, src_prop, dst_objs[], dst_props[])
{
for (i, j) in (dst_objs, dst_props)
{
bind_properties_one_way(src_obj, src_prop, i, j);
}
}
Двустороннюю привязку можно выразить следующим образом (на C++ ):
// In this pseudo-code are not taken into the account initial values assignments
bind_two_way(prop1, prop2)
{
bind(prop1, prop2);
bind(prop2, prop1);
}
Выполнение привязки (т. е. подключение уведомления об изменении свойства в обработчике событий) может выглядеть следующим образом:
on_property_change(src_prop, dst_prop)
{
block_signal(src_obj, on_property_change);
dst_prop := src_prop;
unblock_signal(src_obj, on_property_change);
}
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ «Свойства привязки» . Каннингем и Каннингем . Каннингем и Каннингем . Проверено 4 февраля 2015 г.
- ^ Jump up to: а б с д и ж г Портон, В. «Связывание свойств объектов» . Виктор Портон . Проверено 25 февраля 2021 г.
- ^ Jump up to: а б с д и ж г час я дж Эверманн, Дж., Ассоциативный конструкт в концептуальном моделировании – анализ с использованием онтологической модели Бунге , Веллингтон, Новая Зеландия: Школа информационного менеджмента, Университет Виктории.