Bindande egenskaper mönster
Bindningsegenskapersmönstret kombinerar flera observatörer för att tvinga egenskaper i olika objekt att synkroniseras eller koordineras på något sätt . Detta mönster beskrevs först som en teknik av Victor Porton. Detta mönster kommer under samtidighetsmönster .
Jämförelse med aspektorienterad implementering
Som ett alternativ till den aspektorienterade implementeringen av ömsesidiga egenskaper kan egendomsbindning föreslås. I LibPropC++ C++-biblioteket är det också implementerat.
En viss svaghet i LibPropC++ (med egenskapsbindning):
- Dess användning är inte transparent eftersom den kräver att deklareras som nödvändiga objektattribut eftersom egenskaper och lämpliga åtkomstmetoder måste tillhandahållas
- Bindning av attribut i LibPropC++ är inte utformad för att ersätta metodanrop
- Biblioteket har ingen interaktionshistorik.
Genomförande
Det finns två typer av bindning. Envägsbindning bör tillämpas när en av egenskaperna är skrivskyddad. I andra fall ska tvåvägsbindning tillämpas.
Oändliga slingor kan elimineras genom att blockera signalen, eller jämföra det tilldelade värdet med egenskapsvärdet innan tilldelningen, eller eliminera onödiga tilldelningar.
Bindande egenskaper av olika typer kan uppnås genom typkonverteringar .
Bindande egenskaper med transformationer kan uppnås genom att reducera transformationsfunktionen till problemet med bindningsegenskaper, och funktionen kan vara imaginär betraktas som typomvandlingar.
Resulterande sammanhang
Egenskaperna hålls automatiskt synkroniserade. Mellan bibliotekssamtal har de alltid de värden som uttrycks av EqualityConstraints.
Brister
Bevakningsmekanismen för fastighetsförändringar får vissa resurser.
Exempelkod
Kodskiss för envägsbindning kan se ut så här:
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 ) ; } }
Tvåvägsbindning kan uttryckas på följande sätt (i C++) :
// I denna pseudo-kod tas inte hänsyn till initiala värden tilldelningar bind_two_way ( prop1 , prop2 ) { bind ( prop1 , prop2 ) ; binda ( prop2 , prop1 ); }
Att utföra bindningen (dvs. koppla meddelandet om egenskapsändring i en händelsehanterare) kan vara så här:
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 ); }