함수에서 추상화 수준을 혼합하지 말아야 하는 이유

한동안 나는 더 읽기 쉬운 코드를 작성할 수 있다고 확신했습니다. 에이전시에서 일하는 빠른 템포 때문에 가독성에 더 많은 시간을 투자하지 않을 핑계가 생겼습니다. 아니면 그렇게 생각했습니다.

당신의 코드가 충분히 훌륭하고 다른 사람이 몇 달 안에 그것을 완벽하게 이해할 것이라는 확신을 갖기 위해 온갖 변명을 생각해 낼 수 있습니다. 그것은 당신이 스스로 설정한 함정에 실제로 갇혔을 때 당신에게 도움이 되지 않을 것입니다. 자, 이것은 정말 드라마틱하게 들리지만, 나는 당신이 요점을 이해하기를 바랍니다!
깨끗한 코드를 작성함으로써 다른 사람이 계속해서 코드를 작성하도록 도울 수 있지만 자신에게도 도움이 될 것입니다. 저에게 가장 큰 문제는 좋은 코드를 인식할 수 있다는 것입니다. 하지만 코딩을 시작하면 실제로 코드를 좋게 만드는 것이 무엇인지 확신할 수 없기 때문에 이 모든 것이 무너집니다.

내가 선택한 개념 중 하나는 추상화 수준(함수에서)입니다. 다음 코드를 살펴보십시오.

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);
}


이것은 조금 더 많은 코드이지만 함수 이름을 읽는 것만으로도 함수가 수행하는 작업이 매우 분명하다고 생각합니다. 함수가 수행해야 하는 작업을 이해하기 위해 코드를 더 깊이 파고들거나 인지 부하를 늘릴 필요가 없습니다.
이러한 방식으로 함수를 분할하면 모든 함수에 대한 엣지 케이스에 쉽게 집중할 수 있기 때문에 더 나은 테스트를 작성할 수 있는 기회가 주어졌습니다.
이 방법이 더 복잡한 기능에서 무엇을 할 수 있는지 상상할 수 있습니다!

나는 이것이 당신이 이 기능을 분할하는 데 보낸 시간의 가치가 분명히 있다고 주장합니다. 버그를 더 빨리 찾을 수 있고 반년 전에 작성한 코드를 다시 익히는 데 터무니없는 시간을 할애하지 않아도 됩니다!

좋은 웹페이지 즐겨찾기