El estilo de paso de tienda es una técnica de programación que se usa para modelar el estado mutable sin usar el estado mutable. [1] [2] Generalmente surge en la conversión de programas imperativos en programas puramente funcionales .
Entonces, por ejemplo, considere este programa JavaScript , escrito en un estilo que no pasa por la tienda:
var lastWasA = falso// un treebin representa un árbol binario de cadenas.// un treebin es // - una cadena, o // - {l: , r: } // ¿Un recorrido en orden de las // hojas de este árbol contiene una 'a' seguida de una 'b'? function aThenB ( treebin ) { if ( typeof ( treebin ) === "string" ) { if ( treebin === "a" ) { lastWasA = true ; devolver falso ; } else if ( treebin === "b" ) { if ( lastWasA ) { return true; } else { lastWasA = false ; devolver falso ; } } else { lastWasA = false ; devolver falso ; } } else { // no es una cadena, debe ser un nodo interno: return (( aThenB ( treebin . l )) || ( aThenB ( treebin . r ))); } }
Contiene una referencia a una variable global . En el estilo de paso de tienda, el valor de la variable global (o variables) se pasa a cada llamada, y también se devuelve de cada llamada y se pasa a través de la siguiente llamada. El código podría verse así:
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 { resultado : falso , lastWasA : falso }; } } else { // no es una cadena, debe ser un nodo interno: var leftCall = aThenB ( treebin . l , lastWasA ); if ( leftCall . result ) { return { result : true , lastWasA : false } } else { return aThenB ( treebin . r , leftCall . lastWasA ); } } }
Tenga en cuenta que cada llamada toma un argumento adicional y ahora se devuelven dos valores; el valor de retorno ordinario y un nuevo valor que representa el estado de la variable anteriormente mutable.
El estilo de paso de tienda puede ser bastante doloroso de escribir, pero puede ayudar a eliminar las condiciones de carrera al aislar el estado dentro de las llamadas a funciones, y puede potencialmente hacer que el código sea más paralelizable .
Ver también
Referencias
- ^ Friedman, Daniel; Wand, Mitchell (abril de 2008). Fundamentos de los lenguajes de programación (4ª ed.). Boston, MA: MIT Press. ISBN 978-0262062794.
- ^ Krishnamurthi, Shriram (noviembre de 2012). Lenguajes de programación, aplicación e interpretación (Segunda ed.). autoeditado . Consultado el 10 de febrero de 2016 .