책 리뷰/클린코드

5장 : 형식 맞추기

Lahezy 2023. 6. 28.
728x90

5장 : 형식 맞추기

🙂 프로그래머라면 형식을 깔금하게 맞춰 코드를 짜야한다. 코드 형식을 맞추기 위한 간단한 규칙을 정하고 그 규칙을 착실히 따라야 한다. 팀으로 일한다면 팀이 합의해 규칙을 정하고 모두가 그 규칙을 따라야 한다.

형식을 맞추는 목적

오늘 구현한 기능이 다른 누군가에 의해 수정될 확률을 아주 높습니다. 또한 많은 수정이 있어도 맨 처음 잡아둔 코드 스타일과 가독성 수준은 유지보수의 용이성과 확장성에 계속해서 영향을 미칩니다. 즉 원래 코드 스타일을 사라져도 개발자의 규칙과 스타일은 사라지지 않습니다. 이렇기에 초반 원활한 소통을 위해서 코드 형식을 정해두고 시작해야 합니다.

추천하는 코드 형식

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

반드시 지킬 규칙을 아니지만 바람직한 규칙으로 삼았으면 좋겠다.

대게 큰 파일보다 작은 파일이 이해하기 쉽다.

(200~500줄)

 

신문 기사처럼 작성하라.

독자는 표제를 보고서 기사를 읽을지 말지 결정한다. 첫 문단은 전체 기사 내용을 요약한다. 세세한 사실은 숨기고 커다란 그림을 보여준다. 소스파일도 비슷하다. 이름은 간단하면서도 설명이 가능하게 짓는다. 이름만 보고도 올바른 모듈을 살펴보고 있는지 아닌지를 판단할 정도로 신경 써서 짓는다.

 

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

각 행은 완결된 하나의 생각을 표현한 것과 같다 마찬가지로 코드에도 빈행을 사용하여 코드의 가독성을 높이는 것이 중요하다

 

세로 밀집도.

위에서의 줄 바꿈이 개념을 분리한다면 세로 밀집도는 연관성을 의미한다. 즉 서로 밀집한 코드 행은 세로로 가깝게 두어야 한다. 예를 들어 아래와 같다. 아래에서는 주석을 달아 코드를 한눈에 보기 힘들게 만들었다.

public class UserService {
        // 유저와 관련된 서비스 로직을 진행한다.
        // 유저 리파짓 토리
    private UserRepository userRepository;
    private EmailService emailService;

        // 유저를 저장한다. 
        // 유저에게 회원가입 축하 이메일을 보낸다.
    public void registerUser(User user) {
        userRepository.save(user);
        emailService.sendWelcomeEmail(user.getEmail());
    }

}

아래 예시는 한눈에 두 개의 변수와 한 개의 메서드를 가진 클래스라는 사실이 눈에 들어온다.

public class UserService {
    private UserRepository userRepository;
    private EmailService emailService;

    public void registerUser(User user) {
        userRepository.save(user);
        emailService.sendWelcomeEmail(user.getEmail());
    }

}

 

수직거리.

시스템이 무엇을 하는지 이해하고 싶은데 각 코드에 대해서 파악하기 위해 위아래로 움직이느라 시간을 소요해 본 경험이 있을 것이다. 때문에 한 클래스 내의 서로 밀접한 개념을 세로로 가까이 두어야 한다.

 

변수선언.

변수는 사용하는 위치에 가까이 선언한다.

예를 들어 루프를 제어하는 변수는 흔히 루프문 내부에 선언한다.

 

인스턴스 변수.

하지만 인스턴스 변수는 클래스 맨 처음에 선언한다. 변수 간에 세로로 거리를 두지 않는다. 잘 설계한 클래스는 대다수의 메서드에서 인스턴스 변수를 사용한다. 자바에서는 인스턴스 변수를 맨 처음에 선언한다. c, c++은 가위 규칙을 적용하여 클래스의 마지막에 인스턴스 변수를 선언하는데 반드시 처음에 선언해야 하는 것이 아닌 변수 선언을 어디서 찾을지 모두가 알고 있어야 한다는 것이다.

 

종속함수.

한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 또한 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치한다.

