프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야한다. 코드 형식을 맞추기 위한 간단한 규칙을 정하고, 그 규칙을 착실히 따라야한다. 팀으로 일한다면, 팀이 합의해 규칙을 정하고 모두가 그 규칙을 따라야한다.필요하면 규칙을 자동으로 적용하는 도구를 활용한다.
[ 적절한 행 길이를 유지해라 ]
큰 파일보다는 작은 파일이 이해하기 쉬우므로 적절한 행 길이를 유지해야 한다.
-신문기사 처럼 작성해야 한다.
신문을 읽을 때 최상단에 기사를 몇 마디로 요약하는 표제가 나온다. 마찬 가지로 이름은 간단하면서도 설명이 가능하게 지어야하고 아래로 내려갈수록 의도를 세세하게 묘사하여야한다.
-개념은 빈 행으로 분리해라.
일련의 행 묶음은 완결된 생각 하나를 표현한다. 생각 사이에는 빈 행을 넣어 분리해야 한다. 예를 들어 패키지 선언부, import 문, 각 함수 사이에 빈 행이 들어가야 한다.
빈 행은 새로운 개념을 시작한다는 시각적 단서다.
-세로 밀집도
줄 바꿈이 개념을 분리한다면 세로 밀집도는 연관성을 의미한다. 즉, 서로 밀접한 코드 행은 세로로 가까이 놓여야 한다는 뜻이다.
(ex) 변수 선언할 때 변수들을 밀접하게 위치해야 한다.)
-수직 거리
서로 연관성이 있는 개념은 세로로 가까이 둬야 한다는 뜻이다. 여기서 연관성이라는 뜻은 한 개념을 이해하는데 다른 개념이 중요한 정도를 말한다. 연관성이 깊은 두 개념이 멀리 떨어져 있으면, 코드를 읽는 사람이 소스파일과 클래스를 여기저기 뒤지게 된다.
1)변수선언
변수는 사용하는 위치에 최대한 가까이 선언한다. 지역변수는 각 함수 맨 처음에 선언한다.
2)인스턴스 변수
반면, 인스턴스 변수는 클래스 맨 처음에 삽입한다. 변수 간에 세로로 거리를 두지 않는다.
3)종속 함수
한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다. 또한 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치한다. 그러면 프로그램이 자연스럽게 읽힌다. (호출되는 함수를 찾기가 쉬워지며 그만큼 모듈 전체의 가독성도 높아진다. )
-개념적 유사성
개념적인 친화도가 높을수록 코드를 가까이 배치한다. 친화도가 높은 요인은 여러 가지다. 앞서 보았듯이, 한 함수가 다른 함수를 호출해 생기는 직접적인 종속성이 한 예다. 변수와 그 변수를 사용하는 함수도 한 예다. 하지만 그 외에도 친화도를 높이는 요인이 있다. 비슷한 동작을 수행하는 일군의 함수가 좋은 예다. 명명법이 똑같고 기본 기능이 유사하고 간단하다.
public class Assert {
static public void assertTrue(String message, boolean condition) {
if (!condition)
fail(message);
}
static public void assertTrue(bool condition) {
assertTrue(null, condition);
}
static public void assertFalse(String message, boolean condition) {
assertTrue(message, !condition);
}
static public void assertFalse(boolean condition) {
assertFalse(null, condition);
}
...
}
[ 가로 형식 맞추기 ]
한 행은 가로 길이가 어느정도가 적당할까? 마찬가지로 짧은 행이 바람직하다.
-들여쓰기 무시하기
public class CommentWidget extends TextWidget
{
public static final String REGEXP = "^#[%\r\n]*(?:(?:\r\n)|\n|\r)?";
public CommentWidget(ParentWidget parent, String text){super(parent, text);}
public String render() throws Exception {return "";}
}
위 코드 대신, 다음과 같이 들여쓰기로 범위를 제대로 표현한 코드가 좋다.
public class CommentWidget extends TextWidget {
public static final String REGEXP = "^#[%\r\n]*(?:(?:\r\n)|\n|\r)?";
public CommentWidget(ParentWidget parent, String text) {
super(parent, text);
}
public String render() throws Exception {
return "";
}
}
'Reading Book > Clean Code' 카테고리의 다른 글
[Clean Code]클린코드_7_오류 처리 (0) | 2021.08.17 |
---|---|
[Clean Code]클린코드_6_객체와 자료 구조 (0) | 2021.08.17 |
[Clean Code]클린코드_4_주석 (0) | 2021.08.16 |
[Clean Code]클린코드_3_함수 (0) | 2021.08.16 |
[Clean Code]클린코드_2_의미있는 이름 (0) | 2021.08.16 |