2016-10-29 2 views
0

При работе с веб-приложениями обычно результаты запроса (или результаты сложных вычислений, требующих значительной вычислительной мощности), которые не часто меняются, будут кэшироваться в памяти или в хранилище данных на основе файлов. Когда эти результаты могут измениться для каждого запроса, но потребляются рядом классов в вашем приложении, что было бы лучшим способом кэшировать эту информацию в течение всего вашего запроса, сохраняя при этом вещи SOLID?Что такое хороший шаблон дизайна, чтобы избежать повторных вычислений или двойных запросов во время запроса?

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

public function getSomething() 
{ 
    if(! isset($this->something)) 
    { 
     $this->something = $this->calculateSomething(); 
    } 

return $this->something; 
} 

Проблемы, которые я вижу с этим подходом, заключаются в следующем:

  • Я должен убедиться, что везде я требую «что-то», у меня есть доступ к одному экземпляру объекта (или я мог бы использовать статические переменные, которые были бы еще хуже). Это может быть достигнуто путем использования инъекции зависимостей и обеспечения того, что каждый раз, когда я запрашиваю экземпляр из этого класса, возвращается тот же самый, но почему-то я не могу не чувствовать, что я применяю хорошее решение к неправильной проблеме. В конечном итоге мое приложение будет заполнено конкретными зависимостями экземпляров. Я даже не уверен, что это плохо или нет, не стесняйтесь меня исправлять.
  • Мои классы будут заполнены этими утверждениями, которые по сути делают одно и то же. (проверяя, была ли установлена ​​переменная, а если нет, установите ее, а затем верните указанную переменную.) Yikes!

Я ночевал в поисках лучшего решения, но не мог придумать ничего, кроме результатов кеширования только для одного запроса (используя шаблон декоратора, чтобы мои классы были чистыми), что также не так.

Что было бы изящным способом решить эту общую проблему и существует ли известная модель дизайна, которую я мог бы реализовать для этого?

ответ

1

Кажется, я нашел ответ на свой вопрос.

Техника (или шаблон, если вы хотите назвать это), называется memoization.

Эта статья Эдд Манн дает хороший практический пример того, как можно было бы реализовать:

http://eddmann.com/posts/implementing-and-using-memoization-in-php/

Код в этом примере является процедурным, но может быть легко адаптирована для использования в объектно-ориентированной среде.

В целом, это довольно простая техника, которая может немного повысить производительность в определенных сценариях. Я, конечно, рад, что теперь у меня есть слово, которое я могу использовать, когда пытаюсь объяснить это кому-то еще! :-)

+0

Спасибо, что ответили на ваш вопрос! Мне было любопытно, потому что вы спросили об этом, но я сам не нашел ответа. – CodeShark

Смежные вопросы