Butikspasserande stil

Store-passeringsstil är en programmeringsteknik som används för att modellera föränderligt tillstånd utan att använda föränderligt tillstånd. Det uppstår vanligtvis vid omvandling av imperativa program till rent funktionella .

Så, till exempel, överväga detta JavaScript- program, skrivet i en icke-butikspasseringsstil:

   









  
      
        
        
       
          
        
         
        
          
         
      
      
        
       
    
     
     
  
 var  lastWasA  =  false  // en treebin representerar ett binärt träd av strängar.  // en treebin är antingen  // - en sträng, eller  // - {l : <treebin>, r: <treebin>}  // innehåller en genomgång av detta träds  //-blad ett 'a' följt av ett 'b'?  function  aThenB  (  treebin  )  {  if  (  typeof  (  treebin  )  ===  "string"  )  {  if  (  treebin  ===  "a"  )  {  lastWasA  =  true  ;  returnera  falskt  ;  }  else  if  (  treebin  ===  "b"  )  {  if  (  lastWasA  )  {  return  true  ;  }  annat  {  lastWasA  =  false  ;  returnera  falskt  ;  }  }  else  {  lastWasA  =  false  ;  returnera  falskt  ;  }  }  else  {  // inte en sträng, måste vara en intern nod:  return  ((  aThenB  (  treebin  .  l  ))  ||  (  aThenB  (  treebin  .  r  )));  }  } 

Den innehåller en referens till en global variabel . I butikspasseringsstil skickas värdet av den globala variabeln (eller variablerna) vidare till varje anrop, och returneras även från varje anrop och träds genom nästa anrop. Koden kan se ut så här:

   
      
        
          
          
        
            
      
      
          
    
     
        
      
          
      
        
    
  
 function  aThenB  (  treebin  ,  lastWasA  )  {  if  (  typeof  (  treebin  )  ===  "string"  )  {  if  (  treebin  ===  "a"  )  {  return  {  result  :  false  ,  lastWasA  :  true  };  }  else  if  (  treebin  ===  "b"  )  {  if  (  lastWasA  )  {  return  {  result  :  true  ,  lastWasA  :  false  };  }  }  else  {  return  {  resultat  :  false  ,  lastWasA  :  false  };  } }  else  {  //  inte en sträng, måste vara en intern nod:  var  leftCall  =  aThenB  (  treebin  .  l  ,  lastWasA )   ;  if  (  leftCall  .  result  )  {  return  {  result  :  true  ,  lastWasA  :  false  }  }  else  {  return  aThenB  (  treebin  .  r  ,  leftCall  .  lastWasA  );  }  }  } 

Observera att varje anrop tar ett extra argument och två värden returneras nu; det ordinarie returvärdet och ett nytt värde som representerar tillståndet för den tidigare föränderliga variabeln.

Store-passeringsstil kan vara ganska smärtsamt att skriva, men kan hjälpa till att eliminera rasförhållanden genom att isolera tillstånd inom funktionsanrop, och kan potentiellt göra koden mer parallelliserbar .

Se även