읽기 좋은 코드가 좋은 코드다 Ch 9

변수와 가독성

더스틴 보즈웰, 트레버 파우커

Alt text

느낌표 ! (인상 깊은 문장 | 문맥)

중간 결과 삭제하기

var removeOne = function (array, valueToRemove) {
    var indexToRemove = null;
    for (var i = 0 ; i < array.length; i += 1) {
        if (array[i] === valueToRemove) {
            indexToRemove = i;
            break;
        }
    }
    
    if (indexToRemove !== null) {
        array.splice(indexToRemove, 1);
    }
}

변수 indexToRemove 는 단지 중간 결과를 저장할 뿐이다. 이러한 변수는 결과를 얻자마자 곧바로 처리하는 방식으로 제거할 수 있다.

p.135

var removeOne = function (array, valueToRemove) {
    for (var i = 0 ; i < array.length ; i += 1) {
        if (array[i] === valueToRemove) {
            array.splice(i, 1);
            return;
        }
    }
}

이게 답을 보면 눈에 확연히 들어오는데 처음 예제를 보면 어떠한 기능인지는 파악이 되나 딱 리펙토링이 눈에 들어오지는 않았다. 그렇지만 마치 넌센스 퀴즈의 답을 듣고나면 허무하듯 개선된 코드를 보니 너무나 당연한 것이라 허무하다. 한편으로는 왜 이러한 스킬이 없나 싶기는 하지만 다른 한편으로는 그래도 이걸 깨달았다는 것이 기분 좋기도 하다.

자바스크립트에서 프라이빗 변수 만들기

submitted = false;

var submitForm = function (formName) {
    if (submitted) {
        return;
    }
    
    ...
    submitted = true;
}

submitted 와 같은 전역 변수는 코드를 읽는 사람에게 고민을 안겨 줄 것이다. submitForm 만이 submitted 를 사용하는 유일한 함수처럼 보이지만, 확실히 알 수는 없다.

submitted 변수를 클로저 내부에 집어넣어 이러한 문제를 해결 할 수 있다.

p.140



var submitForm = (function () {
    var submitted = false;
    
    return function (formName) {
        if (submitted) {
            return;
        }

        ...
        submitted = true;
    };
})()

이 코딍 에제를 보고는 closure 를 사용할 생각을 하지 못 했다. 그렇지만 closure 를 사용하여 변수를 숨기는 것 매우 좋은 기법 같다. 캡슐화를 해서 데이터의 정교함을 더욱 높일 수 있겠다는 생각이 든다. 코딩을 할 때 closure 를 적용할 수 있는 것인지 의식하며 살펴봐야겠다.

파이썬과 자바스크립트에는 없는 중첩된 범위

example_value = None

if request:
    for value in request.values
        if value > 0:
            example_value = value
            break

if example_value:
    for logger in debug.loggers:
        logger.log("Example:", example_value) 

이 예제에서 example_value 를 완전히 제거할 수도 있다. example_value 는 ‘중간 결과 삭제하기’에서 보았던 것처럼 단지 중간 결과값을 저장할 뿐이다. 이러한 변수는 ‘작업을 최대한 일찍 끝마치는’ 방법으로 완전히 제거할 수 있다.

p.143

def LogExample(value):
    for logger in debug.loggers:
        logger.log("Example:", example_value)
            
if request:
    for value in request.values
        if value > 0:
            LogExample(value)
            break    

생각해보면 변수가 많아도 프로그램의 복잡도는 올라가는 것 같다. 해당 변수를 사용해야할지 혹은 변수를 수정할 때 이를 참조하고 있는 곳은 또 어디인지 혹은 지금 사용하려는 변수가 최신의 데이터를 가지고있는지 등 여러 상황을 살펴봐야한다. 이 뜻은 잘못 사용할 가능성이 도사리고 있다는 뜻이기도하다. 이전 챕터에서는 설명 변수, 요약 변수로 변수로 의미를 나타내는 것을 적었다. 모든 것이 그렇듯 적절함이 중요하다. 위 코드의 예제처럼 일회용이면서 변수를 제거하는 것이 가독성을 낮추지 않는다면 오히려 변수를 줄임으로 버그를 줄일 수 있을 것 같다.

값을 한 번만 할당하는 변수를 선호하라

변수들의 값이 변한다면 프로그램을 따라가는 일은 더욱 어려워진다. 변수 값을 일일이 기억하려면 추가적인 어려움이 야기되기 때문이다. 이러한 문제를 해결하기 위해서 조금 이상하게 들릴 수 있는 제안을 하고자 한다. 값을 한 번만 할당하는 변수를 선호하라는 것이다.

p.145

하나의 변수에 계속 값을 할당하며 사용하는 것보단 여러개의 const 를 사용하는 것이 가독성을 높이는데 더 좋은 것 같다.

Chapter 9 느낌

Chapter 9 에서는 변수를 줄여야 코딩을 하며 발생할 수 있는 변수를 줄일 수 있다는 것을 알려주는 것 같다.


읽기 좋은 코드가 좋은 코드다 Ch 8

거대한 표현을 잘게 쪼개기

읽기 좋은 코드가 좋은 코드다 Ch 10

상관없는 하위문제 추출하기

NCloud LB & SourcePipeline 구축하기
tech collection 서비스 성능 개선하기
Selenium 복권 구매 자동화 만들어보기
디자인 패턴
책 리뷰
블로그 챌린지