Одним из ключевых принципов эффективного программирования является создание функций, каждая из которых выполняет только одну задачу. Этот принцип известен как принцип единственной ответственности (Single Responsibility Principle). В этой главе мы рассмотрим, как правильно применять этот принцип в JavaScript для повышения читаемости, облегчения тестирования и упрощения поддержки кода.
Определение: Функция должна выполнять одну и только одну задачу.
Преимущества: Упрощает понимание кода, облегчает тестирование и поддержку, снижает риск внесения ошибок при изменениях.
Пример 1: Функция с Множественными Задачами
Избегай:
function handleUserData(data) {
..// Парсинг данных
..var parsedData = JSON.parse(data);
..// Валидация данных
..if (parsedData.age < 18) {
....return 'Ошибка: пользователь слишком молод';
..}
..// Сохранение данных
..saveToDatabase(parsedData);
}
Повторяй:
function parseUserData(data) {
..return JSON.parse(data);
}
function validateUserAge(user) {
..return user.age >= 18;
}
function handleUserData(data) {
..var userData = parseUserData(data);
..if (!validateUserAge(userData)) {
....return 'Ошибка: пользователь слишком молод';
..}
..saveToDatabase(userData);
}
В исправленном примере каждая функция выполняет только одну задачу: парсинг, валидацию, обработку.
Пример 2: Упрощение Сложной Функции
Избегай:
function calculateAndReportStatistics(data) {
..var sum = 0, min = data[0], max = data[0];
..for (var i = 0; i < data.length; i++) {
....sum += data[i];
....if (data[i] < min) min = data[i];
....if (data[i] > max) max = data[i];
..}
..var avg = sum / data.length;
..generateReport(min, max, avg);
}
Повторяй:
function calculateSum(data) {
..return data.reduce((sum, value) => sum + value, 0);
}
function findMin(data) {
..return Math.min(…data);
}
function findMax(data) {
..return Math.max(…data);
}
function calculateAverage(data) {
..return calculateSum(data) / data.length;
}
function calculateAndReportStatistics(data) {
..var min = findMin(data);
..var max = findMax(data);
..var avg = calculateAverage(data);
..generateReport(min, max, avg);
}
В исправленном примере функция calculateAndReportStatistics теперь только координирует процесс, в то время как отдельные функции выполняют конкретные вычисления.
Разбиение функций на более мелкие, сфокусированные на выполнении одной задачи, приводит к более организованному, читаемому и удобному для тестирования коду. Этот подход также упрощает отладку и поддержку программы, делая ваш код более модульным и адаптируемым к изменениям. В следующей главе мы перейдем к изучению использования литералов шаблонов для конкатенации строк.