Абстра́кция (лат. abstractio — отвлечение) — теоретическое обобщение как результат абстрагирования.
Пример близкий к реальности:
Есть массив чисел и очередь из сообщений.
Нужно сделать две функции-фильтра - первый пусть вытащит из массива только чётные числа, которые больше 0, а второй вытащит из очереди только свежие сообщения с высоким приоритетом.
Вариант без абстракций:
пишем две независимые функции для каждого типа объектов.
Вариант с абстракциями:
- Создаём абстракцию для нашей задачи: "Дана коллекция из элементов, нужно создать новую коллекцию и поместить в неё только те элементы, которые удовлетворяют некоторому данному условию".
- Выделяем из условия две новые абстракции: Коллекция элементов и Условие (предикат).
- Создаём функцию, которая будет принимать себе как аргумент коллекцию элементов и некоторый предикат
- Реализуем интерфейс предиката - "число чётное и больше 0" и "сообщение свежее и важное"
Результат: Мы изобрели функцию
filter
const array = [-2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const predicate = num => num > 0 && num % 2 === 0;
const result = array.filter(predicate);
Вариант с абстракциями выглядит сложнее (так и есть) и заставляет больше думать на этапе проектирования, но позволяет избежать дублирования кода и, иногда, упростить работу с кодом.
В качестве упражнения можете попробовать реализовать такую функцию в таких условиях, в которых у вас нет функций высшего порядка, а массивы и очереди не имеют какого-то общего интерфейса, чтобы проитерировать каждый элемент.
Подсказка: тут вам пригодится паттерн "адаптер" и "стратегия" (хорошую книгу про паттерны уже упомянул
VicTHOR)