형식

프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야한다.

코드 형식을 맞추기 위한 간단한 규칙을 정하고 그 규칙을 따라야한다.

팀으로 일한다면 팀이 합의해 규칙을 정하고 모두가 그 규칙을 따라야한다.

1. 형식을 맞추는 목적.

  • 코드 형식은 중요하다.

  • 코드 형식은 의사소통의 일환이다.

  • 오랜 시간이 지나 원래 코드의 흔적을 더 이상 찾아보기 어려울 정도로 코드가 바뀌어도 맨 처음 잡아놓은 구현 스타일과 가독성 수준은 유지보수와 확장성에 계속 영향을 미친다.

2. 적절한 행 길이를 유지하라.

500줄을 넘지 않고 대부분 200줄 정도인 파일로도 커다란 시스템을 구축할 수 있다.

일반적으로 작은 파일이 이해하기 쉽다.

신문 기사처럼 작성하라.

신문 기사를 떠올려보자. 독자는 위에서 아래로 기사를 읽는다.

최상단에 기사를 몇 마디로 요약하는 표제가 나오고, 첫 문단은 전체 기사 내용을 요약한다.

세세한 사실은 숨기고, 커다란 그림을 보여준다. 쭉 읽으며 내려가면 세세한 사실이 조금씩 드러난다.

소스 파일도 신문 기사와 비슷하게 작성한다.

이름만 보고도 올바른 모듈을 살펴보고 있는지 아닌지를 판단 할 정도로 신경써서 짓는다.

소스 파일 첫 부분은 고차원 개념과 알고리즘을 설명한다.

아래로 내려갈수록 의도를 세세하게 묘사한다. 마지막에는 가장 저차원 함수와 세부 내역이 나온다.

개념은 빈 행으로 분리하라.

거의 모든 코드는 왼쪽에서 오른쪽으로, 위에서 아래로 읽힌다.

생각 사이는 빈 행을 넣어 분리해야 마땅하다.

public class Widget extends ParentWidget {
    private String name;
    private String description;
    public String getName() {
        return name;
    }
    public String getDescription() {
        return description;
    }
}

보다는

public class Widget extends ParentWidget {
    private String name;
    private String description;

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

이렇게 하는게 더 잘 읽힌다. 빈 행은 새로운 개념을 시작한다는 시각적 단서다.

세로 밀집도.

줄바꿈이 개념을 분리한다면 세로 밀집도는 연관성을 의미한다.

서로 밀접한 코드 행은 세로로 가까이 놓아야한다.

public class Widget extends ParentWidget {
    /**
     * 위젯 이름
     */
    private String name;

    /**
     * 위젯 설명
     */
    private String description;
    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }
}

이렇게 의미 없는 주석을 사용하여 밀집도를 떨어뜨려 놓게되면 코드를 한눈에 보기 어려워진다.

수직 거리.

1.변수는 사용하는 위치에 최대한 가깝이 선언한다. 아주 드물지만 다소 긴 함수에서 블록 상단이나 루프 직전에 변수를 선언하는 사례도 있다.

2.인스턴스 변수는 클래스 맨 처음에 선언한다. c++같은 경우는 클래스 마지막에 선언하지만 중요한건 잘 알려진 위치에 인스턴스 변수를 모은다는 사실이다.

3.한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다.

4.개념적인 친화도가 높을수록 코드를 가까이 배치한다.

세로 순서.

일반적으로 함수 호출 종속성은 아래 방향으로 유지한다.

호출되는 함수를 호출하는 함수보다 나중에 배치한다.

신문 기사와 마찬가지로 가장 중요한 개념을 가장 먼저 표현한다.

3. 가로 형식 맞추기.

프로그래머는 명백히 짧은 행을 선호한다.

그러므로 짧은 행이 바람직하다.

책에서는 120자 정도로 행 길이를 제한하도록 추천한다.

가로 공백과 밀집도

가로로는 공백을 사용해 밀접한 개념과 느슨한 개념을 표현한다.

int lineSize = line.lenth();

이렇게 할당 연산자를 강조하려고 앞뒤에 공백을 넣는다.

반면, 함수 이름과 이어지는 괄호 사이에는 공백을 넣지 않는다.

공백을 넣으면 한 개념이 아니라 별개로 보인다.

함수를 호출하는 괄호 안 인수는 공백으로 분리하여 인수가 별개라는 사실을 강조한다.

lineWidthHistogram.addLine(lineSize, lineCount);

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

return (-b - Math.sqrt(determinant)) / (2*a);

곱셈이 우선순위가 높기때문에 항 사이에는 공백이 들어간다.

가로 정렬

public class User {
    private String        user;
    private Address     address;
    private Gender         gender
    private University     university;
    private long        number;
}

이렇게 나란히 정렬을 하게된다면 코드가 엉뚱한 부분을 강조해 진짜 의도가 가려지게 된다.

독자는 변수 유형은 무시하고 변수 이름부터 읽게된다.

public class User {
    private String user;
    private Address address;
    private Gender gender
    private University university;
    private long number;
}

위와 같이 정렬을 하지 않게되면 중대한 결함을 찾기 쉽다는 장점이 있다.

할당 연산자 또한 마찬가지이다.

만약 선언부가 길다면 클래스를 쪼개야 한다는 의미이다.

들여쓰기.

  • 클래스 내 메서드는 클래스보다 한 수준 들여쓴다.

  • 메서드 코드는 메서드 선언부 보다 한 수준 들여쓴다.

  • 블록 코드는 블록을 포함하는 코드보다 한 수준 들여쓴다.

들여쓰기한 파일은 구조가 한눈에 들어온다.

때로는 간단한 if문 / while문, 짧은 함수에서 들여쓰기 규칙을 무시하고픈 유혹이 생긴다.

하지만 들여쓰기로 범위를 제대로 표현한 코드를 작성하도록 하자.

빈 while문이나 for문을 피치 못하게 사용할 경우 빈 블록을 올바르게 들여쓰고 괄호로 감싸도록 한다.

팀 규칙.

프로그래머라면 각자 선호하는 규칙이 있지만 팀에 속한다면 자신이 선호해야할 규칙은 팀 규칙이다.

좋은 소프트웨어 시스템은 읽기 쉬운 문서로 이뤄진다.

스타일은 일관적이고 매끄러워야 한다.

온갖 스타일을 뒤섞어 소스 코드를 필요 이상으로 복잡하게 만드는 실수는 반드시 피하도록 한다.

Last updated