public class Calculator {
    public int calculate(int a, int b) {
        int sum = add(아는

 

개념적 유사성.

친화도가 높은 코드들을 가까이 배치한다.

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

종속적인 관계가 없더라고 가까이 배치할 함수들이다.

위는 AssertJ의 코드 예시이다 유사한 메서드는 같이 배치한 것을 확인할 수 있다.

 

세로순서.

일반적으로 함수 호출 종속성을 아래방향으로 유지한다. 다시 말해 호출되는 함수를 호출함수보다 나중에 배치한다. 중요한 개념을 가장 먼저 표현한다. 세세한 사항은 마지막에 표기한다.

 

가로 형식 맞추기

한 줄은 100~120자 정도로 제한하는 것이 좋다 (구글 개발 표준)

[구글코딩컨벤션]https://github.com/google/styleguide

https://lahezy.tistory.com/116

 

인텔리제이 코딩 컨벤션 적용(구글 코딩 컨벤션)

인텔리제이 코드 스타일 설정 mac 기준 인텔리제이 내에서 세팅-> 코드 스타일에서 한 줄의 가로길이와 같은 세팅을 설정할 수 있다. 구글 자바 코딩 스타일 [구글 자바 스타일 가이드]https://google.

lahezy.tistory.com

인텔리제이 내에서 세팅-> 코드 스타일에서 한 줄의 가로길이와 같은 세팅을 설정할 수 있다.

 

 

가로 공백과 밀집도

가로로는 공백을 사용해 밀접한 개념과 느슨한 개념을 표현한다. 예로는 연산자 강조를 위해 연산자 앞뒤에 공백을 넣는 경우가 있다. 이는 연산자의 우선수위를 강조하기 위해 사용하기도 한다. 하지만 대부분의 IDE에서 코드 형식을 자동을 맞춰주는 기능으로 인해 가로 공백이 제거되는 경우가 많다.

 

들여 쓰기

소스파일은 윤곽도와 계층이 비슷하다.

범위로 이루어진 계층을 표현하기 위해 코드를 들여 쓴다. 코드를 들여 쓰지 않으면 가독성이 떨어진다.

들여 쓰기를 하여 구조가 한눈에 들어오도록 한다.

 

들여쓰기 무시하지 않기

간혹 한 줄로 끝나는 if문의 경우 들여 쓰기를 하지 않는 경우가 있다. 이런 경우 클린코드의 저자 같은 경우 다시 돌아가 들여쓰기를 넣는 다고 한다. 저자는 한 행에 범위를 뭉뚱그린 코드를 피한다.

들여쓰기를 통해 범위를 제대로 표현하자.

 

가짜 규칙

때로는 빈 while문, for문이 있는 경우가 있다. 피하지 못한 경우는 빈 블록을 올바로 들여 쓰고 괄호로 잘 감싼다 세미콜론을 붙어서 코드가 돌아가지 계속해서 돌아가는 경험을 해본 적이 있다면 ; 을 while 문 한 줄 뒤에 작성하여 명확하게 코드를 눈에 띄게 만들자.

whiel(!q.isEmpty())
;

 

팀 규칙

팀 규칙이라는 말은 말장난이다.

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

팀은 한 가지 규칙에 합의하고 팀원은 그 규칙을 따라야 한다. 그렇게 해야만 소프트웨어가 일관적인 스타일을 보이다. 개개인이 따로국밥처럼 맘대로 짜대는 코드는 피해야 한다.

  1. 괄호를 어떻게 쓸지
  2. 들여 쓰기는 몇 자로 할지
  3. 클래스와 메서드 네이밍은 어떻게 할지

코드 편집기내의 코드 포매터를 지정하여 사용하면 된다.

좋은 소프트웨어 시스템은 읽기 쉬운 문서로 이루어진다는 사실을 기억하길 바란다. 스타일은 일관적이고 매끄러워야 한다. 한 소스 파일에서 봤던 형식이 다른 소스 파일에도 쓰이리라는 신뢰감을 독자에게 주어야 한다. 온갖 스타일을 뒤섞어 소스 코드를 필요 이상으로 복잡하게 만드는 실수는 반드시 피한다.

코드 자체가 최고의 구현 표준 문서가 되도록 하자

 

728x90

'책 리뷰 > 클린코드' 카테고리의 다른 글

7장 오류처리  (0) 2023.10.14
6장 객체와 자료 구조  (0) 2023.07.25
클린코드 4장 : 주석  (0) 2023.06.21
3장 함수  (0) 2023.06.05
Clean Code(1,2 장)  (0) 2023.05.04

댓글