Swift API Design Guidelines

이 글의 번역본입니다. 제가 개발하면서 중간중간 참고하려고 적은 글이라 문서 전체가 번역되어있지는 않습니다. 예제는 공식문서의 것도 있고, 개인적으로 틈틈히 찾아서 추가도 하고 있습니다.

Fundamentals(기본 개념)

  • 사용 시점에서의 명료성은 가장 중요한 목표입니다.

  • 명료성은 간결성보다 더 중요합니다.

  • 모든 선언문에 문서화 주석을 작성하세요.(개인별로 의견이 다를 수 있을 것 같네요.)

**만약 당신이 당신의 API의 기능을 간단한 용어로 설명하지 못한다면, 당신은 잘못된 API 설계했을 수 있습니다. **

Naming(네이밍)

Promote Clear Usage(분명한 사용을 촉진하세요)

1. 필요한 단어들을 모두 포함해주세요.

⭕️ Good

extension List {
  public mutating func remove(at position: Index) -> Element
}
employees.remove(at: x) // at이 있어서 employees라는 List의 x번째를 제거하라는 것이 명확함.

Bad

2. 불필요한 단어를 생략하세요.

⭕️ Good

Bad

3. 타입대신 역할에 따라 변수, 파라미터, 연관타입을 네이밍하세요.

⭕️ Good

Bad

⭕️ Good

Bad

⭕️ Good

Bad

Exception

4. 파라미터의 역할을 드러내기 위해 타입의 정보를 보충하세요.

⭕️ Good

Bad

Strive for Fluent Usage(능숙한 사용을 위해 노력하세요)

1. 메소드 및 함수이름을 영어 문법에 맞는 형태로 사용하는 것을 선호하세요. 메소드 및 함수를 사용했을 때, 영어 문장처럼 사용되면 좋은 네이밍입니다.

⭕️ Good

Bad

Exception

2. factory method의 시작은 "make"로 시작합니다.

3. initalizer 및 factory method 호출에 대한 첫 번째 Argument는 영어 구절을 구성하지 마세요.

⭕️ Good

Bad

4. side-effect를 고려해서 function과 method의 네이밍을 하세요. side-effect가 없는 것은 명사로, 있는 것은 동사로 읽혀야 합니다. mutating / nonmutating method 의 네이밍을 일관성있게 작성해야 합니다. operation이 동사로 설명되는 경우 mutation에는 동사의 명령형을, nonmutating에는 "ed", "ing"를 접미사로 붙여서 사용합니다.

x 내부의 값을 변경시킨다 -> mutating x 내부의 값을 변경시키지 않고 새로운 결과값을 반환한다 -> nonmutating

Mutating
NonMutating

x.sort()

z = x.sorted()

x.append(y)

z = x.appending(y)

⭕️ Good

5. nunmutating인 Bool타입 메소드&속성은 receiver에 대한 주장으로 읽혀야 합니다.

⭕️ Good

6. 능력을 설명하는 프로토콜은 -able, -ible, -ing 를 사용한 접미사로 네이밍 되어야 합니다.

⭕️ Good

7. 나머지 types, properties, variables, constants는 명사로 읽혀야 합니다. 1~6 번에 포함되지 않는 애들은 명사로 읽혀야 합니다.

Use Terminology Well(전문용어를 잘 사용하세요)

Term of Art : 명사, 특정 분야 또는 직업 내에서 정확하고 전문화된 의미를 갖는 단어 또는 구.

만약 더 일반적인 단어인 "피부skin"가 의미를 더 잘 전달한다면. "표피epidermis"를 사용하지 마세요.

전문용어를 사용한다면 명확히 확립된 의미를 사용하세요.

  • 일반적인 단어보다 전문 용어를 사용하는 유일한 이유는 모호하거나 불분명한 것을 정확하게 표현하기 때문입니다.

  • 전문가를 놀라게 하지 마세요 : 우리가 전문 용어에 새로운 의미를 부여하면 그 용어에 익숙한 전문가들은 놀랄 수 있습니다.

  • 초보자를 혼란스럽게 하지 마세요 : 그 전문 용어를 배우려는 사람은 아마 웹서치를 할 것입니다. 그 전문 용어를 웹서치했을 때 전통적인 의미와 사용된 전문 용어의 의미가 다르다면 초보자는 혼란스러울 수 있습니다.

