ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CleanCode] 클린코드(3) - 함수
    programing/etc 2019. 11. 2. 15:41

    안녕하세요, Einere입니다.

    (ADblock을 꺼주시면 감사하겠습니다.)


    해당 포스트는 로버트 C 마틴의 클린코드를 읽고 간단하게 정리한 글입니다.

     

     

    작게 만들어라

     

     

    블록과 들여쓰기

    블록은 너무 많이 겹쳐서는 안된다. 즉, 중첩 구조가 생길만큼 함수가 커서는 안 된다. 추천하는 깊이는 1~2단 정도.

     

     

    한가지만 해라

    함수가 한가지 일만 하도록 한다. (필요하다면 서브 루틴을 함수로 만들어 추상화 한다.)

     

     

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

    한가지 작업만 하는 함수를 만드려면, 함수 내부의 모든 문장의 추상화 수준이 동일해야 한다.

    예를 들어 getHtml()은 매우 높은 수준, String pagePathName = pathParser.redner(patePath);는 중간 수준, .append('\n');은 낮은 수준이다.

     

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

    코드는 위에서 아래로 이야기처럼 읽혀야 좋다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 와야 한다.

     

     

    switch문

    switch문이나 if else if문은 작게 만들기 어렵다. 기본적으로 N가지 분기 작업을 수행하기 때문이다. 따라서, 다형성을 이용하여 저차원으로 추상화한다. (추상 팩토리 패턴을 사용한다던지..)

     

     

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

    길고 서술적인 이름은 짧고 어려운 이름, 서술적인 주석보다 좋다.

    일관성 있게 이름짓자.

     

     

    함수 인수

    함수의 인자 개수는 최대한 적을수록 좋다.

    변환 함수라면 변환 결과를 반환값으로 돌려준다. 

     

    플래그 인수

    플래그 인자는 대놓고 두가지 이상의 일을 하겠다는 뜻이므로 정말 비추한다. 차라리 두 함수로 나누자.

     

    인수 객체

    인자의 개수가 여러개가 필요하다면 그들을 특정 클래스로 뭉치는것도 좋다. (x, y를 Point라는 클래스로 추상화)

     

    부수 효과를 일으키지 마라

    함수 내에서 의도하지 않은 작업은 하지 말자. (checkPassword라는 함수에서 Session.init()을 호출하는 경우.) 이런 부수 효과는 시간적인 결합을 초래한다. (checkPassword는 세션을 초기화해도 괜찮은 경우에만 호출을 해야 한다.) 이런 경우, 차라리 함수 이름을 checkPasswordAndInitSession으로 수정하는 것이 좋다. (물론 여러가지 일을 하는건 여전하다.)

     

     

    명령과 조회를 분리하라

    graphQL이 query와 mutation을 분리한 것 처럼, 함수도 상태 조회 기능과 상태 변경 기능을 구분하자.

     

     

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

    명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다. (if문에서 명령 함수를 사용하기 쉽기 때문..)

    만약 예외와 예외처리 코드를 사용한다면, 오류 처리 코드가 원래 코드와 분리되어 깔끔해진다. (고 한다...)

     

    try catch 블록 뽑아내기

    try catch문은 정상 코드와 에러 처리 코드를 뒤섞는다. 따라서 try내부에 들어갈 메인 로직은 함수로 만들어 추상화해서 오류 처리와 로직을 분리하는 것이 좋다.

     

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

    위 처럼, 오류 처리를 수행하는 함수는 try로 시작해서 catch(finally)로 끝나야 한다.

     

     

    반복하지 마라

     

    댓글

Designed by black7375.