Swift/Swift GuideLines

Swift GuideLines - 3.Naming-mutating/nonmutating

728x90

 

처음에 강의를 들었을 땐 무슨내용인가 했는데 mutation/ nonmutation에 따라 이름을 다르게 작성해야한다는 규칙이 있을 줄을 몰랐다.

값복사인지 참조복사인지에 따라 동사, 명사, 접미사, 접두사를 붙이라는데 외우고 싶진않다...

코드를 작성할 때 이 글을 보면서 익숙해지지 않는이상 쓰기 힘들 것 같다.

부수효과(side-effect)를 기반해서 function과 method의 네이밍을 하세요.

  • side-effect가 없는 것은 명사로 읽혀야함. eg. x.distance(to: y), i.successor()
  • side-effect가 있는 것은 동사로 읽혀야 함. eg. print(x), x.sort(), x.append(y)
  • mutating/ nonmutating method의 이름을 일관성 있게 짓기. 주로 mutating method와 함께 비슷한 맥락의 nonmutating method도 만들어집니다. nonmutating method는 instance를 변경하지 않고 새로운 value를 return 합니다.
    • mutating이란 돌연변이라는 뜻인데, 변할 수 있는 변수,함수같은걸 말한다. var로 이해하면 편할 듯 싶다. (즉 메모리값을 변경안하고 내부의 값을 변경하는 것)
    • nonMutating은 그냥 let으로 이해하자. 변경 할 수 없고 변할경우 메모리를 새로 할당해서 넣어주는거다. (즉 메모리값을 새로 할당해서 새로 만드는 것)
  • mutating/ nonmutating method의 operation이 동사로 설명되는 경우
    • mutating에는 동사 명령형을 사용
    • nonmutating에는 “ed” 또는 “ing”를 접미사로 붙여서 사용
    Mutating NonMutating
    x.sort() z = x.sorted()
    x.append(y) z = x.appending(y)

예시 )

import Foundation

var unsortedArray: [Int] = [5, 1, 3, 2, 4]

unsortedArray.sorted() // [1,2,3,4,5] -> 새로운 배열
unsortedArray // [5, 1, 3, 2, 4] -> 변경되지 않음

// side-effect가 있는경우
unsortedArray.sort() // [1,2,3,4,5] -> 기존에 있는 얘를 변경함
unsortedArray // [1,2,3,4,5] -> 기존값이 변경되어있음

// side-effect가 있는경우
unsortedArray.append(100)

struct Distance {
    var value = 0
    // 외부의 값을 변경하지 않고 보내는 경우
    // side Effect가 없는 경우 명사로 읽혀야함
    func distance(to otherDistance: Distance) -> Int {
        return self.value - otherDistance.value
    }
}
  • mutating/ nonmutating method의 operation이 명사로 설명되는 경우
    • nonmutating에는 명사 사용
    • mutating에는 “form” 접두사를 사용
    NonMutating Mutating
    x = y.union y.formUnion(z)
    j = c.successor(i) c.formSuccessor(&i)
  • nonmutating인 Boolean method & properties는 receiver에 대한 주장으로 읽혀야합니다.
    • eg) x.isEmpty, line1.intersects(line2)
    • x가 비어있는가?, line1이 line2에 교차하는가?
  • 능력을 설명하는 프로토콜은 able, ible, ing를 사용한 접미사로 네이밍해야 합니다.
    • eg) Equatable, ProgressReporting
    • (1 == 2 가 같은지),
    • 접근 가능한 프로토콜일 경우 DBAccessable, DBControllable 이런 식으로 능력을 설명하는 프토토콜을 만들 수 있음
    protocol ProgressReporting {
    
    }
    
    extension ProgressReporting {
    	func reportProgerss {
       }
    }
    
  • 나머지 types, properties, variables, constants는 명사로 읽혀야 합니다.
반응형