각 언어에서는 코딩 컨벤션이 있습니다.
코딩 컨벤션이 있는 이유는 뭘까요? 제 생각엔 그 언어를 사용하는 개발자들 끼리 서로 코드를 볼 때
같은 규칙을 사용한다면 더 익숙하고 읽기 쉽기 때문에 규칙을 정한 것 같습니다. 🧐
그래서 공동체마다 사용하는 네이밍 컨벤션이 따로 있을 수도 있습니다.
그럼 일단 제일 기본형인 apple의 swift api design을 보겠습니다.
Fundamentals (기반)
- 사용하는 시점에 분명한 것이 가장 중요한 목표입니다.
- 분명한 것이 간결한 것보다 더 중요합니다.**
- 문서화 주석 (documentation comment)1은모든 선언마다 작성합니다. (문서화주석 -> ///)
- 문서화 주석 다는법
- 요약에 집중합니다.
- 단일 문장 구절을 가능한 사용하고, 마침표로 끝냅니다. 완전한 문장은 사용하지 않습니다.
- 함수 및 메소드는 무엇을 하는지와 무엇을 반환하는지 설명하고, 널효과와 Void 반환은 생략합니다.
- 그외 선언들은 선언한 개체가 무엇인지 설명합니다. (초기자, 첨자연산 제외 ㅎ...)
ex)
/// Returns a "view" of `self` containing the same elements in
/// reverse order.
/// 같은 원소를 순서만 거꾸로 하여 담고 있는 `self` 의 "view" 를 반환함.
func reversed() -> ReverseCollection
//그 외 선언한 개체!
/// A collection that supports equally efficient insertion/removal
/// at any position.
/// 어떤 위치에서도 똑같이 효율적인 삽입/제거를 지원하는 컬렉션.
struct List {
/// The element at the beginning of `self`, or `nil` if self is
/// empty.
/// `self` 의 맨 처음 위치에 있는 원소, 또는 `self` 가 비었을 경우 `nil`.
var first: Element?
...
Naming (이름짓기)
Promote Clear Usage (명확한 사용법 추구하기)
- 변수, 매개 변수, 및 결합된 타입은 그 역할에 따라 이름을 지으며,타입 구속 조건으로 짓지 않도록합니다.
- 메소드와 함수 이름은 사용할 때 문법에 맞는 영어 구절이 되도록 만드는 것이 좋습니다.
ex)
// 잘못된 예제
var string = "Hello"
// 좋은 예제
var greeting = "Hello"
// 좋은 예제
x.insert(y, at: z) // “x 는, y 를 z 위치에 집어 넣습니다”
x.subViews(havingColor: y) // “x 의 하위 뷰는 y 라는 색상을 가집니다”
x.capitalizingNouns() // “x 는 명사를 대문자로 만듭니다”
// 잘못된 예제
x.insert(y, position: z)
x.subViews(color: y)
x.nounCapitalize()
솔직히 너무 광범위한 얘기라서 어떻게 어디에 적용해야 될지 너무 막막한 느낌..
범위를 조금 좁혀서 조금씩 알아가면서 적용해보자.. ㅠㅠ
클래스 및 구조체 네이밍
- UpperCamelCase : CubeManager
- 접두사 X : not(접두사) + agree = disagree(X)
UpperCamelCase :
struct CubeManager {
}
class Product {
}
변수 네이밍
- lowerCamelCase
- Bool 변수 :
불리언 메소드와 불리언 속성을 사용할 때 받는 쪽에서 ‘단언문 (assertions)’ 으로 읽혀지도록 합니다
단언문 (assertions)이란?
프로그램에서 변수가 원하는 값을 가지고 있는지 확인하는 코드를 의미하는 문장
ex)
canBecomeFirstResponder |
shouldRefresh //새로고침하는가 |
isSelected //선택되었는가? |
isHidden //안보이는가? |
자주 사용하는 네이밍
is+명사 | ~가 명사인가? | isNum 숫자인가 |
is+현재진행형(ing) | ~가 지속되고있는 중인가? | isEditing 편집중인가 |
is+형용사 | 형용사 되어졌나? | isSelected 선택되었나 |
조동사+동사원형 | ~를 할수 있는가? 해야하는가? | shouldRefresh 새로고침 해야되나 |
has+명사 | ~를 가지고 있나? | hasVideo 비디오 가지고있나 |
has+과거분사(ed) | ~가 유지되고 있는 중인가? | hasConnected |
함수와 메소드 네이밍
부작용에 따라서 이름 지을 것!! 근데 그전에 알아야할 것들을 알아보자
Swift는 함수형 프로그래밍 언어이다. 함수형 프로그래밍 이란?
순수함수를 만들고 조합하여 부작용을 피해 프로그램을 작성하는 방법이다. 또한 동작에 집중하는 명령방식이 아니라
무엇을 처리할 것인가에 대해 집중하는 선언형 프로그래밍 방식이다.
부작용의 유무는 이렇게 판단할 수 있다.
- 외부 값 변경이 있는가? 변경이 없다면? 2번도 확인
- 같은 인자를 넣어 줬을 때 항상 결과가 같은가? ex) random함수는 항상 결과가 다르므로 부작용이 있는 함수다.
부작용이 없는 경우
-
명사구로 읽히도록 한다. 예를들면 x.distance(to: y), i.successor()
부작용이 있을 경우
-
명령형 동사구로 읽히도록 한다. 예를들면 print(t), x.sort(), x.append(y)
근데 솔직히 이렇게 문서로만 읽으니까 잘모르겠다. 😭😭😭 문서를 한번 보고 잘 지켜진 코드를 보는게 네이밍 짓는데에 훨씬 도움 될 것 같다. 네이밍이 몇 일 공부한다고 되는 것은 아닌 것 같다..
밑에 스타일쉐어의 컨벤션 깃주소를 적어놨는데 두고두고 참고해야겠다. 한글로 되어 있는것이 참 좋음 ㅋㅋ 🥰
변경하는/변경하지 않는 메소드 쌍의 이름은일관성이 있어야 합니다.
- 연산을동사로 설명하는 것이 자연스러울때
Mutating (변경 메소드) Nonmutating(미변경 메소드)
x.sort() | z = x.sorted() //정렬된 x 명사구! |
x.append(y) | z = x.appending(y) |
- 연산을명사로 설명하는 것이 자연스러울때
Mutating (변경 메소드) Nonmutating(미변경 메소드)
x.formUnion | z = x.union |
c.formSuccessor(i) | j = c.Successor(&i) |
클린코딩이란?
1. 함수를 쪼개 20줄 내 작성
2. 모든 코드의 들여쓰기는 최대 3단계로 구현
func hello() {
for _ in 0...3 { //1단계
for _ in 0...3 { //2단계
print("안녕") //3단계
}
}
}
참고 :xho95.github.io/swift/language/grammar/revision/history/2020/10/08/API-Design-Guidelines.html
Swift: API Design Guidelines (API 설계 지침)
‘값 보존 타입 변환 (value preserving type conversion)’ 을 하는 초기자에서, 첫 번째의 인자 이름표는 생략합니다, 가령 Int64(someUInt32) 처럼 합니다. 하지만, (범위를) “좁히는 (narrowing)” 타입 변환의
xho95.github.io
참고 :github.com/StyleShare/swift-style-guide#%EB%B3%80%EC%88%98
StyleShare/swift-style-guide
StyleShare에서 작성한 Swift 한국어 스타일 가이드. Contribute to StyleShare/swift-style-guide development by creating an account on GitHub.
github.com
'IOS Swift' 카테고리의 다른 글
Hashable 이란? - Swift (2) | 2021.08.24 |
---|---|
Tuple이란? - Swift (0) | 2021.08.17 |
Frame과 Bounds의 차이 (4) | 2021.08.03 |
Git branch 생성하기 (0) | 2020.12.09 |
Big Sur 업그레이드 후 터미널에서 git 사용 에러(invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun) (0) | 2020.11.22 |