솜이의 데브로그

1-3장 ) 깨끗한 코드, 의미 있는 이름, 함수 본문

책을 읽자/Clean Code

1-3장 ) 깨끗한 코드, 의미 있는 이름, 함수

somsoming 2022. 3. 27. 17:10

http://www.yes24.com/Product/Goods/11681152

 

Clean Code 클린 코드 - YES24

애자일 소프트웨어의 혁명적인 패러다임을 제시하는 책이다. 저자 로버트 마틴은 오브젝트 멘토(Object Mentor)의 동료들과 힘을 모아 ‘개발하며’ 클린 코드를 만드는 최상의 애자일 기법을 정제

www.yes24.com

 

 

책을 들어가기에 앞서, 내가 인상깊게 읽었던 부분은 이부분이다.

 

프로그램을 짜다 보면, 코드를 쓰는 시간보다 코드를 읽는 시간이 훨씬 더 많다

 

실제로 코드를 짜는것보다는, 타인이 만든 코드를 읽고 리뷰하고 유지보수를 하는 시간이 더 긴 경우가 많다.

그러므로 '클린코드'가 무엇인지, 보다 좋은 코드가 무엇인지 고민해보아야한다.

 

 

1. 깨끗한 코드

  • 코드는 요구사항을 상세하게 표현하는 수단
  • 자신이 짠 쓰레기 코드를 나중에 손보겠다고 생각한 경험 -> '르블랑의 법칙' : 나중은 결코 오지 않는다는 것을 기억하자
  • 나쁜 코드는 개발 속도를 크게 떨어뜨린다.
  • 깨끗한 코드를 만드는 노력은 비용을 절감하는 방법일 뿐만 아니라 전문가로서 살아남는 길이다.
  • 깨끗한 코드를 작성하기 위해서는 절제와 규율이 필요하다.

 

깨끗한 코드란?

  • 비야네 스트롭스트룹
    • 우아하고 효율적인 코드
    • 속도가 빠르며 cpu 등의 자원을 낭비하지 않는 코드
    • 철저한 오류처리를하여 세세한 사항까지 꼼꼼하게 처리하는 코드
    • 한가지에 '집중'하는 코드
  • 그래디 부치
    • 단순하고 직접적이어서, 가독성이 좋은 코드
    • 명쾌한 추상화
  • 데이브 토마스
    • 다른 사람이 고치기 쉬운 코드
    • 단위 테스트 케이스와 인수 테스트 케이스가 존재
  • 마이클 페더스
    • 주의 깊게 짠 코드
    • 세세한 사항까지 꼼꼼하게 신경쓴 코드
  • 론 제프리스
    • 모든 테스트를 통과한다
    • 중복이 없다
    • 시스템 내 모든 설계 아이디어를 표현한다
    • 클래스, 메서드, 함수 등을 최대한 줄인다
    • 한가지 기능만 수행하라
    • 작게 추상화하라
  • 워드 커닝햄
    • 짐작했던 기능을 각 루틴이 그대로 수행한다

 

☞ 체크아웃할 때보다 좀 더 깨끗한 코드를 체크인하자.

 

 

 

2. 의미 있는 이름

좋은 이름을 지으려면 시간이 걸리지만 좋은 이름으로 절약하는 시간이 훨씬 더 많다.

우리는 변수, 함수, 인수와 클래스, 패키지 등등 많은 것에 이름을 붙인다. 이러한 이름을 잘 짓는 규칙들을 살펴보자.

 

의도를 분명히 밝혀라

  • 의도가 드러나는 이름을 사용하면 코드 이해와 변경이 쉬워진다.

그릇된 정보를 피하라

  • 그릇된 단서는 코드 의미를 흐린다.
  • ex ) 여러 계정을 그룹으로 묶을 때, 실제 list가 아니라면 accountList라 명명하지 않는다.
  • 서로 흡사한 이름을 사용하지 않도록 주의한다.
  • 유사한 개념은 유사한 표기법을 사용한다.
  • 일관성이 떨어지는 표기법은 그릇된 정보다.

의미있게 구분하라

  • 컴파일러나 인터프리터만 통과하려는 생각으로 코드를 구현하면 문제가 발생한다.
  • 이름이 달라야 한다면 의미도 달라져야한다.
  • 불용어를 추가한 이름 역시 아무런 정보를 제공하지 못한다. ex) ProductInfo 또는 ProductData

발음하기 쉬운 이름을 사용하라

검색하기 쉬운 이름을 사용하라

  • 문자하나를 사용하는 이름과 상수는 텍스트 코드에서 쉽게 눈에 띄지 않는다는 문제점이 있다.
  • 간단한 메서드에서 로컬 변수만 한 문자를 사용한다.
  • 이름 길이는 범위 크기에 비례해야 한다.
  • 변수나 상수를 코드 여러 곳에서 사용한다면 검색하기 쉬운 이름이 바람직하다.
  • 상수를 사용하는 이유도 검색이 쉽게 하기 위해서이다. (ex : MAX_CLASSES_PER_STUDENT 를 사용하는 것이 숫자를 사용하는것보다 훨씬 검색이 쉽다)

인코딩을 피하라

  • 유형이나 범위 정보까지 인코딩에 넣으면 그만큼 이름을 해독하기 어려워진다.
  • 자바는 변수 이름에 타입을 인코딩할 필요가 없다.

