본문 바로가기

클린코드

[클린코드 독서] 3장 - 함수

  • 함수를 복잡하고 중복적이고, 이상한 자료유형을 쓰는거만큼 거지같은게 없다
    • 이건 나도 항상 느끼는 바이다.
    • 구현에 급급해서 대충 함수를 만들면 거의 패치워크로 만든 옷같아서...어느 부분이 어느 기능을 담는지 알아보기어렵다.
    • 메소드 몇개를 추출하고, 이름을 변경하고, 구조를 조금만 손봐도 깔끔해진다.
    • 근데 자꾸...귀찮아서 리팩토링을 안한다... 열심히 살자

 

  1. 작게, 한기능만 하게 만들어라
    • 제일 중요한 규칙
    • 거의 3-5줄 정도밖에 안되게 줄여야함
    • 즉, if/else/while에 들어가는 블록이 한줄정도여야한다는거임
    • 이럴려면, 중첩구조가 생길만큼 함수를 크게 키우지 말아야한다
    • 들여쓰기가 1단, 2단을 넘어서면 안됨
    • 예시로 줬던 첫 목록은 세가지 일을함
    • (페이지가 테스트인지 확인 / 그러면 설정&해체 페이지 넣기 / HTML로 렌더링)
    • 이걸 다 쪼개라는거임
  2. 함수당 추상화 수준은 하나로
    • 함수 내 모든 문장의 추상화 수준이 같아야 한가지 일만 함
    • 예를 들어 목록 3-1은,
      • getHtml()은 추상화 수준이 높음
      • String pagePathName = PathParser.render(pagepath);은 중간수준
      • 그리고 .append("\n");은 추상화 수준이 아주 낮음
    • 내려가기 규칙으로, 코드는 위에서 아래로 읽혀야함
    • 한 함수 다음에 나오는 함수는 추상화 수준이 한단계낮은 함수가 나오는식
  3. switch문?
    • 스위치문은 작게 만들기 어려움
    • 대신 스위치문을 저차원 클래스에 숨겨놓고 절대로 반복하지 않는 방법이 있음 (다형성 이용)
    • SRP가 뭔지 찾아보자...OCP도
    • 쨋든 abstract...추상 클래스에 숨겨놓자
    • 이 코드는 굉장히 중요해 보이니까 실제로 적용해보자 (내가 인터페이스와 추상화를 잘 안씀)
  4. 이름은 서술적으로
    • 이름 길어지는걸 두려워하지말자
    • 이름 붙일때 일관성이 있어야함!!
      • includeSetupAndTeardownPages
      • includeSetupPages
      • includeSuiteSetupPage
      • 등등
  5. 함수 인수는 어떻게 할까
    • 이상적인 인수개수는 0개
    • 3항은 최대한 피하기, 4개 이상은 특별한 이유가 있어도 사용 ㄴ
    • 3-7에서 StringBuffer를 인스턴스 변수로 선언안하고 함수인수로 할 수 있는데도 안한거임
    • 테스트할때도 어렵기 때문에 하지말자
    • 여러형식들 쓰는경우 (그 경우가 아니면 쓰지말기)
      • 단항 - 인수에 질문 던지는 경우, 뭔가를 변환해서 반환하는 경우, 이벤트에 씀
      • 플래그 인수 -추하다고한다...나 가끔 썼는데...ㅠ 왜냐하면 함수가 여러일을 한다는 반증이기때문! true면 이걸하고 false면 이걸하니까
      • 이항 - 좌표계에서는 씀. 그 외에는 단항으로 바꿀수있다면 바꾸기
      • 인수 객체 - 객체를 생성해서 인수를 줄이는건 눈속임이 아니다. 개념을 표현하는것임
      • 이름짓기 - 함수는 동사, 인수는 명사로 짓기
  6. 부수효과 절대 no
    • 거짓말과 다름없음
    • 하나만 하겠다고 하고 남몰래 다른걸 하는거니까
    • 예를 들면 전역변수를 수정해버리는 경우
    • 이런경우 시간적인 결합이 어긋나서 혼란이 오는 경우가 있음
  7. 명령과 조회는 나누어서하자
    • 뭐가를 수행하거나 / 뭔가에 답하거나 둘중 1개만
  8. 오류코드 x 예외처리하기
    • 막 if()이거이면~ 이런식으로 오류처리하지말자
    • try catch로 깔끔하게!!
    • 그리고 try catch는 추하니까....별도 함수로 뽑아낸다
    • 오류처리도 한가지 작업이기에 함수로 처리하는것임
  9. 반복되는 알고리즘 없애기
  10. 구조적 프로그래밍
    • return문은 하나여야함.
    • goto같은건 절대 절대 절대 쓰지마라
    • break와 continue도 별로안좋다..
    • 만약 함수가 작다면 간혹가다가 return break continue를 여러번 써도 괜찮긴하다.