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):

  1. 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
  2. Bindning av attribut i LibPropC++ är inte utformad för att ersätta metodanrop
  3. 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.

Procedurprogrammering
Objektorienterad programmering
Signaler/händelseprogrammering
Komponenter med egenskaper
binder samman egenskaper

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  );  } 

Se även