클린 코드 - 5. 형식 맞추기

이정우·2021년 9월 10일
0

Clean Code

목록 보기
5/10

프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다. 코드 형식을 맞추기 위한 규칙을 정하고 그 규칙에 따라야 한다.

형식을 맞추는 목적

코드 형식은 중요하다. 중요하기 때문에 맹목적으로만 따르면 안 된다. 코드 형식은 의사소통의 일환이며 개발자의 의무이다.

오늘 구현한 기능은 다음 버전에서 바뀔 확률이 아주 높은데, 지금의 코드는 앞으로 바뀔 코드의 품질에 큰 영향을 미친다. 오랜 시간이 지나 처음의 코드의 흔적을 찾기 어렵더라도 맨 처음의 구현 스타일과 가독성은 여전히 남아있다.


적절한 행 길이를 유지하라

코드의 길이는 천차만별이다. 열 줄이 안 되는 코드도 있으며, 수천 줄의 코드도 존재한다. 하지만, 코드가 짧다고 해서 시스템을 구축할 수 없는 것은 아니다. 적절한 길이를 유지하는 것은 반드시 지켜야할 규칙은 아니지만, 바람직하게 여기면 좋다.

신문 기사처럼 작성하라

신문 기사는 최상단에 기사를 요약하는 표제가 나오며, 첫 문단은 전체 기사 내용을 요약한다. 세세한 사실은 숨기고 큰 그림을 보여주며, 읽으면서 내려가면 세세한 사실이 나온다.

소스 파일도 신문 기사와 비슷하게 작성해야 한다. 이름은 간단하면서도 이름만 보더라도 올바른 파일을 보고 있는지 판단할 수 있도록 신경써서 지어야 한다. 파일의 첫 부분은 고차원의 개념과 알고리즘을 설명하고, 아래로 내려갈수록 의도를 세세하게 묘사한다.

개념은 빈 행으로 분리하라

코드의 각 행은 수식이나 절을 나타내고, 행의 묶음은 생각 하나를 표현한다. 이러한 생각 사이에는 빈 행을 통해 분리를 해야한다.

패키지 선언부, import 문, 각 함수 사이에 빈 행 하나만 넣더라도 가독성이 크게 증가한다.

세로 밀집도

세로 밀집도는 연관성을 의미한다. 서로 밀접한 코드 행들은 세로로 가까이 놓아야 한다.

수직 거리

함수 간의 관계와 동작 방식을 이해하기 위해 여러 파일과, 여러 함수를 뒤진 경험이 있을 것이다. 이는 연관성이 높은 코드가 서로 멀리 떨어져 있기 때문이다. 연관성이란 한 개념을 이해하는 데 다른 개념이 중요한 정도로, 세로 거리로 연관성을 표현할 수 있다.

  • 변수 선언 : 변수는 사용하는 위치에 최대한 가까이 선언한다. 짧은 함수에서는 지역 변수를 함수의 처음에 선언해도 되며, 루프를 제어하는 변수는 루프 문 내부에 선언한다. 긴 함수의 경우에는 사용 직전에 변수를 선언한다.

  • 인스턴스 변수 : 인스턴스 변수는 클래스의 맨 처음에 선언한다. 변수 간에 세로로 거리를 두지 않는다.

  • 종속 함수 : 한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 또한, 호출하는 함수를 호출되는 함수보다 먼저 배치한다. 이를 통해 호출되는 함수를 찾기가 쉬워지며, 모듈 전체의 가독성도 높아진다.

  • 개념적 유사성 : 친화도가 높은 코드를 가까이 배치한다. 친화도가 높은 경우는, 한 함수가 다른 함수를 호출하거나, 비슷한 동작을 수행하는 등 기본 기능이 유사한 경우이다.

세로 순서

일반적으로 함수 호출 종속성은 아래 방향으로 유지한다. 호출되는 함수를 호출하는 함수보다 나중에 배치하는 것이다. 신문 기사와 마찬가지로 가장 중요한 개념을 가장 먼저 표현하고, 가장 중요한 개념을 표현할 때는 세세한 사항을 배제하여 가장 마지막에만 표현한다.


가로 형식 맞추기

대부분의 프로젝트에서 코드의 길이는 20자에서 60자 사이이다. 80자 이후로는 급격하게 감소하는 경향이 있다.

가로 공백과 밀집도

int lineSize = line.length();
totalChars += lineSize;
lineWidthHistogram.addLine(lineSize, lineCount);
recordWidestLine(lineSize);

할당을 하는 부분에는 공백을 두어 요소를 구분하며 가독성을 높이고, 함수를 호출하는 괄호에서는 공백을 넣지 않는다. 또한, 함수 호출 시 각 인자 사이에는 공백을 두어 각 인자를 구분한다.

연산자의 우선 순위를 강조하기 위해서도 공백을 넣는 경우도 있다.

가로 정렬

public class FruitBox {
    private int              boxSize;
    private String           boxName;
    private ArrayList<Fruit> fruits;
}

위와 같이 구조를 강조하고자 가로 정렬을 하는 경우가 있다. 하지만, 이런 경우에는 각 변수의 데이터 형식보다는 변수의 이름만 눈에 잘 들어오기 때문에 강조하고자 하는 의도가 가려질 수 있다.

들여쓰기

들여쓰기는 범위로 이뤄진 계층을 표현하기 위해 사용된다. 파일 수준인 문장은 들여쓰지 않으며, 클래스 내 메서드는 클래스보다 한 수준을 들여쓰며 메서드 코드는 메서드 선언보다 한 수준 들여쓴다. 각각의 블록 코드는 블록을 포함하는 코드보다 한 수준 들여쓴다.

가짜 범위

비어있는 while문이나 for문이 있을 때가 있다. while문 끝에 ; 하나를 붙인 코드로 인해 코드를 이해하는 것이 크게 어려워질 수 있다. 이럴 때는 새 행에다 ;을 적어준다.


팀 규칙

팀에 속한다면 팀 규칙을 지켜야 한다. 어디에 괄호를 넣을지, 들여쓰기를 몇 자를 할지, 클래스와 변수/메소드 이름을 어떻게 지을 지 등을 결정하고 코드를 구현해야 한다.

좋은 시스템은 읽기 쉬운 문서로 이루어진다. 스타일은 일관적이고 매끄러워야 한다. 한 소스 파일에서 봤던 형식이 다른 파일에도 쓰일 것이라는 신뢰감을 줘야 한다.

0개의 댓글