Ответ
В проекте мы используем гибридный подход, сочетая объектно-ориентированное проектирование домена с элементами функционального программирования (ФП) для обработки данных и написания выразительного, безопасного кода.
Основные применяемые концепции ФП:
- Иммутабельность (Immutability): Широкое использование
record(Java 16+),finalполей и создание новых объектов вместо изменения существующих. Это предотвращает случайные side-effects и упрощает работу в многопоточных сценариях. - Чистые функции (Pure Functions): Функции, результат которых зависит только от входных аргументов и не имеет побочных эффектов (не изменяет глобальное состояние). Это упрощает тестирование и рассуждение о коде.
- Использование Stream API: Для декларативной обработки коллекций вместо императивных циклов.
Практический пример:
// Задача: получить список имен пользователей старше 18 лет.
// Императивный подход (менее предпочтительный):
List<String> names = new ArrayList<>();
for (User user : users) {
if (user.getAge() > 18) {
names.add(user.getName());
}
}
// Функциональный подход с Stream API (предпочтительный):
List<String> filteredNames = users.stream()
.filter(user -> user.getAge() > 18) // Predicate (фильтрация)
.map(User::getName) // Function (преобразование)
.toList(); // Сбор в неизменяемый список
Преимущества такого подхода:
- Читаемость: Код описывает что нужно сделать, а не как.
- Упрощение тестирования: Легко тестировать отдельные лямбда-выражения.
- Потенциал для параллелизма: Замена
.stream()на.parallelStream()для простого распараллеливания.
Ограничения: Мы не используем ФП «фанатично». Сложная бизнес-логика с состоянием по-прежнему инкапсулируется в классах (ООП), а ФП служит инструментом для операций над данными.