깡뇽

[Clean Code] 클린 코드 - 3장 함수 본문

Book/Clean Code

[Clean Code] 클린 코드 - 3장 함수

깡뇽 2022. 2. 23. 21:11
반응형

함수 : 프로그램의 가장 기본적인 단위

 

작게 만들어라!

함수를 작게 만들수록 좋다. 

 

- 블록과 들여쓰기 : 들여쓰기 수준은 1단이나 2단을 넘기지 않아야 한다. if 문/ else 문 / while 문 등에 들어가는 블록은 한 줄이어야 하고, 거기서 함수를 호출하여 코드를 읽고 이해하기도 쉽도록 작성해야 한다.

 


한 가지만 해라!

"함수는 한 가지를 해야 한다. 그 한 가지를 잘해야 한다. 그 한 가지만을 해야 한다."라는 충고를 잘 기억해야겠다.

 

- 함수 내 섹션 : 한 가지 작업만 하는 함수는 섹션으로 구분하기 어렵다.

 


함수 당 추상화 수준은 하나로!

함수가 한 가지 일만 하려면 함수 안 모든 문장의 추상화 수준이 동일해야 한다.

 

- 위에서 아래로 코드 읽기 : 내려가기 규칙 

위에서 아래로 내려갈수록 함수 추상화 수준이 한 단계씩 낮아진다. 

 

 


Switch 문

switch 문은 N가지 일을 처리하므로 한 가지 작업만 하도록 만들기 어려운데, 각 switch 문을 저차원 클래스에 숨시고 절대 반복하지 않도록 다형성을 이용한다.

* 다형성(polymorphism)이란? 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미

 


서술적인 이름을 사용하라!

길더라도 함수 기능을 잘 드러내는 이름을 사용해야 한다.

 


함수 인수

함수의 인수 개수가 0개인 것이 이상적이고, 적을수록 좋다.

특히 함수 이름과 인수 사이에 추상화 수준이 다르다면 코드를 이해하기 더 어려워지며 테스트 케이스에서의 함수가 인수를 가지면 테스트를 하기에 어려워진다.

 

- 많이 쓰는 단항 형식 : 인수에 질문을 던지거나 인수를 뭔가로 반환하여 결과를 반환할 때에 인수 1개를 넘긴다.  하지만 단항 함수는 가급적 사용하지 않는 것이 좋다.

 

- 플래그 인수 : 함수로 Boolean 값을 넘겨주는 역할을 해준다. 즉, 함수가 여러 작업을 해야한다는 것이므로 좋지 않다.

 

- 이항 함수 & 삼항 함수 : 인수가 2개, 3개이므로 1개보다 이해하기 어렵다고 할 수 있다. 

 

- 인수 객체 : 변수를 묶어 객체를 생성하여 인수를 줄이는 방법이다.

 

- 인수 목록 : `String.format("%s worked %.2f" hours.", name, hour);`과 같은 메서드처럼 가변 인수들을 전부 동등하게 취급하는, 인수 개수가 가변적인 함수도 필요하다.

 

- 동사와 키워드 : 단항 함수는 함수와 인수가 write(name)처럼 동사/명사 쌍으로 만들고, assertExpectedEqualsActual(expected, actual)과 같이 함수 이름에 키워드를 추가하면 인수 순서를 기억할 필요가 없다.

 


부수 효과를 일으키지 마라!

시간적 결합이나 순서 종속성을 초래하는 경우에는 이름에 명시해야 한다.

 

- 출력 인수 :  객체 지향 프로그래밍은 출력 인수를 사용할 필요가 거의 없고, this 변수를 사용한다.

 

 


명령과 조회를 분리하라!

함수는 뭔가를 수행 or 뭔가에 답하기 중 하나만 해야 한다. 즉, 객체 상태를 변경하거나 객체 정보를 반환하거나 둘 중 하나만 해야 혼란을 만들지 않는다.

 


오류 코드보다 예외를 사용하라!

오류 처리 코드가 원래 코드에서 분리되기에 코드가 깔끔해진다.

 

- Try/Catch 블록 뽑아내기

try/catch 블록을 코드 구조에서 혼란을 일으키지 않도록 별도 함수로 뽑아내면 코드를 이해 및 수정하기에도 좋다.

 

- 오류 처리도 한 가지 작업이다.

 

- Error.java 의존성 자석

오류 코드 반환 == 오류 코드 정의. 그러나 재컴파일/재배치가 번거롭기에 새 오류 코드를 재정의하기보다는 기존 오류 코드를 재사용한다. 오류 코드 대신 예외를 사용하면 새 예외는 Exception 클래스에서 파생되므로 재컴파일/재배치 없이 새 예외 클래스를 추가할 수 있다.

 


반복하지 마라!

include 방법, 관계형 데이터베이스에 정규 형식 만들기, 객체 지향 프로그래밍 코드를 부모 클래스로 몰아두기 등으로 중복을 없애서 가독성을 높일 수 있다.  -> 구조적 프로그래밍, AOP, COP

 


구조적 프로그래밍

테이크스트 : 함수와 함수 내 모든 블록에 입구와 출구가 하나만 존재해야 한다.

작은 함수는 return, break, continue 사용 OK. 그러나 goto 문은 큰 함수에서만 사용.

 


함수를 어떻게 짜죠?

처음부터 완벽할 수는 없다! 계속 코드를 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거하고, 메서드를 줄이고, 순서를 바꾸고, 전체 클래스를 쪼개는 등의 작업을 해야 한다.

 


결론

프로그래밍의 기술은 언제나 언어 설계의 기술이다.

함수를 잘 만들어서 결과적으로는 시스템을 잘 만들어내는 것이 최종적인 목표라고 할 수 있겠다.

 


느낀점

사실 함수 만드는 것을 좋아하지 않는다. 아직은 코린이기 때문이겠지? 언제쯤 함수를 쓰는 것이 재미있다고 생각하게 될까!? 읽는 내내 코딩에서 함수는 필수이면서도 복잡하게 만들어서는 안 되는 존재임을 다시금 깨닫는다.

 

TIL 5회차

반응형