클린코드 정리 - (2) 함수, 주석

김재연·2024년 12월 4일
0

클린코드

목록 보기
1/1

3장 함수

  • 작게 만들고 가능하면 더 작게 만들어라.
  • if/else while 등에 사용하는 블록은 한 depth만 들어가라, 중첩구조가 생길만큼 함수가 커지면 안된다.
  • 한가지만 해라, 함수를 만드는 이유는 큰개념(함수 이름)을 여러 단계로 나눠 수행하기 위함이다.
    • 함수가 한가지만 하는지 판단하는 방법 : 의미있는 이름으로 다른이름으로 추출할 수 있으면 여러가지 일을 하는거다.
  • 함수내 모든 문장의 추상화 수준을 동일하게 가져가라. 섞으면 표현이 상세구현인지 개념인지 구분하기 힘들기 때문에 추상화 수준을 동일하게 가져가라
  • switch문은 N가지 일을 하기 때문에 피하라
  • 서술적인 이름을 사용하라, 이름이 긴게 짧게 어려운 이름보다 좋다. 이름을 지을때는 일관성있게 지어라
  • 인자는 개념을 이해하기 어렵게 만들기 때문에 최대한 줄여라 인자가 많으면 테스트하기 힘들다. 함수 이름과 인자사이 추상화 수준을 동일하게 맞춰라
  • 명령과 조회를 분리하라. 조회하고 변경을 분리해라
  • 함수를 잘 만들기 위해 단위 테스트를 작성하고 추후 리팩토링해라

4장 주석

  • 주석은 거짓말 하기 때문에 안좋고 코드만이 진실만을 말한다. 필요하면 최대한 줄인다.
  • 좋은주석 : 법적인 내용, 정보제공주석, 경고하는 주석, 모호한 변수에 대해 명료하게 밝히는 주석, 중요성을 강조하는 주석
  • 나쁜주석 : 오해있는 주석, 같은 이야기하는 주석, 의무로 다는 주석, 있으나 마나한 주석, 주석으로 처리한 코드, 전역정보, 비공개 코드 javadoc
  • 함수나 변수로 표현할 수 있으면 주석을 달지 마라

느낀점

일관성 있게 코드를 작성해야되는데, 가장 중요한 함수 이름에 대해 일관성이 부족했다. 저장하는 로직만 살펴봐도 write, save, saveAll, bulkWrite, bulkSave 의 이름으로 사용하고 있는데, 큰 고민 없이 사용했다. 이 부분에 대해서 좀 더 고민하고 이름을 지어봐야겠다. 당장은 JPA 내부 메서드에서는 어떻게 동작하는지 보고 기준을 세워보려고한다.

주석이 안좋다고 해서 회사 프로젝트에 주석을 달때마다 마음 한편으로 죄짓는 느낌이 있었다. 주석은 무조건 안좋다고 생각했는데, 좋은 주석과 나쁜 주석이 구분되서 다행이였고 다행히 내가 작성한 주석들은 이상한 변수명 도메인인 적으로 설명, 정책논의, 이상한 스펙들이 어떤 배경에서 왔는지 슬랙 링크 등을 첨부하고 있어서 좋은 주석이라 안심이 되었다. 최대한 주석을 안달겠지만 달 수 있으면 의미있는 주석만 달아야겠다.

나만의 생각

  • kotlin의 when절은 좋은지 안좋은지 궁금하다. N가지 일을 하는거 같지만 결국 TransactionType 을 판단하는 로직만 수행하기 때문에 아래 예시는 한가지 일만 한다고 판단이 됨
fun decideTransactionType(legacyCode): String {
  return when (legacyCode) {
    "approveCode" -> APPROVE
    "cancelCode" -> CANCEL
    "partialCancelCode" -> PARTIAL_CANCEL
  }
}
  • private 메서드가 public보다 밑에 있는게 좋을지 바로바로 호출하는쪽이랑 가까운게 좋을지 고민된다. 리팩토링에서는 사용하는쪽에서 가까이 붙이라고 했는데, 개인적으로는 클래스를 열어보았을때 public 메서드만 우선 보고 싶고 private 밑에 public 함수가 있으면 클래스를 파악하는데 어려움이 있을거 같아서 저자가 주장하는 2안보다는 1안을 더 선호하긴한다. 팀내에서 이 주제로 한번 이야기를 해봐야겠다.
// 1안
fun TestClass {
  fun publicA() {
    
    return privateFunA()
  }
  
  fun publicB() {
    
  }
  
  private fun privateFunA() {
    // logic
  }
 
}

// 2안
fun TestClass {
  fun publicA() {
    
    return privateFunA()
  }
  
  private fun privateFunA() {
    // logic
  }

  
  fun publicB() {
    
  }
}
  • 내가 생각하는 좋은 주석의 예시
class CommentEntity {
  private cardFee: Long?, // 변수명은 카드수수료 같지만 실제로 부분취소키
}

class Policy {
  // 정책적으로 예외가 있음
  fun decide() {
    return if (예외) {
      예외함수
    } else {
      정상동작
    }
  }
}
profile
이제 블로그 좀 쓰자

0개의 댓글