클린코드와 리팩토링/클린코드

클린코드 - 형식 맞추기

infitry 2024. 3. 30. 10:31
반응형

본 글은 클린코드 5장을 읽고 난 후 주관적인 생각입니다.

"은 탄환은 없다"라는 말처럼 항상 상황에 맞춰 생각을 한 번 더 하는 습관이 중요한 것 같습니다.

 

형식을 맞추는 목적

오랜 시간이 지나도 맨 처음 잡아놓은 구현 스타일과 가독성 수준은 유지보수 용이성과 확장성에 계속해서 영향을 미칩니다.

때문에 너무 엄격하지 않은 어느정도 스타일과 규율은 필요하다고 생각합니다.

 

적절한 행 길이를 유지하라

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

개인적인 생각으로는 파일의 길이가 길어지는 건 하나의 클래스가 너무 많은 일을 하고 있을 때 그렇다고 생각합니다.

예를 들어 주문이라는 큰 상위개념이 있고 하위개념으로는 옵션, 가격, 주문상품 등이 있다고 했을 때 

주문이라는 큰 개념으로 클래스를 만들어 해당 클래스에서 하위개념에서 할 수 있는 모든 책임을 처리하려 할 때

파일이 길어지는 경우를 종종 본 것 같습니다.

행 길이가 몇 만자가 넘어가면 IDE에서도 버벅거리는 현상도 발생하고, 가독성, 유지보수성이 너무 떨어지는 것 같습니다.

 

개념은 빈 행으로 분리하라

각 행은 수식이나 절을 나타내고, 일련의 행 묶음은 완결된 생각 하나를 표현합니다.

각 완결된 생각 하나를 구분지으면 좀 더 읽기 편해지는 것 같습니다.

예시로 다음과 같은 코드는 읽기 어렵지 않습니다.

public class BoldWidget {
	public static final String A = "A";
    public BoldWidget(ParentWidget parent, String text) throws Exception {
    	super(parent);
        Matcher match = pattern.matcher(text);
        match.find();
     	...
    }
    
    public render() throws Exception {
    	StringBuffer html = new StringBuffer("<b>");
        html.append(childHtml()).append("</b>");
        return html.toString();
    }
}

 

하지만 빈 행을 사용하지 않는다면 다음과 같이 읽기 어려워집니다.

public class BoldWidget {
	public static final String A = "A";
    public BoldWidget(ParentWidget parent, String text) throws Exception {
    	super(parent);
        Matcher match = pattern.matcher(text);
        match.find(); ...}
    public render() throws Exception {
    	StringBuffer html = new StringBuffer("<b>");
        html.append(childHtml()).append("</b>");
        return html.toString();
    }
}

 

세로 밀집도

서로 밀집도는 연관성을 의미합니다.

서로 밀집한 코드 행은 세로로 가까이 놓여야 한다는 뜻입니다.

 

수직 거리

- 변수 선언

변수는 최대한 가까이 선언합니다. 사용하기 전에 선언하는 것이 좋습니다.

다만 인스턴스 변수는 클래스 맨 처음에 선언하는 것이 좋습니다.

 

- 종속함수

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

 

- 개념적 유사성

간단하게 말하면 비슷한(친화도가 높은) 함수끼리 모아놓거나, 종속되는 함수는 서로 가까이 배치해 놓는 게 좋습니다.

 

가로형식 맞추기

한 행의 가로는 각 팀원의 모니터 크기나 글꼴마다 다르겠지만 모든 팀원이 스크롤이 생기지 않도록 적절하게 선택하는 게 좋은 것 같습니다.

 

가로정렬

개인적으로는 정말 필요하지 않다고 생각합니다.

public Align() {
	private String name;
    private String alignStyle;
    private Object object;
    
    public Align(String name, Style style, Object target) {
        this.name =			name;
        this.alginStyle =		style;
        this.object =			target;
    }
}

 

코드가 엉뚱한 부분을 강조해 진짜 의도가 가려집니다.

 

들여 쓰기

정말 중요하다고 생각합니다.

들여 쓰기의 유무에 따라 가독성은 천차만별이라고 생각합니다.

정말 간단한 if, for 문 같은 경우라도 들여 쓰기를 하는 것이 좋다고 생각합니다. 

 

팀 규칙

프로그래머라면 각자 선호하는 규칙이 있으나 팀에 속한다면 팀 규칙을 따라야 한다고 생각합니다.

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

동일한 스타일의 소스 파일들로 이뤄진다면 좀 더 읽기 좋은 코드가 될 것 같습니다.

반응형