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 내부의 값을 변경시킨다 ->
mutatingx 내부의 값을 변경시키지 않고 새로운 결과값을 반환한다 ->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
Last updated