В течение некоторого времени я был убежден, что могу писать более читаемый код. Но из-за быстрого темпа работы в агентстве у меня был предлог не тратить больше времени на удобочитаемость. Или я так думал.

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

Хорошо, это звучит очень драматично, но я надеюсь, вы уловили суть!

Написав чистый код, вы поможете кому-то продолжать писать код после вас, но вы также поможете себе. Основная проблема для меня в том, что я могу распознать хороший код, но когда я начинаю кодировать, все это разваливается, потому что я не уверен, что действительно делает код хорошим.

Одна из концепций, которые я извлек, — это уровень абстракции (в ваших функциях). Взгляните на этот фрагмент кода:

function createUser(username, password) {
    if (username.trim().length <= 2) {
        console.error('Username too short.');
        return;
    }
    if (password.length <= 6 || password.length > 30) {
        console.error('Password must be longer than 6 characters and shorter than 30');
        return;
    }
    const user = {username, password};
    database.insert(user);
}

Ничего сложного, верно? Вы можете довольно легко определить, что делает эта функция и какие валидации она проверяет. Но мы можем сделать его еще проще для других разработчиков.

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

function createUser(username, password) {
    try {
        validateUserData(username, password)
    } catch (error) {
        showErrorMessage(error);
        return;
    }
    const user = {username, password};
    database.insert(user);
}

function validateUserData(username, password) {
    if (!isUsernameValid(username)) {
        throw new Error('Username too short');
    }
    if (!isPasswordValid(password)) {
        throw new Error('Password must be longer than 6 characters and shorter than 30');
    }
}

function isUsernameValid(username) {
    return username.trim().length > 2;
}

function isPasswordValid(password) {
    return password.length > 6 && password.length <= 30;
}

function showErrorMessage(message) {
    console.error(message);
}

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

Такое разделение функции дало нам возможность написать еще более качественные тесты, поскольку мы можем легко сосредоточиться на крайних случаях для любой функции. Итак, вы можете себе представить, что этот метод может сделать с более сложной функцией!

Я бы сказал, что это определенно стоит того времени, которое вы потратили на разделение этой функции. Вы будете быстрее находить ошибки, и вам не придется тратить абсурдное количество времени на повторное ознакомление с кодом, который вы написали полгода назад!

_____
Мы открыты для партнерства и новых проектов.
Если у вас есть идея, которую вы хотели бы обсудить, поделитесь ею с нашей командой!

Первоначально опубликовано на https://www.bornfight.com.