Перейти к основному содержимому

Инкапсулируйте то, что меняется

Конспект на основе книги "Погружение в паттерны проектирования", Александр Швец.

Принцип заключается в отделении части кода программы, которая будет часто изменяться.

Целью отделения является сделать независимым постоянной части кода от последствий изменений.

Пример инкапсуляции на уровне функции

Рассмотрим функцию вычисления стоимости заказа. Программист в ней соединил две части кода, постоянную и изменяемую. Вычисление стоимости на основе цены за единицу и количества никогда не поменяется. А вот вычисление налога в будущем обязательно поменяется, так зависит от факторов, которые будут меняться (страна, город, политика и т.п.).

/**
* Получить общую стоимость заказа.
* @param order
*/
function getOrderTotal(order) {
const total = 0

for (const item of order.items) {
total += item.price * item.quantity
}

if (order.country === 'Russia') {
total += total * 0.04
}
if (order.country === 'Ukraine') {
total += total * 0.11
}

return total
}

Ту часть кода, которая будет изменяться следует отделить:

/**
* Получить общую стоимость заказа.
* @param order
* @returns {number}
*/
function getOrderTotal(order) {
const total = 0

for (const item of order.items) {
total += item.price * item.quantity
}

total += total * getTaxAmount(order.country)

return total
}

/**
* Получить величину налога в зависимости от страны.
* @param country
* @returns {number}
*/
function getTaxAmount(country) {
if (order.country === 'Russia') {
return 0.04
}

if (order.country === 'Ukraine') {
return 0.11
}

return 0
}