nyximos.log

[Clean Code] 5장, 형식 맞추기 본문

Books

[Clean Code] 5장, 형식 맞추기

nyximos 2022. 2. 18. 20:12

 

클린코드,  애자일 소프트웨어 장인정신

Robert C. Martin

 

 

들어가며

  • 프로그래머라면 형식을 깔끔하게 맞춰 코드를 짜야 한다.
  • 코드 형식을 맞추기 위한 간단한 규칙을 정하고 그 규칙을 착실히 따라야 한다.


형식을 맞추는 목적

  • 코드 형식은 중요하다!
  • 코드 형식은 의사소통의 일환이다. 의사소통은 전문 개발자의 일차적인 의무다.
  • 오늘 구현한 코드의 가독성은 앞으로 바뀔 코드의 품질에 지대한 영향을 미친다.
  • 맨 처음 잡아놓은 구현 스타일과 가독성 수준 → 유지보수 용이성, 확장성에 영향
  • 원래  코드는 사라질지라도 개발자의 스타일과 규율은 사라지지 않는다.

 

적절한 행 길이를 유지하라

  • 대다수 자바 소스 파일은 크기가 어느 정도일까?
  • 500줄을 넘지않고 대부분 200줄 정도인 파일로도 커다란 시스템을 구축할 수 있다.
  • 일반적으로 큰 파일보다 작은 파일이 이해하기 쉽다.

 

신문기사처럼 작성하라

  • 소스 파일 이름간단하면서도 설명이 가능하게 짓는다.
  • 이름만 보고도 올바른 모듈을 살펴보고 있는지 아닌지를 판단할 정도로 신경 써서 짓는다.
  • 소스 파일 첫 부분고차원 개념알고리즘을 설명한다.
  • 아래로 내려갈수록 의도를 세세하게 묘사한다.
  • 마지막에는 가장 저차원 함수와 세부 내역이 나온다.

 

개념은 빈 행으로 분리하라

  • 일련의 행 묶음완결된 생각 하나를 표현한다.
  • 생각 사이는 빈행을 넣어 분리해야 마땅하다.
  • 빈행은 새로운 개념을 시작한다는 시각적 단서다.

 

세로 밀집도

  • 줄바꿈개념을 분리한다면 세로 밀집도연관성을 의미한다.
  • 서로 밀접한 코드 행은 세로로 가까이 놓여야 한다.

 

수직 거리

  • 타당한 근거가 없다면 서로 밀접한 개념은 한 파일에 속해야 마땅하다.
  • 같은 파일에 속할 정도로 밀접한 두 개념은 세로 거리연관성을 표현한다.
  • 연관성 - 한 개념을 이해하는데 다른 개념이 중요한 정도

 

변수 선언

  • 변수는 사용하는 위치에 최대한 가까이 선언한다.
  • 우리가 만든 함수는 매우 짧으므로 지역 변수각 함수 맨 처음에 선언한다.

 

인스턴스 변수

  • 인스턴스 변수클래스 맨 처음에 선언한다.
  • 변수 간에 세로로 거리를 두지 않는다.
  • 잘 설계한 클래스는 많은 클래스 메서드가 인스턴스 변수를 사용하기 때문이다.

 

종속 함수

  • 한 함수가 다른 함수를 호출한다면 두 함수는 세로로 가까이 배치한다.
  • 또한 가능하다면 호출하는 함수를 호출되는 함수보다 먼저 배치한다.
  • 호출되는 함수를 찾기가 쉬워지며, 그만큼 모듈 전체의 가독성도 높아진다.

 

개념적 유사성

  • 친화도가 높을수록 가까이 배치한다.

친화도가 높은 예

  • 한 함수가 다른 함수를 호출해 생기는 직접적인 종속성
  • 변수와 그 변수를 사용하는 함수
  • 비슷한 동작을 수행하는 함수

 

세로 순서

  • 일반적으로 함수 호출 종속성아래 방향으로 유지한다.
  • 호출되는 함수를 호출하는 함수보다 나중에 배치한다. → 소스 코드 모듈이 고차원에서 저차원으로 자연스럽게 내려간다.
  • 세세한 사항은 가장 마지막에 표현한다.
    → 독자가 소스 파일에서 첫 함수 몇개만 읽어도 개념을 파악하기 쉬워진다.

 

가로형식 맞추기

  • 프로그래머는 명백하게 짧은 행을 선호한다. → 짧은 행이 바람직하다.
  • 100자나 120자에 달해도 나쁘지 않다. 하지만 그 이상은 솔직히 주의부족이다.

 

가로 공백과 밀집도

  • 가로로는 공백을 사용해 밀접한 개념과 느슨한 개념을 표현한다.
  • 할당문 연산자 앞뒤 공백 🙆‍♀️ → 공백을 넣으면 두 가지 주요 요소가 확실히 나뉜다는 사실이 더욱 분명해진다.
  • 함수 이름 & 이어지는 괄호 사이 공백 🙅‍♀️ → 함수와 인수는 서로 밀접하기 때문
  • 함수를 호출하는 코드에서 괄호 안 인수들간 공백 🙆‍♀️ → 쉼표를 강조, 인수가 별개라는 사실 보여줌
  • 연산자 우선순위 강조위해 공백 사용

 

가로 정렬

  • 정렬시 코드가 엉뚱한 부분을 강조해 진짜 의도가 가려진다.
  • 선언문과 할당문을 별도로 정렬하지 않는다.
  • 정렬하지 않으면 오히려 중대한 결함을 찾기 쉽다.

 

들여쓰기

  • 범위로 이뤄진 계층을 표현하기 위해 우리는 코드를 들여쓴다.
  • 클래스 정의처럼 파일 수준인 문장은 들여쓰지 않는다.
  • 클래스 내 메서드는 클래스보다 한 수준 들여쓴다.
  • 메서드 코드는 메서드 선언보다 한 수준 들여쓴다.
  • 블록 코드는 블록을 포함하는 코드보다 한 수준 들여쓴다.

 

  • 왼쪽으로 코드를 맞춰 코드가 속하는 범위를 시각적으로 표현한다.
  • 이 범위에서 저 범위로 빨리 이동하기 쉬워진다.
  • 들여쓰기한 파일은 구조가 한눈에 들어온다.

 

들여쓰기 무시하기

  • 한 행에 범위를 뭉뚱그린 코드를 피한다.
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 "";
    }
}

 

가짜 범위

  • 빈 while문이나 for문은 빈 블록을 올바로 들여쓰고 괄호로 감싼다.
  • 세미콜론은 새 행에다 제대로 들여써서 넣어준다.

 

팀 규칙

  • 팀은 한 가지 규칙에 합의해야 한다. 그리고 모든 팀원은 그 규칙을 따라야 한다. 그래야 소프트웨어가 일관적인 스타일을 보인다.
  • 어디에 괄호를 넣을지, 들여쓰기는 몇 자로 할지, 클래스와 변수와 메서드 이름은 어떻게 지을지
  • 스타일은 일관적이고 매끄러워야 한다.
  • 한 소스 파일에서 봤던 형식이 다른 소스 파일에도 쓰이리라는 신뢰감을 독자에게 줘야 한다.

'Books' 카테고리의 다른 글

[Clean Code] 7장, 오류 처리  (0) 2022.02.24
[Clean Code] 6장, 객체와 자료 구조  (0) 2022.02.22
[Clean Code] 4장, 주석  (0) 2022.02.16
[Clean Code] 3장, 함수  (0) 2022.02.12
[Clean Code] 2장, 의미 있는 이름  (0) 2022.02.11