Стиль прохождения магазина
Стиль передачи данных из хранилища — это метод программирования, который используется для моделирования изменяемого состояния без использования изменяемого состояния. [1] [2] Обычно оно возникает при конвертации императивных программ в чисто функциональные .
Итак, например, рассмотрим эту программу на JavaScript , написанную в стиле без передачи данных в хранилище:
var lastWasA = false
// a treebin represents a binary tree of strings.
// a treebin is either
// - a string, or
// - {l : <treebin>, r: <treebin>}
// does an in-order traversal of this tree's
// leaves contain an 'a' followed by 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 { // not a string, must be an internal node:
return ((aThenB(treebin.l))||(aThenB(treebin.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 {result: false, lastWasA: false};
}
} else { // not a string, must be an internal node:
var leftCall = aThenB(treebin.l, lastWasA);
if (leftCall.result) {
return {result: true, lastWasA: false}
} else {
return aThenB(treebin.r, leftCall.lastWasA);
}
}
}
Обратите внимание, что каждый вызов принимает дополнительный аргумент, и теперь возвращаются два значения; обычное возвращаемое значение и новое значение, представляющее состояние ранее изменяемой переменной.
Написание стиля передачи данных из хранилища может быть довольно болезненным, но он может помочь устранить условия гонки за счет изоляции состояния внутри вызовов функций и потенциально может сделать код более распараллеливаемым .
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Фридман, Дэниел; Ванд, Митчелл (апрель 2008 г.). Основы языков программирования (3-е изд.). Бостон, Массачусетс: MIT Press. ISBN 978-0262062794 .
- ^ Кришнамурти, Шрирам (ноябрь 2012 г.). Языки программирования, применение и интерпретация (2-е изд.). самостоятельно опубликовано . Проверено 10 февраля 2016 г.