코진남

Clean Code 3장 함수 본문

Robert C.Martin 클린코드

Clean Code 3장 함수

woojin126 2022. 2. 22. 14:07

▶오늘 읽은 범위

 

2장. 함수

 

📑 정리본

 

  • 함수는 최대한 작게 만들어라.(p.42)
    • 블록안에 함수 이름을 적절하게 지어라
    • 중첩 구조가 생길만큼 함수가 커져서는 안 된다.
      • 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서는 안된다. (그래야 읽고 이해하기 쉽다)
  • 함수는 한가지 기능만 해야한다!(p.44)
    • 1) 페이지가 테스트 페이지인지 판단한다.
    • 2)그렇다면 설정 페이지와 해제 페이지를 넣는다.
    • 3)페이지를 HTML로 렌더링한다.
      • 위 세개의 예제는 한가지 일까? 세가지일까?
        • 페이지가 테스트 페이지인지 확인 한 후 테스트 페이지라면 설정 페이지와 헤제 페이지를 넣는다. 테스트페이든 아니든 페이지를 HTML로 렌더링한다.
          • 즉 지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행하면 그 함수는 한 가지 작업만 한다는 것이다.
  • 함수 당 추상화 수준은 하나로!(P.46)
    • 함수가 확실히 '한 가지' 작업만 하려면 함수 내 모든 문자의 추상화 수준이 동일 해야한다.
      • ex) getHTML()은 추상화 수준이 아주 높다. 반면 String pagePathName = PathParser.render(pagepath);는 추상화 수준이 중간이다.
        • 한 함수 내에 추상화 수준을 섞으면 코드를 읽는 사람이 햇갈린다.
        • 근본 개념과 세부사항을 뒤섞기 시작하면, 깨어진 창문처럼 사람들이 함수에 세부사항을 점점 더 추가한다.
    • 위에서 아래로 코드읽기: 내려가기 규칙
      • 코드는 위에서 아래로 이야기 처럼 읽혀야 한다.
      • 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 와야한다. 
        • 이런것이 내려가기 규칙이다.
    • Switch 문 (p.47)
      • switch 문은 작게 만들기 어렵다. 
        • 그렇기에 switch문은 저차원 클래스에 숨기고 절대로 반복하지 않는 방법이 있다.
          • 다형성을 이용한다.
  • 서술적인 이름을 사용해라(p.49)
    • 좋은 네이밍인지 판단을 위한 척도는 코드를 읽으면서 짐작했던 기능 각 루틴이 그대로 수행한다면 깨끗한 코드다.
    • 한 가지만 하는 작은 함수에 좋은 이름을 붙인다면 이런 언칙을 달성함에 있어서 이미 절반은 성공한거다.
    • 함수가 작고 단순할수록 서술적인 이름을 고르기도 쉬워진다.
    • 이름이 길고 서술적인 이름이 더 좋다.
      • 함수 이름을 정할 때는 여러 단어가 쉽게 읽히는 명명법을 사용한다. 글너다음, 여러 단어를 사용해 함수 기능을 잘 표현하는 이름을 선택한다.
  • 함수 인수(p.50)
    • 함수에서 이상적인 인수 개수는 0개다. 다음 1. 2. 3... (삼항부터는 가급적 피해라)
    • 많이 쓰는 단항 형식
      • 함수에 인수 1개를 넘기는 가장 흔한 경우는 두 가지다. 하나는 인수에 질문을 던지는 경우.
      • ex) boolean fileExist("MyFile")이 좋은 예다.
      • ex2) 다른 하나는 인수를 뭔가로 변환해 결과를 반환하는 경우다. InputStream fileOpen("MyFile")은 String 형의 파일을 InputStream으로 변환한다. 이들 경우 독자가 당현하게 받아들인다.
      • ex3)다소 드물게 사용하지만 이벤트 함수도 마찬가지다.
    • 플래그 인수(p.52)
      • 함수로 부울 값을 넘기는 관례는 끔찍하다. 왜냐? 함수가 한번에 여러 가지 처리한다고 대놓고 공표하는 셈이다.
    • 이항 함수
      • 인수가 2개인 함수는 인수가 1개인 함수보다 이해하기 힘들다. 
      • ex) writeField(name)은 writeField(outputStream, name) 보다 이해하기 쉽다. 둘다 의미는 명백하지만 전자가 더 쉽게 읽히고 더 빨리 이해된다. 후자는 첫 인수를 무시해야 한다는 사실을 깨닫는 시간이 필요하다.
    • 삼항 함수
      • 되도록이면 쓰지말자
    • 인수 객체 (p.53)
      • 인수 2-3개 필요하다면 일부를 독자적인 클래스 변수로 선언할 가능성을 짚어 본다.
      • ex) Circle makeCircle(double x , double y , double radius);
      • ex) Circle makeCircle(Point center, double radius);
        • 객체를 생성해 인수를 줄이는 방법이 눈속임이라고 느껴질 수 있지만 전혀 아니다.
    • 인수 목록 (p.54)
  • 부수 효과를 일으키지 말아라!(p.55)
    • 함수에서 한 가지를 하겠다고 약속하고서 떄로는 예상치 못한 클래스 변수를 수정한다.
    • 예제를 봐라 하나의 기능이 실행될때 부수효과인 Session.initialize() 호출이 된다. 이러면 안된다.
  • 명령과 조회를 분리해라!(p.56)
    • 함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 선택 해야한다. 둘 다 하면 안된다.
    • 객체 상태를 변경하거나 아니면 객체 정보를 반환하거나 둘 중 하나이다.
    • 둘 다 하면 혼란을 초래한다.
  • 오류 코드보다 예외를 사용해라!(p.57)
    • ex) if(deletePage(page) == E_OK)
      • 위 코드는 동사/형용사 혼란을 일으키지 않는 대신 여러 단계로 중첩되는 코드를 야기한다. 오류 코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 한다는 문제에 부딪힌다.
        • (p.58)을 참고하자
  • 반복하지 말아라(p.60)
    • 구조적 프로그래밍, AOP, COP 모두 어떤 면에서는 중복을 제거하기 위한 전략이다.
  • 구조적 프로그래밍(P.61)
    • 모든 함수와 함수 내 모든 블록에 입구와 출구가 하나만 존재해야 한다. 즉, 함수는 RETURN 문이 하나만 있어야한다.
    • 루프 안에서 break, continue를 사용해선 안되며 goto는 절대로 쓰면 안된다.

 

✔오늘 책을 읽은 소감

함수를 작은 단위로 분리하면 코드를 파악하는 프로그래머 입장에서도 편하고, 유지보수도 편해진다는 것을

조금이나마 알 수 있었다.

 

 

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

아직 자바 기초지식이 약하다보니 어떻게 함수를 작고, 파악하기 쉽도록 분리할지 감이 안잡히는 것 같다.

앞으로 진행할 팀프로젝트에 조금씩 적용을 해봐야 할 것 같다.

 
 

'Robert C.Martin 클린코드' 카테고리의 다른 글

clean code 5편  (0) 2022.02.26
Clean Code 4장 주석  (0) 2022.02.24
Clean Code 2장 의미있는 이름  (0) 2022.02.20
Clean Code 1장 깨끗한 코드  (0) 2022.02.19
Clean Code 읽기 전  (0) 2022.02.11