필요하다면 규칙을 자동으로 적용하는 도구를 활용한다.
시간이 지남에 따라 코드가 바뀌더라도 개발자의 스타일과 규율은 남아있다. 그러므로 코드 형식은 중요하다.
큰 파일보다 작은 파일이 이해하기 쉽다. 500줄 미만, 평균 200줄로도 커다란 시스템을 구축할 수 있다.
처음: 고차원 개념과 알고리즘 설명
중간: 의도를 세세하게 묘사
마지막: 저차원 함수, 세부 내역
새로운 개념이 나올 때 빈 행을 삽입하라. 코드 가독성에 영향을 미친다.
ex.
패키지 선언부
(빈 행)
import문
(빈 행)
함수1
(빈 행)
함수2
서로 밀집한 코드 행은 세로로 가까이 놓여야 한다.
// 의미 없는 주석으로 변수를 떨어뜨려 놓아서 한눈에 파악이 잘 안된다.
public class ReporterConfig {
/**
* The class name of the reporter listener
*/
private String m_className;
/**
* The properties of the reporter listener
*/
private List<Property> m_properties = new ArrayList<Property>();
public void addProperty(Property property) {
m_properties.add(property);
}
}
// 의미 없는 주석을 제거함으로써 코드가 한눈에 들어온다.
// 변수 2개에 메소드가 1개인 클래스라는 사실이 드러난다.
public class ReporterConfig {
private String m_className;
private List<Property> m_properties = new ArrayList<Property>();
public void addProperty(Property property) {
m_properties.add(property);
}
}
서로 밀접한 개념은 세로로 가까이 둬야 한다.
-변수 선언
사용하는 위치에 최대한 가까이 선언한다.
지역 변수: 각 함수 맨 처음에 선언
루프를 제어하는 변수: 루프 문 내부에 선언
긴 함수일 경우: 블록 상단, 루프 직전에 선언
-인스턴스 변수
클래스 맨 처음에 선언
-종속 함수
한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 또 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치한다.
함수 () {
함수1();
함수2();
함수3();
}
함수1 () {}
함수2 () {}
함수3 () {}
-개념적 유사성
종속적인 관계가 없더라도 명명법이 똑같고 기본 기능이 유사한 함수라면 가까이 배치한다.
가장 중요한 개념을 가장 먼저 표현한다. 가장 중요한 개념을 표현할 때는 세세한 사항을 최대한 배제한다. 세세한 사항은 가장 마지막에 표현한다.
짧은 행이 바람직하다. 120자 정도로 행 길이를 제한한다.
공백을 줘야 하는 것: 할당 연산자(=), 함수 인수 사이((a, b) => {}), 덧셈(+), 뺄셈(-), 나눗셈(/)
공백을 주지 않아도 되는 것: 함수 이름과 괄호 사이(function app ()), 곱셈(*)
별로 유용하지 못하다. 엉뚱한 부분을 강조하게 된다.
public FitNessExpeditor(Sockets, FitNesseContext context) throws Exception
{
this.context = context;
socket = s;
input = s.getInputStream();
output = s.getOutputStream();
requestParsingTimeLimit = 10000;
}
들여쓰기한 파일은 구조가 한눈에 들어온다. 들여쓰기로 범위를 제대로 표현하라.
-들여쓰기 무시하기
하지 마라. 한 행에 범위를 뭉뚱그린 코드를 피하라.
-가짜 범위
빈 while문이나 for문을 쓰지 않는 것이 좋다. 만약 쓰게 된다면 세미콜론(;)을 새 행에 제대로 들여 써서 넣어준다.
while (dis.read(buf, 0, readBufferSize) != -1)
;
팀은 한 가지 규칙에 합의해야 한다. 그리고 모든 팀원은 그 규칙을 따라야 한다.