본문 바로가기
Architecture

[Clean Code 정리] 형식 맞추기

by 테리는당근을좋아해 2022. 5. 29.

Clean Code - 형식 맞추기

 

1. 개요

1) 형식 맞추기

- 질서정연하고 깔끔하며, 일관적인 코드를 본다면 사람들에게 전문가가 짰다는 인상을 준다.

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

- 코드 형식을 맞추기 위한 간단한 규칙을 정하고, 팀으로 일한다면 팀이 합의한 규칙을 정해 모두가 그 규칙을 지켜야 한다.

 

 

2) 형식을 맞추는 목적

- 코드 형식은 의사 소통의 일환이며, 의사소통은 개발자의 일차적인 의무이다.

- 오늘 구현한 코드의 스타일과 가독성 수준은 유지보수의 용이성과 확장성에 지속적인 영향을 미친다.

- 코드는 사라져도 스타일과 규율을 사라지지 않는다.

 

 

 

2. 형식을 맞추는 방법

1) 적절한 행 길이 유지

- 소스 코드의 길이는 500줄을 넘지 않고 대부분 200줄 정도가 좋다.

- 신문 기사처럼 작성하라.

    a. 최상단에 표제 -> 소스파일 이름

    b. 첫 문단에는 전체 기사 내용의 요약 -> 소스 파일의 첫 부분(고차원 개념, 알고리즘의 설명)

    c. 기사를 읽으며 내려갈수록 세부사항 -> 저차원 함수

- 개념은 빈 행으로 구분하라.

 

 

2) 세로 밀집도

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

- 서로 밀집한 코드 행을 세로로 가까이 놓아야 한다.

 

 

3) 수직 거리

- 서로 밀집한 개념은 가까이 둬야 한다.

- 서로 밀집한 개념은 한 파일에 속해야 마땅하다. (*protected 변수를 피해야하는 이유)

- 같은 파일에 속할 정도로 밀접한 두 개념은 세로 거리로 연관성을 표현한다.

- 연관성이 깊은 두 개념이 멀리 떨어져 있으면 코드를 읽기 어렵다.

 

*protected 접근 제어자

- protected 피해야한다고 기술되었지만, template 패턴과 같은 하위 클래스에서 구현해야할 경우 해당 접근자를 사용

 

 

4) 변수 선언

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

 

public int countProducedWafer() {
	int count = 0;
    for (Equipment equipment : equipments)
    	count += equipment.getProducedWaferCount();
    return count;
}

- 루프 제어 변수는 루프문 내부에 선언

 

def count_produced_wafer():
    return sum([equipment.get_produced_wafer_count() for equipment in equipments])

- 파이썬 예제를 작성하다 보니 데이터 타입을 선언하는 부분도 없고, list comprehension을 주로 사용하기 때문에 루프문 안에 변수를 선언하게 된다.

 

for equipment in factory.get_equipment_list():
    wafers = equipment.get_produced_wafers("2020-05-10", "2020-05-15")
    produeced_wafers = filter_invalid_wafers(wafers)

    for wafer in produeced_wafers:
        wafer.tune_wafer_info()

    for wafer in produeced_wafers:
        wafer.analysis_loss()

- 긴 함수에서는 블록 상단 또는 루프 직전에 변수를 선언할 수도 있다.

 

 

5) 인스턴스 변수

- 변수 간 세로로 거리를 두지 않는다.

- 잘 설계한 클래스는 대다수 클래스 메서드가 인스턴스 변수를 사용한다.

- 잘 알려진 위치(자바의 경우 클래스 상단)에 인스턴스 변수를 모으는 것이 중요하다.

 

 

6) 종속 함수

- 한 함수가 다른 함수를 호출한다면 종속함수이다.

- 종속 함수는 세로로 가까이 배치한다.

- 종속 함수를 뒤쪽에 배치하면 가독성이 높아진다.(고차원 -> 저차원)

class Lot():
    ...
    def set_lot_overhead(self):
        previous_lot = self.__get_previous_lot()
        lot_overhead = self.__start_time - previous_lot.get_end_time()
    
    def __get_previous_lot(self):
        ...

    def get__end_time(self):
        ...

 

 

7) 개념의 유사성

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

- 종속 함수, 변수, 그 변수를 사용하는 함수가 예이다.

- 그 외에도 비슷한 동작을 수행하는 함수 또한 친화도가 높다고 말할 수 있다.

 

 

8) 가로 형식 맞추기

(1) 가로 공백과 밀집도

- 할당 연산자 좌우로 공백을 주어 왼쪽, 오른쪽 요소를 확실히 구별한다.

- 함수 이름과 괄호 사이에는 공백을 없앰으로써 함수와 인수의 밀접함을 보여준다.

- 함수 괄호 안의 인수끼리는 쉼표 사이 공백을 통해 별개라는 사실을 보여준다.

 

 

9) 들여쓰기

- 들여쓰기를 잘 해놓으면 구조가 한 눈에 들어오고 가독성이 높아진다.

- 파이썬을 경우 들여쓰기로 블록을 구별해서 당연한 얘기처럼 들릴 수 있지만, PEP8 규정에 따라 한 라인에 79자를 넘지 않는 수준에서 개발하다보면 하나의 코드 줄에 개행이 발생할 수 있는데 적절한 들여쓰기로 하나의 라인임을 보여줄 수 있도록 한다.

 

 

10) 가짜 범위

- 빈 while문이나 for문은 가능한 피하는 것이 좋다.

- 사용하게 될 경우 빈 블록을 올바로 들여쓰고 괄호로 감싼다.

 

 

'Architecture' 카테고리의 다른 글

[Clean Code 정리] 오류 처리  (0) 2022.05.29
[Clean Code 정리] 객체와 자료구조  (0) 2022.05.29
[Clean Code 정리] 주석  (0) 2022.05.28
[Clean Code 정리] 함수  (0) 2022.05.28
[Clean Code 정리] 의미있는 이름  (0) 2022.05.28

댓글