5장 형식 맞추기

형식을 맞추는 목적

돌아가는 코드를 만드는것도 개발자가 고려해야할 중요한 사항임은 맞다. 하지만 이번에 구현한 기능이 다음 버전에서 바뀔 확률은 높은 편이다. 유지보수, 수정, 고도화 등의 작업을 할때 단순히 돌아가기만 하는 코드 보단 가독성이 높은 코드가 높은 품질을 유지하기가 용이할것이다. 그렇기에 코드를 처음 작성할때 잡아놓은 스타일, 가독성은 후에 코드 수정 후에도 유지되어 코드품질 에 큰 영향을 미친다.

그렇다면 좋은 코드 스타일, 형식은 무엇일까?

신문기사 처럼 작성하라.

독자는 신문의 표제를 보고 읽을지 말지 결정한다. 첫 문단에서는 해당 기사의 내용을 요약하고 있어야 한다. 세세한 내용은 숨기고 큰 크림을 보여준다. 쭉 읽어서 내려가다보면 디테일한 내용들이 들어나는 형태이다. 코드 또한 마찬가지여야 한다. 코드 첫 부분은 고차원 개념을 적어내려가고 아래로 갈수록 저차원 개념을 적어내려가면서 좀 더 세세한 부분을 다뤄야한다.

개념은 빈 행으로 분리해라

// Option 1. 분리하지 않은 코드
pacakge fitnesse.wikitext,widgets;

import java.util.regex.*;

public class BoldWidget extends ParentWidget {
    public static final String RegEXP = "'''.+?'''";
    ...
}
public BoldWidget(ParentWidget parent, String text) throws Exception {
    super(parent);
    ...
}
public render( ) throws Exception {
    StringBuffer html = new StringBuffer("<b>");
    ...
}

// Option 2. 행으로 분리된 코드
pacakge fitnesse.wikitext,widgets;

import java.util.regex.*;

public class BoldWidget extends ParentWidget {
    public static final String RegEXP = "'''.+?'''";
    ...
}

public BoldWidget(ParentWidget parent, String text) throws Exception {
    super(parent);
    ...
}

public render( ) throws Exception {
    StringBuffer html = new StringBuffer("<b>");
    ...
}

하나의 개념은 줄바꿈으로 구분지어 가독성을 높이자.

세로 밀집도

줄 바꿈은 개념을 분리한다면 밀집도는 연광성을 의미한다. 서로 밀접하고 연성이 높은 코드는 밀집도를 높혀서 해당 부분을 표현해주자

// Option 1. 연관되어 있지만 세로 밀집도가 약한 코드
public class ReporterConfig {
    /**
    *  리포터 리스너의 클래스 이름
    */
    private String m_className;
    
    /**
    *  리포터 리스너의 속성 
    */
    private List<Property> m_properties = new ArrayList<Property>();
    ...
    
    
// Option 2. 연관되어 있는 세로 밀집도가 높은 코드
public class ReporterConfig {
    private String m_className;
    private List<Property> m_properties = new ArrayList<Property>();

수직거리

다른 개념이라도 연관성이 높다면 수직거리를 좁혀 연관성이 높음을 표현해야한다.

그렇다면 우리는 개념 하나를 이해하기 위해 이곳 저곳 돌아다닐 필요가 없어진다.

변수선언

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

인스턴스 변수

인스턴스 변수는 클래스 맨 처음에 선언한다. 변수간 세로로 거리두기 X

종속 함수

한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 또한 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치한다. 그러면 프로그램이 자연스럽게 읽힌다.

개념적 유사성

어떤 코드는 서로 끌어당긴다. 개념적인 친화도가 높기 때문이다. 친화도가 높을수록 코드를 가까이 배치한다. 앞서 보았듯이, 한 함수가 다른 함수를 호출해 생기는 직접적인 종속성이 한 예다. 변수와 그 변수를 사용하는 함수도 한 예다.

가로 형식 맞추기

한 행 가로의 길이는 짧은것이 명백하게 좋다. 하지만 100~120자 까지도 용인된다.

하지만 그 이상은 주의 부족이다.

팀 규칙

개발자 마다 각자의 규칙이 있다. 하지만 팀에 속해있다면 팀 규칙을 따르는것이 좋다.

그래야 하나의 애플리케이션이 공통된 형식으로 진행될수있다.

좋은 소프트웨어 시스템은 읽기 쉬운 문서로 이뤄진다는 사실을 기억하기 바란다.

스타일은 일관적이고 매끄러워야 한다. 한 소스 파일에서 봤던 형식이 다른 소스 파일에도 쓰이리라는 신뢰감을 독자에게 줘야 한다.

Last updated