Глава 3: Создание Функций с Одной Ответственностью

Введение в Главу

Одним из ключевых принципов эффективного программирования является создание функций, каждая из которых выполняет только одну задачу. Этот принцип известен как принцип единственной ответственности (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 теперь только координирует процесс, в то время как отдельные функции выполняют конкретные вычисления.

Заключение

Разбиение функций на более мелкие, сфокусированные на выполнении одной задачи, приводит к более организованному, читаемому и удобному для тестирования коду. Этот подход также упрощает отладку и поддержку программы, делая ваш код более модульным и адаптируемым к изменениям. В следующей главе мы перейдем к изучению использования литералов шаблонов для конкатенации строк.


Загрузка...