본문 바로가기

야곰커리어캠프_TIL

20200213 / D8 / 함수명 지을때 명사로..?

- Reference

- https://blog.naver.com/yysdntjq/222310877579
- https://www.swift.org/documentation/api-design-guidelines/

 

Swift.org

Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.

www.swift.org

 

오늘 조금 충격적인 사실을 알게되었다. 

가이드라인에 함수명은 동사로 시작한다는 말이있는데 대부분 잘 알것이다. 그런데 API 디자인 가이드라인에 보면 아래와 같은 내용이 나온다.

 

사이드 이펙(Side Effect)이 없는 함수는 명사구로 읽어야한다고 나온다.

 

사이드 이펙(Side Effect)이란 무엇인가?

사이드 이펙(Side Effect)이란 사전적인 의미로는 '원래의 목적과 다르게 다른효과 또는 부작용'의 상태를 말하는 표현이다.  그러니깐 구현하고자 하는 함수가 내부의 로직으로 인해 값이 바뀌어 호출이 되는 경우가 있으면 사이드 이펙(Side Effect)이 있다고 말하고 없으면 사이드 이펙(Side Effect)이 없다고 말한다.

 

랜덤함수를 생성하여 배열로 반환하는 메서드이다.

[Side Effect 없는 함수

func generatedRandomNumbers(range: ClosedRange<Int> = 1...9, numbersCount: Int = 3) -> [Int] {
    var randomNumbers: Set<Int> = []
    while randomNumbers.count < numbersCount {
        randomNumbers.insert(Int.random(in: range))
    }
    return Array(randomNumbers)
}
let randomNumbers = generatedRandomNumbers()

이는 사이드 이펙이 존재하지않다. 왜냐하면 매개변수의 기본값의 범위도 정해져있고 카운드 개수도 정해져있기때문에 외부의 건드림도 없으며 값을 예상해볼 수 있다는것이다. 그래서 이와같은 경우에는 generatedRandomNumbers() 함수명으로 표현하는것이 정확하다는 것이다.

 

[Side Effect 있는 함수]

var range: ClosedRange<Int> = 1...9
var numbersCount: Int = 3

func generateRandomNumbers(_ range: ClosedRange<Int>,_ numbersCount: Int) -> [Int] {
    var randomNumbers: Set<Int> = []
    while randomNumbers.count < numbersCount {
        randomNumbers.insert(Int.random(in: range))
    }
    return Array(randomNumbers)
}
let randomNumbers = generateRandomNumers(range, numbersCount)

반면에 이케이스같은 경우에는 외부에서 전역변수를 함수 매개변수로 받아 결과를 출력하는 것이다. 상수가 아닌 변할 수 있는 숫자인 전역변수는 변할 수도 있는값이다. 현재 코드에서 단면적인 예시만들었지만 다른 함수들을 통해서 전역변수가 값이 바뀌기도한다면 그 전역변수들을 할당받는 randomNumbers의 상수는 늘 같은 결과를 예상할 수 있을까 ? [Side Effect 없는 함수] 와 달리 어떠한 값을 넣외부의 매개변수로 받는 범위와 수에 따라서 값이 바뀔 수 있는것이다.

 

적절한 예시를 들었는지는 잘모르겠지만,,, 그래도 이해할 수 있기를 바라고 이해가 안된다면 다른 Side Effect에 관한 구글자료들을 참고해보자.