ГоловнаВсі публікаціїКатегоріїПро проєкт

Що таке Memoization (приклади Ruby та Ruby on Rails)?

Обкладинка нотатки: Що таке Memoization (приклади Ruby та Ruby on Rails)?
Memoization (мемоізація) — це техніка оптимізації, яка передбачає кешування результатів виконання функції, щоб уникнути повторних обчислень при наступних викликах. Це особливо корисно для дорогих операцій (наприклад, запитів до бази даних, складних обчислень або роботи з API).

Чому така назва?

Термін "memoization" походить від англійського слова "memo" (замітка, пам’ятка) та латинського кореня "memor-" (пам’ятати). Це натякає на те, що функція "запам’ятовує" (кешує) свої результати, щоб уникнути повторних обчислень.
Вперше цей термін використав Дональд Мічі (Donald Michie), британський вчений у галузі штучного інтелекту, ще в 1968 році. Він описав техніку, коли обчислені значення зберігаються для подальшого використання.

Чому не просто "кешування"?

Memoization — це специфічний вид кешування.
  • Memoization зазвичай кешує результати функцій на рівні одного екземпляра об'єкта або в межах одного процесу.
  • Кешування загалом може включати збереження в базі даних, файлах, Redis, а не лише у змінних.
Тобто вся мемоізація є кешуванням, але не все кешування — це мемоізація

Як працює Memoization в Ruby?

У Ruby для мемоізації зазвичай використовують оператор ||= (або явне збереження значення в змінну), щоб зберігати результат у змінній і повертати його при наступних викликах.
class User
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def formatted_name
    @formatted_name ||= name.upcase
  end
end

user = User.new("Марті")
puts user.formatted_name # Виконає обчислення та збереже значення
puts user.formatted_name # Використає кешоване значення
У цьому випадку @formatted_name ||= name.upcase означає:
  • Якщо @formatted_name ще не встановлений (nil або false), він отримає значення name.upcase.
  • Інакше повертається вже збережене значення.
Зауважте щодо ||=
Оператор ||= працює коректно, якщо значення може бути nil або false, але якщо очікуване значення може бути false, тоді така мемоізація не спрацює. Наприклад:
@result ||= false
Якщо @result дорівнює false, вираз знову виконає обчислення.
Для надійної мемоізації можна використовувати явне присвоєння:
@result = some_expensive_operation if @result.nil?

Як працює Memoization в Rails?

У Ruby on Rails мемоізація використовується для оптимізації запитів до бази даних та інших витратних операцій. Приклад мемоізації у моделі:
class User < ApplicationRecord
  def expensive_query
    @expensive_query ||= some_heavy_calculation
  end

  private

  def some_heavy_calculation
    sleep(2) # Симуляція важкої операції
    "Результат обчислення"
  end
end

user = User.first
puts user.expensive_query # Чекаємо 2 секунди
puts user.expensive_query # Отримуємо кешоване значення
Memoization у before_action у контролері:
class UsersController < ApplicationController
  before_action :set_user

  def show
    render json: { user: @user }
  end

  private

  def set_user
    @user ||= User.find(params[:id])
  end
end
Це допомагає уникнути повторних запитів до бази даних, якщо метод @user використовується кілька разів у дії.

Чим відрізняється мемоізація від кешування?

Якщо коротко:
Мемоізація – це збереження результату в межах одного запущеного процесу (наприклад, у змінній екземпляра об’єкта).
Кешування – це ширший термін, який може включати збереження даних між процесами, у базах даних, файлах, Redis, Memcached тощо.
Що потрібно знати, щоб побудувати успішну кар'єру на фрілансі в IT
23.12.2024 16:03

Що потрібно знати, щоб побудувати успішну кар'єру на фрілансі в IT

meme code
meme code@memecode
Віртуальний хмарний сервер: що це таке та в чому його особливість
03.01.2025 10:58

Віртуальний хмарний сервер: що це таке та в чому його особливість

meme code
meme code@memecode
[Fix] Heroku / SearchBox addon - помилка ідексації "The client is unable to verify that the server is Elasticsearch"
31.01.2025 13:09

[Fix] Heroku / SearchBox addon - помилка ідексації "The client is unable to verify that the server is Elasticsearch"

meme code
meme code@memecode
06.02.2025 15:31

Фікс помилки [DEPRECATION] #adapters is deprecated. Use #profiles instead. (Codecov / docile)

meme code
meme code@memecode
Що таке Promise у JavaScript і як швидко зрозуміти суть?
18.02.2025 11:01

Що таке Promise у JavaScript і як швидко зрозуміти суть?

meme code
meme code@memecode
Структура Promise (JavaScript) та як з цим працювати
18.02.2025 14:33

Структура Promise (JavaScript) та як з цим працювати

meme code
meme code@memecode
Що таке debounce у JavaScript і чому це важливо?
21.03.2025 16:39

Що таке debounce у JavaScript і чому це важливо?

meme code
meme code@memecode
Що таке CFB (Cipher Feedback)?
21.03.2025 16:53

Що таке CFB (Cipher Feedback)?

meme code
meme code@memecode
Що таке XOR і як він працює?
21.03.2025 17:05

Що таке XOR і як він працює?

meme code
meme code@memecode