약어(줄임말, abbreviations)을 피하세요. 정형화 되어 있지 않은 약어를 이해하려면, 다시 풀어서 해석해야하기 때문에 전문 용어(terms of art, 아는 사람만 아는 것)라고 볼 수 있다.

사용하는 약어에 의도된 의미는 웹 사이트에서 쉽게 찾을 수 있습니다.

- 관례를 받아들이세요. 초보자를 위해 기존 문화와 다른 언어를 사용하면서까지 배려하지 마세요.

연속된 데이터 구조를 표현할 때, 비록 초심자가 List 를 쉽게 이해한다고 해도 List보다 Array로 용어를 사용하는게 낫습니다. Array는 현대 컴퓨팅의 기초기 때문에 모든 프로그래머들이 알고 있거나 곧 알게될 것입니다. 대부분의 프로그래머가 친숙한 용어를 사용하세요. 그러면 그들이 웹 검색이나 질문을 할 때 답변을 찾을 수 있을 것 입니다.

수학같은 특정 프로그래밍 도메인에서, sin(x) 같이 광범위하게 사용되는 용어는 그대로 사용하는 것이 verticalPositionOnUnitCircleAtOriginOfEndOfRadiusWithAngle(x) 같은 네이밍보다 낫습니다. 이 경우 약어를 피하는 것 보다 관례를 따르는 것에 더 가중치가 있다는 것에 주목하세요. 비록 온전한 단어는 sine이지만 sin(x)는 프로그래머들에게 수십년간, 수학자들에게는 수세기 동안 보편적으로 사용되어 왔습니다.

Conventions(관례)

General Conventions(일반적인 관례)

1. 연산 프로퍼티의 복잡도가 O(1)이 아니라면 복잡도를 주석으로 남겨주세요.

⭕️ Good

**2. global function 대신에 method와 property를 사용하세요. **

⭕️ Good

3. UpperCamelCase, lowerCamelCase를 따르세요.

type, protocol의 이름은 UpperCamelCase, 나머지는 lowerCamelCase를 따릅니다.

Exception

4. 기본 뜻이 같거나 구별되는 서로 구별되는 도메인에서 작동하는 method는 base name을 동일하게 사용할 수 있습니다.

⭕️ Good

⭕️ Good

Bad

Bad

Parameters(매개변수)

1. 주석을 읽기 쉽게 만들어주는 매개변수 이름을 선택하세요.

⭕️ Good

Bad

2. 일반적인 사용을 단순화 할 때, defaulted parameter를 사용하세요.

⭕️ Good

Bad

3. defaulted parameters는 매개변수 리스트의 끝부분에 두는 것이 좋습니다.

⭕️ Good

Bad

Argument Labels(인자 레이블)

1. Argument Label을 사용했음에도 유용하게 구분되지 않는다면, 모든 Argument Labels을 생략하세요.

⭕️ Good

2. 값을 유지하면서 타입 변환을 해주는 initializer에서, 첫 번째 Argument Label을 생략하세요.

  • 첫번째 argument는 항상 **source of convesion(변환의 근원)**이어야 합니다.

⭕️ Good

  • 값의 범위가 좁혀지는 타입 변환의 경우, label을 붙여서 설명하는 것을 추천합니다.

⭕️ Good

3. 첫 번째 Argument label은 일반적으로 전치사구로 시작합니다.

⭕️ Good

Exception

4. 만약 첫번째 Argument가 문법적 구절을 만든다면 Argument label은 제거하고, 함수 이름에 base name을 추가합니다.

⭕️ Good

⭕️ Good

Bad

Bad

5. 그 외의 모든 경우에, Argument Label을 붙여야 합니다.

default value를 가진 argument는 생략될 수 있으며, 이 경우 문법 구문의 일부를 형성하지 않으므로 항상 레이블이 있어야 합니다.

Special Instructions(특별 지침)

1. tuple members와 closure parameters에 label을 지정하세요.

⭕️ Good

2. overload set에서의 모호함을 피하기 위해, 제약 없는 다형성에 각별히 주의하세요.

⭕️ Good

Reference

https://www.swift.org/documentation/api-design-guidelines/

Last updated