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 .