Использование мемоизации с методами, использующими зависимости - PullRequest
0 голосов
/ 14 декабря 2018

У нас были некоторые проблемы с производительностью в нашей программной системе, и мы внедрили класс памятки, чтобы улучшить это.Эта реализация запоминания использует аргументы вызываемого метода в сочетании с хешем объекта, а также имя вызываемого метода в качестве отпечатка для ключа кэширования.Поскольку у нас вышло много разработчиков, я могу предвидеть, что возникнет ситуация, когда запомненный метод будет зависеть от других объектов или методов / атрибутов в текущем объекте.Результаты этих зависимостей не используются в отпечатке пальца, что непреднамеренно приводит к неожиданному поведению, поскольку результат извлекается из кэша, а не пересчитывается на основе изменений в этих зависимостях.

Каков общий ожидаемый подход к работе с этими вариантами использования?Должны ли мы учить разработчиков, что запомнившиеся методы не должны использоваться с изменчивыми зависимостями, есть ли метод, который может охватывать эти изменения или что-то совсем другое?

Пример варианта использования (обратите внимание, что это не реальножизненный случай, просто чтобы продемонстрировать проблему под рукой):

<?php

class UseCase {

    protected $volatileAttribute;

    public function setVolatileAttribute(string $value): void
    {
        $this->volatileAttribute = $value;
    }

    public function prependAttribute(string $prepend): string

        return Memoize::once(function(string $prepend) {
            return $prepend . $this->volatileAttribute;
        });
    }
}
...