CleanCode 5장 형식 맞추기

김희윤·2021년 3월 4일
0

cleancode

목록 보기
5/13

1.  형식을 맞추는 목적

당신이 만약 책을 읽는데 일정한 간격으로 들여쓰기가 되어있고, 문단 별 정리가 잘 되어있는 것이 잘 읽히는가? 아니면 무작위로 여기저기 쓰인 글이 잘 읽히는지를 생각해보면 쉽다!

  • 잘 읽혀야하는 이유는 기술의 발전은 빠르고, 오늘 구현한 기능이 다음 버전에서 바뀔 확률이 매우 높기 때문에 앞으로의 코드 품질에 지대한 영향을 끼치기 때문이다.

2.  적절한 행 길이를 유지해라

  • JUnit, FitNesse 는 평균 파일 크기가 65줄로 보통 40줄에서 100줄로 거의 모든 파일을 만들었다. 즉 길게 써야만 프로젝트를 만들 수 있는 것이 아니며, 오히려 작은 파일이 이해하기가 쉽다.

3.  신문기사처럼 작성해라

  • 독자들은 기사를 위에서 아래로 읽는다. 최상위에는 모든 내용을 포함하는 제목이 있고, 첫 문단은 전체 기사내용을 요약한다. 그 뒤 세세한 내용이 나온다.
  • 파일 이름은 간단하면서도 설명이 가능하게!
    -> 이름만 보고도 모듈을 알 수 있게
  • 소스파일 첫 부분은 고차원 개념과 알고리즘을 설명
  • 밑으로 내려갈수록 의도를 세세하게
  • 마지막에는 저차원 함수와 세부내역

4.  개념은 빈 행으로 구분해라

  • 위와 아래는 같은 코드지만 가독성은 전혀 다름을 보여준다. 줄바꿈으로 개념을 구분해라
// 잘못된 예
package fitnesse.wikitext.widgets;
import java.util.regex.*;
public class BoldWidget extends ParentWidget {
	public static final String REGEXP = "'''.+?'''";
    private static final Pattern pattern = Pattern.compile("'''(.+?)'''", PatternMULTILINE + PatternDOTALL);
    public BoldWidget(ParentWidget parent, String text) thows Exception {
    super(parent);
    Matcher match = pattern.matcher(text);
    match.find();
    addChildWidget(match.group(1));
    }
    public String render() throws Exception {
    StringBuffer html = new StringBuffer("</b>");
    return html.toString();
    }
}

// 잘된 예
package fitnesse.wikitext.widgets;

import java.util.regex.*;

public class BoldWidget extends ParentWidget {
    public static final String REGEXP = "'''.+?'''";
    private static final Pattern pattern = Pattern.compile("'''(.+?)'''", PatternMULTILINE + PatternDOTALL);
    
public BoldWidget(ParentWidget parent, String text) thows Exception {
    super(parent);
    Matcher match = pattern.matcher(text);
    match.find();
    addChildWidget(match.group(1));
}
    
public String render() throws Exception {
    StringBuffer html = new StringBuffer("</b>");
    return html.toString();
 }
}

5.  세로 밀집도

  • 서로 밀접한 코드는 세로로 가까이 놓아야 한다. 위보다 아래의 예시가 훨씬 보기 좋다
// 나쁜 예
public class ReporterConfig {
/**
* blar blar blar balr
*/
private String m_className;
}

// 좋은 예
blar blar blar balr
public class ReporterConfig {
private String m_className;
}

6.  수직거리

  • 서로 밀접한 개념은 세로로 가까이 둬야한다. 물론! 두 개념이 서로 다른 파일에 들어있다면 상관이 없다.
    -> 타당한 근거가 없다면 서로 밀접한 개념은 한 파일에 속해야한다.
    ( protected 변수를 피해야 하는 이유! )
  • 변수는 사용하는 위치에 최대한 가까이 선언
    -> 지역 변수는 함수 맨 처음에 선언
  • 루프를 제어하는 변수는 루프 문 내부에 선언
  • 인스턴스 변수는 클래스 맨 처음에 선언
    ( 변수간에 세로로 거리를 두지 않는다. )
  • 종속된 함수 끼리는 세로로 가까이 배치한다.
    -> 위의 신문기사 법칙처럼 호출하는 함수를 호출되는 함수보다 먼저 배치한다.
  • 개념적 유사성이 높을수록 가까이 배치한다.
    ( 명명법이 같거나, 기본 기능이 유사하거나, 서로 호출허가나 )

7. 가로 형식 맞추기

  • 파일의 크기가 작아야 되는 것처럼 행의 길이도 짧은 것이 바람직하다.
  • 가로의 공백과 밀집도의 차이를 둬서 밀접한 개념과 느슨한 개념을 표현한다.
// 잘못된 예
(2 * a) - (4 * a * c)

// 좋은 예
(2*a) - (4*a*c)
  • 표를 작성하는 것 같은 가로정렬은 필요 없다.
public class FitNesseExpediter implements ResponseSender 
{
	private Socket       socket;
    	private InputSteram  input;
    	private OutputStream output;
}

8. 가짜 범위

  • while 문이나 for 문의 세미콜론은 새 행에다 제대로 들여써서 넣어준다
while(dis.read(buf, 0, readBufferSize) != -1)
;
profile
블록체인, IOT, 클라우드에 관심이 많은 개발자 지망생

0개의 댓글

관련 채용 정보