형식 맞추기(2)

종속 함수

책너두 5기 12일차

로버트 C. 마틴의 클린코드 p.103 ~ p.110

내용 정리

5. 형식 맞추기

종속 함수

한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 가능하면 호출하는 함수를 호출되는 함수보다 먼저 배치한다. 상수를 알아야 마땅한 함수에서 실제로 사용하는 함수로 상수를 넘겨주는 방법은 좋다.

개념적 유사성

개념적인 친화도가 높은 함수는 가까이 배치한다. 한 함수가 다른 함수를 호출해 생기는 직접적인 종속성, 변수와 그 변수를 사용하는 함수, 비슷한 동작을 수행하는 일군의 함수 등.

세로 순서

내려갈수록 고차원에서 저차원으로. 중요한 개념을 가장 먼저 표현해야 하기 때문이다.

가로 형식 맞추기

일반적으로 20~60자 정도가 많다. 지나치게 길 필요는 없다.

가로 공백과 밀집도

가로 공백을 통해 밀접한 개념과 느슨한 개념을 표현

1
2
3
4
5
6
7
private void measureLine(String line) {
    lineCount++;
    int lineSize = line.lengtrh();
    totalChars += lineSize;
    lineWidthHistogram.addLine(lineSize, lineCount);
    recordWidestLine(lineSize);
}

할당 연산자를 강조하기 위해 앞뒤에 공백을 줬다. 함수이름과 이어지는 괄호 사이에는 공백을 안넣은 이유는 둘은 밀접하기 때문.

연산자 우선순위를 강조하기 위해서도 공백을 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Quadratic {
    public static double root1(double a, double b, double c) {
        double determinant = determinant(a, b, c);
        return (-b + Math.sqrt(determinant)) / (2*a);
    }

    public static double root2(int a, int b, int c) {
        double determinant = determinant(a, b, c);
        return (-b - Math.sqrt(determinant)) / (2*a);
    }
    private static double sdeterminanat(double a, double b, double c) {
        return b*b - 4*a*c;
    }
}

우선순위가 높은 곱셈에는 공백을 넣고 덧셈과 뺄셈은 넣지 않았다.

가로 정렬

선언문과 할당문을 별도로 정렬하는 것은 보기에는 좋아 보일지 모르지만 실제로는 그렇지 않다. 진짜 의도가 가려지기 때문이다. 정렬이 필요할 정도로 목록이 길다면 문제는 목록 길이지, 정렬이 아니다.

아래는 안좋은 예시

1
2
3
4
5
6
7
public class FitNesseExpediter implements ResponseSender
{
    private Socket 			socket;
    private InputStream 	input;
    private OutputStream 	output;
    ...
}

이렇게 하면 변수 유형은 무시하고 변수 이름부터 읽게 된다. 또한 정렬하지 않으면 오히려 중대한 결함을 찾기 쉽다.

읽고 나서

그 동안 코드의 형식을 보기 좋게 할때, 최우선으로 삼은 것은 말 그대로 보기좋게 만드는 것이였다. 정확하고 엄밀하게 말해서는 중요한 부분을 돋보이게, 불필요한 부분이 도드라지지 않도록 하는 것이었다.