Стиль передачи хранилища — это метод программирования, который используется для моделирования изменяемого состояния без использования изменяемого состояния. [1] [2] Обычно он возникает при преобразовании императивных программ в чисто функциональные .
Так, например, рассмотрим эту программу JavaScript , написанную в стиле, не предусматривающем передачу данных:
var lastWasA = ложь // TreeBin представляет собой двоичное дерево строк.// treebin - это либо // - строка, либо // - {l : <treebin>, r: <treebin>}// содержит ли упорядоченный обход листьев этого дерева // 'a', за которым следует 'b'? function aThenB ( treebin ) { if ( typeof ( treebin ) === "string" ) { if ( treebin === "a" ) { lastWasA = true ; return false ; } else if ( treebin === "b" ) { if ( lastWasA ) { return true ; } else { lastWasA = false ; return false ; } } else { lastWasA = false ; return false ; } } else { // не строка, должен быть внутренним узлом: return (( aThenB ( treebin . l )) || ( aThenB ( treebin . r ))); } }
Это содержит ссылку на глобальную переменную . В стиле store-passing значение глобальной переменной (или переменных) передается в каждый вызов, а также возвращается из каждого вызова и пропускается через следующий вызов. Код может выглядеть так:
function aThenB ( treebin , LastWasA ) { if ( typeof ( treebin ) === "строка" ) { if ( treebin === "a" ) { return { result : false , LastWasA : true }; } Еще если ( treebin === "b" ) { если ( lastWasA ) { возвращение { результат : правда , LastWasA : ложь }; } } Еще { возврат { результат : ложь , LastWasA : ложь }; } } else { // не строка, должен быть внутренним узлом: var leftCall = aThenB ( treebin.l , lastWasA ); если ( leftCall . result ) { вернуться { результат : true , lastWasA : false } } else { вернуть aThenB ( treebin.r , leftCall.lastWasA ) ; } } }
Обратите внимание, что каждый вызов принимает дополнительный аргумент, и теперь возвращаются два значения: обычное возвращаемое значение и новое значение, представляющее состояние ранее изменяемой переменной.
Стиль передачи хранилища может быть довольно сложным для написания, но он может помочь устранить состояния гонки за счет изоляции состояния в вызовах функций и потенциально может сделать код более параллелизуемым .