Есть ли имя для этой идиомы, которая вычисляет новый результат на основе предыдущего значения и результата? - PullRequest
0 голосов
/ 13 марта 2019

Существует ли стандартное имя для этой идиомы Deriver (написано в Typescript, но не для Typescript):

type Derivation<T, R> = { value: T, result: R };
type Deriver<T, R> = (
    previous: Derivation<T, R> | undefined,
    value: T
) => R;

, где deriver - это функция, которая вычисляет новое значение R используя предыдущее значение / результат в качестве подсказки для потенциальной оптимизации нового вычисления?

Вот пример такой функции:

function complexCalculation(a: number, b: number): number {
    // assume that this function is expensive
    return a + b;
}

function calcDeriver(
    previous: Derivation<number[], number> | undefined,
    value: number[]
): number {
    if (previous) {
        if (previous.value === value) {
            return previous.result;
        }
        let samePrefix = true;
        if (previous.value.length < value.length) {
            for (let i = 0; i < previous.value.length; i++) {
                if (previous.value[i] !== value[i]) {
                    samePrefix = false;
                    break;
                }
            }
        }
        if (samePrefix) {
            return value
                .slice(previous.value.length)
                .reduce(complexCalculation, previous.result);
        }
    }

    return value.reduce(complexCalculation, 0);
}

1 Ответ

2 голосов
/ 13 марта 2019

Моей первой мыслью было, что это была форма Памятка с единственным запомненным результатом.Однако, если бы это было так, вы бы просто возвратили previous.result, если samePrefix было найдено.

Вместо этого похоже, что вы создаете что-то вроде Reduce / Fold функция, которая способна определить, где он остановился из предыдущего состояния.

Существует множество различных названий для этого шаблона, поэтому вы должны определить, что, по вашему мнению, лучше всего подходит для вашего случая.Вот некоторые предложения:

  • Reduction / Reducer
  • FoldResult / Folder
  • Aggregation / Aggregator
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...