클린 코드 적용기 - 함수 파라미터의 개수와 부수 효과

유재경·2022년 5월 15일
0

Clean Code 적용기

목록 보기
1/4

(※ 실제 코드 유출 방지를 위해 약간의 코드 변형을 하였습니다.)

함수의 파라미터 개수는 적을수록 좋다

  • 이상적인 함수의 파라미터 수는 0개이다. 그 다음은 1개, 다다음은 2개, 3개부터는 피하는 것이 좋다.
  • 함수의 파라미터가 많을수록 테스트를 하기 위한 전달인자가 많이 필요하게 된다.
  • 파라미터의 개수가 적을수록 이해하기 쉽다.
  • 파라미터가 많으면 하나의 struct(혹은 class)로 묶어서 전달하는 것이 낫다.

부수 효과를 일으키지 마라

  • 함수는 한 가지 역할만 해야한다. 그런데 예상치 못하게 클래스 변수나 시스템 전역 변수를 수정하여 예상치 못한 결과(부수효과)를 낳을 수 있다.
  • 부수 효과는 시간적인 결합을 초래한다. 즉, 비동기적인 작업을 처리하다가 항상 같은 output을 내지 못할 수도 있다.

Bad Practice

func handleChatInputText(text: String, zoneId: Int, chatType: String) {
    if self.editMode, let editingMessageId = self.editingMessageId {
        self.modifyMessage(id: editingMessageId, message: text)
    } else {
        self.zoneId = zoneId
        self.chatType = chatType
        self.sendMessage(text: text) // zoneId와 chatType을 가지고 api 호출하는 함수
    }
}

문제점

  1. 함수의 파라미터로 text, zoneId, chatType 3가지가 필요하다.
  2. else 안의 구문에서 부수적인 효과를 낳고 있다.
  3. 이번 주제와 연관은 없지만, '수정하다' 맥락을 가지는 코드에서 edit과 modify라는 두 가지 용어를 같이 쓰고 있는데 둘 중 하나로 통일하는 것이 좋다.

Good Practice

struct ChatInputInfo {
    let text: String
    let zoneId: Int
    let chatType: String
}  

func handleChatInputText(info: ChatInputInfo) {
    if self.editMode, let editingMessageId = self.editingMessageId {
        self.editMessage(id: editingMessageId, message: info.text)
    } else {
        self.sendMessage(text: info.text, zoneId: info.zoneId, chatType: info.chatType)
    }
}

변경점

  1. struct로 구성된 1개의 파라미터를 받는 것으로 변경하였다.
  2. 인자를 전달받는 순수 함수 형태로 수정하였다.
  3. 용어를 edit으로 통일하였다. (edit이 주로 텍스트를 수정하는 데에 쓰이고, modify는 좀 더 넓게 사용할 수 있으므로 여기에서는 edit이 보다 적절한다고 생각한다.)

회고

이 코드는 실제로 현업에서 hotfix로 대응했던 코드이다.
클래스 변수를 이용하는 api를 호출하는 코드와 그 클래스 변수를 수정하는 데에서 시간적인 결합이 일어났고 간헐적인 NP에러가 발생하였다.
코드가 당연히 위에서 아래로 동기적으로 일어날 것으로 생각하는 초보적인 실수였다. 안전하게 되도록 순수 함수 프로그래밍을 하자!

profile
iOS 개발

0개의 댓글