Clean Code Day 3 3장

Jeeho Park (aquashdw)·2024년 8월 27일

Clean Code

목록 보기
3/10

어제(월요일) 코로나 확진떳다...ㅋ 비몽사몽간에 겨우겨우 책 읽는 중

abstract

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

3장은 함수에 대한 이야기였다. 절차지향 프로그래밍 언어들이 서브루틴의 개념을 만든 이후 대부분의 프로그램들은 여러 함수 또는 메서드가 어느 시점에 실행되느냐를 조정해서 만들어지기 때문에 기능의 가장 작은 단위라고 볼 수 있을것 같다. 그렇기에 함수를 어떻게 만드느냐는 클린코드에서 빼먹을 수 없는 내용일 것이다.

3장 함수

오늘은 상태가 좋지않아 적당히 정리한다ㅠ

작게 만들어라

함수를 만드는 첫째 규칙은 '작게!'다. 함수를 만드는 둘째 규칙은 '더 작게!'다.

이전 장에서 이미 작성한 코드를 다시 보는데 코딩하는 대부분의 시간을 사용한다는 내용이 있었던걸로 기억한다. 함수가 작으면 확인할 내용도 줄어드려나?

야구 명언중에 "느린 공, 더 느린 공, 가장 느린 공" 이야기가 있었는데.....사실 이거랑은 상관 없는 이야기

한 가지만 해라

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

  • 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면, 그 함수는 한 가지 작업만한다.
  • 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.
  • 핵심은 짧으면서도 '한 가지'만 하는 함수다.

추상화 수준이라는 말이 계속 등장하게 되는데, 함수를 추출하고 추출하면서 유일한 작업 하나만 하게 만드는 과정에서 얼마나 추출하게 되느냐...? 정도로 찾아진다. 자세한건 나중에 찾아봐야겠다...

switch statement

switch는 그 특징상 한가지 일만 할 수는 없다.

  • 다형성을 활용하면 switch 문을 저차원 클래스에 숨길 수 있다.

서술적인 이름을 사용하라

코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 깨끗한 코드라 불러도 되겠다.

  • 함수가 작고 단순할수록 서술적인 이름을 고르기도 쉬워진다.
  • 길고 서술적인 이름이 길고 서술적인 주석보다 좋다.
  • 서술적인 이름으 사용하면 개발자 머릿속에서도 설계가 뚜렷해지므로 코드를 개선하기 쉬워진다.

마찬가지로 별 상관은 없지만 Spring Data JPA에서 만드는 Query Method 들이 생각났다...

함수 인수

함수에서 이상적인 인수 개수는 0개다. 다음은 1개고, 다음은 2개다. 3개는 가능한 피하는 편이 좋다.

많이 쓰는 단항 형식

  • 인수에 대한 질문을 던지는 경우
    • boolean fileExists("text.txt")
    • boolean isDigit('a')
  • 인수를 뭔가로 변환해 결과를 반환하는 경우
    • int parseInt("123")
    • long parseLong("123")
  • 변환 함수에서 출력 인수를 사용하면 혼란을 일으킨다.
    • 입력 인수를 변환하는 함수라면 결과는 반환값으로 돌려준다.
      • 메서드의 내부에서 전달된 인수를 변경하는 것이 아니라
      • 만들어진 결과 데이터를 반환(return)하는 형태로 만들어라.

마지막 예시에서 Java Servlet API가 떠올랐다. HttpServlet도 그렇고 Filter도 그렇고 requestresponse를 인수로 전달하고 그걸 메서드 내부에서 조작하게 되는데......

인수 객체

객체를 생성해 인수를 줄이는 방법이 눈속임이라 여겨질지 모르지만 그렇지 않다.

점(Point)라는 객체를 만들면 해당 객체의 형 자체가 개념을 가지고 있기 때문에, 인수를 위한 객체를 만드는 것은 나쁘지 않은 행위이며, 이를 이용해 함수의 항의 갯수를 줄일 수 있다.

부수 효과를 일으키지 마라

  • 부수 효과는 함수가 한가지 일을 하는 척 다른 일을 하는 것이다.
  • 많은 경우 시간적인 결합이나 순서 종속성을 초래한다.

함수형 프로그래밍에서 이야기한 Pure Function 얘기가 떠올랐었다.

명령과 조회를 분리하라

함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만해야 한다.

근데 이건 사실 Java로 만든 여러 메서드가 어기고 있는 특징 아닌가? 다음은 Java의 Collection 중 하나인 Listadd 메서드이다.

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

명령함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다.

  • 오류 코드 대신 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리되므로 코드가 깔끔해진다.

결론

작성하는 함수가 분명하고 정확한 언어로 깔끔하게 같이 맞아떨어져야 이야기를 풀어가기가 쉬워진다.

여담

약간 소소한 내용, 이미 알고 있거나 실천 중인 내용들은 스킵했다....컨디션이 너무 안좋다ㅠㅠ

0개의 댓글