[클린코드] 함수

skayjays·2022년 1월 16일
0

클린코드

목록 보기
2/5

의도를 분명히 표현하는 함수를 어떻게 구현할 수 있을까? 함수에 어떤속성을 부여해야 처음 읽는 사람이 프로그램 내부를 직관적으로 파악할 수 있을까?

작게 만들어라

  • 함수가 이야기를 표현한다.
  • if/esle 문, while문 등에 들어가는 블록은 한줄이여야 한다.
  • 들여쓰기 수준은 1단이나 2단을 넘어서면 안된다.

한가지만 해라

  • 함수는 한가지를 해야 한다. 그 한가지를 잘 해야한다. 그 한가지만을 해야한다.

한가지란?

  • 지정된 함수 이름 아래에서 추상화 수준이 하나를 의미한다.
  • 함수는 간단한 TO 문단으로 기술 할 수 있다.
  • 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.
  • 함수내 섹션이 생기는경우 한가지를 한다는 의미를 벗어난다.

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

  • 한 함수 내에서 추상화 수준을 섞으면 코드를 읽는 사람이 헷갈린다.
  • 근본 개념과 세부사항을 뒤섞기 시작하면, 깨어진 창문처럼 사람들이 함수에 세부사항을 점점더 추가한다.

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

  • 위에서 아래로 내려갈 수록 추상화 수준도 낮아지게 작성한다.
  • TO문단법을 사용한다.
  • 각함수는 다음 함수를 소개하며 일정한 추상화 수준을 유지한다.

switch 문

  • 다형성 객체를 생성하는 코드를 제외하고는 숨긴다.

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

  • 함수가 작고 단순 할 수록 서술적인 이름이 붙혀지기 쉽다

함수 인수

  • 이상적인 인수 개수는 0 개다

많이 쓰는 단항 형식

  • boolean fileExists("myFile") 과 같이 인수에 질문을 던지는 경우
  • InputStream fileOpen("MyFile") 과 같은 형변환 함수

플레그 인수

  • 플레그 인수는 추하다

이항 함수

  • Point(x,y) 와 같이 직교 좌표계는 이항함수가 적절하다.
  • 이항이 생기면 한쪽 클래스에 해당 책임을 부여해서 단항함수로 변경한다.

삼항 함수

  • 이해하기 어렵다. 순서 주춤, 무시로 야기되는 문제가 두배 이상 늘어난다.

인수 객체

  • 인수가 2~3개 필요하다면 일부를 독자적인 크래스 변수로 선언할 가능성을 짚어 본다.

동사와 키워드

  • 함수이름에 키워드를 추가한다. assertEquals 보다 assertExpectedEqualsActual이 더 좋다. 즉 인수 순서를 기억할 필요가 없어진다.

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

  • 시간적인 결합, 순서 종속성을 만들지 마라.

출력인수

  • 출력 인수는 피해야한다. 함수에서 상태를 변경해야 한다면 함수가 속한 객체 상태를 변경하는 방식을 택한다.

명령과 조회를 분리하라.

  • public boolean set(String attribute, String value); 처럼 명령과 조회를 한꺼번에 사용하면 이상한 의미로 전달되게 된다.

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

  • try catch는 별도 함수 블록으로 뽑아내라
  • 오류 처리도 한가지 작업이다.
  • 의존성 자석을 사용하지마라. ex) enum Error -> Exception

반복하지마라

함수를 어떻게 짜죠?

  • 소프트웨어를 짜는 행위는 여느 글짓기와 비슷하다.
  • 먼저 생각을 기록한 후 읽기 좋게 다듬는다.
  • 빠짐없이 테스트 케이스를 작성한다.
  • 그런다음 코드를 다듬고 함수를 만들고 이름을 바꾸고 중복을 제거한다
  • 메서드를 줄이고 순서를 바꾼다. 때로는 전체 클래스를 쪼개기도 한다. 이와중에 코드는 항상 단위 테스트를 통과한다.

정리

소프트웨어를 개발하면서 항상 좋은 코드 품질을 고려해서 작성하려고 노력한다. 하지만 일정에 치여서 아니면 기존 레거시 코드를 유지보수 하다 보면 오히려 괜히 바꿨다가 더 문제 생기는 거 아닌가 빨리 만들어야 되니 일단 돌아가게 하자는 등의 이유로 코드 품질은 계속 떨어지게 되곤 한다. 또한 나중에 고쳐야 한다고 생각하지만 그럴만한 시간적 여유가 주어지지 않고 부채로 남긴 채 코드는 계속 확장해 나가게 된다. 이러한 문제를 해결하기 위해서는 이책에서도 제시한 리팩토링 방법(함수를 어떻게 짜죠?)과 함수를 작게 쪼개서 꾸준히 코드 품질을 높일 수 있는 마음가짐을 갖고 개발하는 게 중요하다는 생각이 든다.

profile
기초를 탄탄하게

0개의 댓글