자신의 기억력을 자랑하지 마라

  • 코드를 읽으면서 변수 이름을 자신이 아는 이름으로 변환해야한다면 그 변수 이름은 바람직하지 못하다.
  • 문자 하나만 사용하는 변수 이름은 좋지 않다. (루프에서 반복 횟수를 세는 변수 i, j, k는 괜찮다. 루프에서 반복 횟수 변수는 전통적으로 한 글자를 사용함)
  • 명료함이 최고다.

클래스 이름

  • 클래스 이름과 객체 이름은 명사나 명사구가 적합하다.

메서드 이름

  • 메서드 이름은 동사나 동사구가 적합하다.
  • 접근자, 변경자, 조건자는 javabean 표준에 따라 값 앞에 get, set, is를 붙인다.

기발한 이름은 피하라

  • 의도를 분명하고 솔직하게 표현하라.

한 개념에 한 단어를 사용하라

  • 추상적인 개념 하나에 단어 하나를 선택해 이를 고수한다.
  • ex) 똑같은 메서드는 fetch, retrieve, get 들 중 하나로 지정하여 일관성 있게 사용한다.

말장난을 하지 마라

  • 한 단어를 두가지 목적으로 사용하지 마라.
  • 다른 개념에 같은 단어를 사용한다면 그것은 말장난에 불과하다.

해법 영역에서 가져온 이름을 사용하라

  • 기술 개념에는 기술 이름이 가장 적합한 선택이다.

문제 영역에서 가져온 이름을 사용하라

  • 적절한 프로그래머 용어가 없다면 문제 영역에서 이름을 가져온다.
  • 해법 영역과 문제 영역을 구분할 줄 알아야한다.

의미 있는 맥락을 추가하라

  • 클래스, 함수, 이름 공간에 넣어 맥락을 부여한다.
  • 모든 방법이 실패하면 마지막 수단으로 접두어를 붙인다.

불필요한 맥락을 없애라

  • 일반적으로 의미가 분명한 경우에 한해서, 짧은 이름이 긴 이름보다 좋다.
  • 따라서 이름에 불필요한 맥락을 추가하지 않도록 주의한다.

 

 

3. 함수

어떤 프로그램이든 가장 기본적인 단위는 함수이다.

 

  • 함수를 만드는 첫째 규칙은 '작게' 만드는  것이다.
    • 블록과 들여쓰기
    • if문 / else문 / while 문 등에 들어가는 블록은 한 줄이어야 한다.
    • 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다.
  • 한가지만 해라
    • 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다.
    • 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.
  • 함수 당 추상화 수준은 하나로
    • 함수가 확실히 '한 가지' 작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다.
    • 코드는 위에서 아래로 이야기처럼 읽혀야 좋다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다.
  • Switch 문
    • 다형성을 이용해 각 switch 문을 저차원 클래스에 숨기고 반복하지 않을 수 있다.
  • 서술적인 이름을 사용하라
    • 함수가 하는 일을 좀 더 잘 표현하도록 이름을 짓는것이 좋다.
    • 함수 이름을 정할 때는 여러 단어가 쉽게 읽히는 명명법을 사용한다.
    • 이름을 붙일 때는 일관성이 있어야 한다. 모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다.
  • 함수 인수
    • 함수에서 이상적인 인수 개수는 0개(무항)이다.
    • 함수에서 인수 1개를 넘기는 이유는 보통 인수에 질문은 던지는 경우, 인수로 뭔가를 변환해 결과를 반환하는 경우이다.
      이벤트 함수는 입력 인수만 있다. 이벤트 함수는 이벤트라는 사실이 코드에 명확히 드러나야 한다.
    • 함수로 bool값을 넘기는 플래그 인수는 사용하지 말자.
    • 인수가 2-3개 필요하다면 일부를 독자적인 클래스 변수로 선언할 가능성을 짚어보자. ex) 좌표를 point라는 클래스로 지정
    • 단항 함수는 함수와 인수가 동사/명사 쌍을 이뤄야한다.
  • 부수 효과를 일으키지 마라
    • “부수 효과” 는 함수 내의 실행으로 인해 함수 외부가 영향을 받는 것을 의미한다. 
    • 일반적으로 출력 인수는 피해야 한다. 함수에서 상태를 변경해야 한다면 함수가 속한 객체 상태를 변경하는 방식을 택한다.
  • 명령과 조회를 분리하라
    • 함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다.
    • 객체 상태를 변경하거나 객체 정보를 반환하는 것 중 하나.
  • 오류 코드보다 예외를 사용하라
    • 명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다.
    • 오류코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 한다는 문제에 부딪힌다.
    • 오류 코드 대신 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리되므로 코드가 깔끔해진다.
    • Try / Catch 블록을 별도 함수로 뽑아내는 편이 좋다. (try 아래에는 함수만 작성)
    • 오류 처리도 '한 가지' 작업에 속한다. 그러므로 오류를 처리하는 함수는 오류만 처리해야한다.
  • 반복하지 마라
  • 구조적 프로그래밍
    • 함수는 return 문이 하나여야 한다.
    • 함수를 작게 만든다면 return, break, continue를 여러 차레 사용해도 괜찮다.