Skip to content

Latest commit

Β 

History

History
166 lines (107 loc) Β· 8.8 KB

File metadata and controls

166 lines (107 loc) Β· 8.8 KB

API λ””μžμΈ κ°€μ΄λ“œλΌμΈ

1. κΈ°λ³Έκ°œλ…

  • μ‚¬μš©ν•  λ•Œ κΈ°μ€€μœΌλ‘œ λͺ…ν™•ν•˜κ²Œ μž‘μ„±ν•˜λŠ” 게 κ°€μž₯ μ€‘μš”ν•˜λ‹€. λ©”μ†Œλ“œλ‚˜ 속성과 같은 κ°œμ²΄λ“€μ€ ν•œ 번만 μ„ μ–Έν•˜κ³  반볡적으둜 μ‚¬μš©ν•œλ‹€. APIλ₯Ό λ§Œλ“€ λ•ŒλŠ” μ΄λŸ¬ν•œ κ°œμ²΄λ“€μ„ μ΄ν•΄ν•˜κΈ° 쉽고 κ°„κ²°ν•˜κ²Œ λ§Œλ“œλŠ”λ° 쀑점을 μ£Όκ³  μž‘μ„±ν•΄μ•Ό ν•œλ‹€. μ‚¬μš©ν•˜λŠ” μƒν™©μ—μ„œ λ¬Έλ§₯상 λͺ…ν™•ν•˜κ²Œ 이해도둝 ν•˜μž.

  • λͺ…ν™•ν•œ ν‘œν˜„μ΄ μ••μΆ•ν•œ 간결성보닀 더 μ€‘μš”ν•˜λ‹€. μŠ€μœ„ν”„νŠΈ μ½”λ“œλŠ” κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμ§€λ§Œ, 단지 κΈ€μžμˆ˜λ₯Ό μ€„μ—¬μ„œ κ°€μž₯ 짧은 μ½”λ“œλ₯Ό λ§Œλ“œλŠ” 게 λͺ©ν‘œλŠ” μ•„λ‹ˆλ‹€. μŠ€μœ„ν”„νŠΈ μ½”λ“œμ˜ 간결성은 μžμ—°μŠ€λŸ½κ²Œ 반볡적으둜 μž¬μ‚¬μš©ν•˜λŠ” μ½”λ“œ(boilerplate)λ₯Ό μ€„μ΄λŠ” κΈ°λŠ₯κ³Ό κ°•ν•œ νƒ€μž… μ‹œμŠ€ν…œμ˜ λΆ€μˆ˜νš¨κ³Όλ‘œ λ“œλŸ¬λ‚  뿐이닀.

  • λͺ¨λ“  μ„ μ–Έ 뢀뢄에 주석을 적극적으둜 μž‘μ„±ν•˜λΌ. λ¬Έμ„œλ₯Ό μž‘μ„±ν•˜λ©΄μ„œ μ–»λŠ” 톡찰λ ₯은 API 섀계에 큰 영ν–₯을 쀄 수 μžˆμœΌλ‹ˆ 미루지 말고 주석을 κΌ­ λ‹¬μž. κ°„λ‹¨ν•œ μš©μ–΄λ‘œ API κΈ°λŠ₯을 μ„€λͺ…ν•˜μ§€ λͺ»ν•œλ‹€λ©΄, μ„€κ³„μ˜ λ¬Έμ œκ°€ μžˆμ„ κ°€λŠ₯성이 λ†’λ‹€.


2. 이름 μ§“κΈ°(Naming)

λͺ…ν™•ν•œ μ‚¬μš©λ²• μ œμ‹œν•˜κΈ°

  • κ·Έ 이름을 μ‚¬μš©ν•˜λŠ” λΆ€λΆ„μ˜ μ½”λ“œλ₯Ό μ½λŠ” μ‚¬λžŒμ—κ²Œ ν˜Όλž€μ„ 쀄 수 μžˆλŠ” λ‹¨μ–΄λŠ” ν”Όν•œλ‹€.

  • λΆˆν•„μš”ν•œ λ‹¨μ–΄λŠ” μƒλž΅ν•œλ‹€.

    μ΄λ¦„μ˜ λͺ¨λ“  λ‹¨μ–΄λŠ” μ‚¬μš©μž κ΄€μ μ—μ„œ μ£Όμš”ν•œ 정보λ₯Ό μ œκ³΅ν•΄μ•Όλ§Œ ν•œλ‹€.

  • λ³€μˆ˜, λ§€κ°œλ³€μˆ˜, μ—°κ΄€ νƒ€μž…μ€ μ„ μ–Έν•œ νƒ€μž…μ΄λ‚˜ μ œμ•½μ‚¬ν•­ λ³΄λ‹€λŠ” 역할에 λ§žλŠ” 이름을 갖도둝 ν•œλ‹€.**

  • λ§€κ°œλ³€μˆ˜ 역할을 λͺ…ν™•ν•˜κ²Œ λ„£μ–΄μ„œ λΆ€μ‘±ν•œ νƒ€μž… 정보λ₯Ό λ³΄μ™„ν•œλ‹€.

λ§ν•˜λŠ” κ²ƒμ²˜λŸΌ 술술 써지도둝 μž‘μ„±ν•˜κΈ°

  • λ©”μ†Œλ“œλ‚˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  λ•Œ μ˜μ–΄ λ¬Έμž₯을 μž‘μ„±ν•˜λŠ” κ²ƒμ²˜λŸΌ λŠλΌλ„λ‘ μ œκ³΅ν•œλ‹€.

  • νŒ©ν† λ¦¬ λ©”μ†Œλ“œ 이름은 "make"둜 μ‹œμž‘ν•œλ‹€. 예) x.makeIterator()

  • μ΄ˆκΈ°ν™”(생성) λ©”μ†Œλ“œλ‚˜ νŒ©ν† λ¦¬ λ©”μ†Œλ“œλŠ” 첫 번째 μΈμžμ— 좔가적인 μ„€λͺ…을 ν¬ν•¨ν•˜μ§€ μ•Šλ„λ‘ ν•œλ‹€. 예) x.makeWidget(cogCount: 47)

  • ν•¨μˆ˜λ‚˜ λ©”μ†Œλ“œ 이름은 μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ(side-effects)에 따라 λ‹€λ₯΄κ²Œ μ •ν•œλ‹€

    • μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ μ—†λŠ” κ²½μš°λŠ” λͺ…μ‚¬ν˜•μœΌλ‘œ μž‘μ„±ν•œλ‹€. 예) x.distance(to: y), i.successor().

    • μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ μžˆλŠ” κ²½μš°μ—λŠ” λͺ…λ Ήν˜• λ™μ‚¬λ‘œ μž‘μ„±ν•œλ‹€. 예) print(x), x.sort(), x.append(y).

    • κ°€λ³€/λΆˆλ³€ λ©”μ†Œλ“œ 이름을 ν•¨κ»˜ κ³ λ €ν•΄μ•Ό ν•œλ‹€.

    • λ™μ‚¬λ‘œ ν‘œν˜„ν•˜λ©΄ μžμ—°μŠ€λŸ½κ²Œ "ed"λ‚˜ "ing"λ₯Ό λΆ™μ—¬μ„œ λΆˆλ³€ λ©”μ†Œλ“œ 이름을 λ§Œλ“€ 수 μžˆλ‹€.

    κ°€λ³€(Mutating) x.sort(), x.append(y)

    λΆˆλ³€(Nonmutating) z = x.sorted(), z = x.appending(y)

    • λ™μž‘μ„ λͺ…μ‚¬λ‘œ ν‘œν˜„ν•˜κΈ° μ ν•©ν•œ κ²½μš°μ—λŠ” κ°€λ³€ λ©”μ†Œλ“œ 이름에 "form-"을 머릿말둜 뢙인닀.

    λΆˆλ³€ x = y.union(z), j = c.successor(i)

    κ°€λ³€ y.formUnion(z), c.formSuccessor(&i)

  • λΆˆλ³€μœΌλ‘œ μ‚¬μš©ν•  λ•Œ Boolean λ©”μ†Œλ“œλ‚˜ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” 리턴값을 λ°›μ•„μ„œ 단언 ꡬ문(Assertion)처럼 읽도둝 ν•œλ‹€. 예) x.isEmpty, line1.intersects(line2).

  • 무언가λ₯Ό μ„€λͺ…ν•˜λŠ” ν”„λ‘œν† μ½œμ€ λͺ…μ‚¬λ‘œ 읽어야 ν•œλ‹€. 예) Collection

  • κΈ°λŠ₯μ΄λ‚˜ κ°€λŠ₯성을 ν‘œν˜„ν•˜λŠ” ν”„λ‘œν† μ½œμ€ -able, -ible, -ing 등을 λΆ™μ—¬μ„œ ν‘œν˜„ν•œλ‹€. 예) Equatable, ProgressReporting.

  • κ·Έ 외에 μƒμˆ˜, λ³€μˆ˜, 속성, νƒ€μž…λ“€μ€ λͺ…μ‚¬λ‘œ 읽어야 ν•œλ‹€.

μš©μ–΄λ₯Ό 잘 ν‘œν˜„ν•˜κΈ°

  • μ• λ§€ν•œ μš©μ–΄λ₯Ό ν”Όν•œλ‹€. 'ν”ΌλΆ€(skin)'λ₯Ό 'ν‘œν”Ό(epidermis)'라고 ν•˜μ§€λ§κ³ , 더 μ‰½κ²Œ 의미λ₯Ό 전달할 수 μžˆλŠ” ν‘œν˜„μ΄ 있으면 κ·Έκ±Έ μ„ νƒν•˜λΌ. μ „λ¬Έ μš©μ–΄(Term of Art)λŠ” ν•„μˆ˜μ μΈ μ†Œν†΅ λ„κ΅¬μ§€λ§Œ, μ‚¬μš©ν•˜μ§€ μ•Šμ„ 경우 놓칠 수 μžˆλŠ” μ€‘μš”ν•œ 의미λ₯Ό κΌ­ ν‘œν˜„ν•΄μ•Ό ν•˜λŠ” 경우만 μ‚¬μš©ν•˜μ„Έμš”.

  • μ „λ¬Έ μš©μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ κΈ°μ‘΄ μ˜λ―Έμ— 맞좰 μ‚¬μš©ν•œλ‹€. 일반적인 μš©μ–΄κ°€ μ• λ§€ν•˜κ±°λ‚˜ 뢈λͺ…ν™•ν•œ 것을 μ •ν™•ν•˜κ²Œ ν‘œν˜„ν•˜κΈ° μœ„ν•΄μ„œλ§Œ 기술적인 μš©μ–΄λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

    • μ „λ¬Έκ°€λ₯Ό λ†€λΌκ²Œ ν•˜μ§€λ§ˆλΌ: 기쑴에 μΉœμˆ™ν•˜κ²Œ μ‚¬μš©ν•˜λ˜ μš©μ–΄μ— μ „ν˜€ μƒˆλ‘œμš΄ 의미λ₯Ό λΆ€μ—¬ν•œλ‹€λ©΄ 선배듀이 λ†€λΌκ±°λ‚˜ ν™”λ₯Ό 낼지도 λͺ¨λ₯Έλ‹€.
    • 초보자λ₯Ό ν—·κ°ˆλ¦¬κ²Œ ν•˜μ§€λ§ˆλΌ: μ›Ήμ—μ„œ μš©μ–΄λ₯Ό μ°Ύμ•„ κ³΅λΆ€ν•˜λŠ” μ‚¬λžŒλ“€μ—κ²Œλ„ μš©μ–΄μ˜ μ „ν˜•μ μΈ μ˜λ―Έκ°€ μ€‘μš”ν•˜λ‹€.
  • μΆ•μ•½μ–΄λ₯Ό ν”Όν•œλ‹€. μ „λ¬Έ μš©μ–΄λ©΄μ„œ ν‘œμ€€ ν˜•νƒœκ°€ μ•„λ‹Œ μ•½μžλŠ” 잘λͺ» ν’€μ–΄μ“°κ±°λ‚˜ μ˜€ν•΄λ₯Ό ν•  수 μžˆλ‹€.

  • μ„ λ‘€λ₯Ό 받아듀인닀. λͺ¨λ“  초보자λ₯Ό μœ„ν•΄ μš©μ–΄λ₯Ό 적지 말고 κΈ°μ‘΄ λ¬Έν™”μ—μ„œ μ“°μ΄λŠ” μš©μ–΄κ°€ μ ν•©ν•˜λ‹€.


3. κ·œμΉ™(Conventions)

✳️기본 λͺ…λͺ… κ·œμΉ™(μ€‘μš”)✳️

  • λ³€μˆ˜, μƒμˆ˜, ν•¨μˆ˜, λ©”μ„œλ“œ, νƒ€μž… λ“±μ˜ 이름은 μœ λ‹ˆμ½”λ“œμ—μ„œ μ§€μ›ν•˜λŠ” μ–΄λ–€ 문자(ν•œκΈ€, ν•œμž, 영문, 숫자, 이λͺ¨ν‹°μ½˜ λ“±)라도 μ‚¬μš©ν•  수 μžˆλ‹€.

    λ‹€λ§Œ λ‹€μŒκ³Ό 같은 μ˜ˆμ™Έ κ²½μš°λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

    • μŠ€μœ„ν”„νŠΈμ—μ„œ 미리 μ •ν•œ μ˜ˆμ•½μ–΄ λ˜λŠ” ν‚€μ›Œλ“œ
    • ν•΄λ‹Ή μ½”λ“œ λ²”μœ„ λ‚΄μ—μ„œ 미리 μ‚¬μš©λ˜λŠ” κΈ°μ‘΄ 이름과 λ™μΌν•œ 이름
    • μ—°μ‚°μžλ‘œ μ‚¬μš©λ  수 μžˆλŠ” 기호(+,-,*,/)
    • 숫자둜 μ‹œμž‘ν•˜λŠ” 이름
    • 곡백이 ν¬ν•¨λœ 이름
  • λŒ€μ†Œλ¬Έμž ν‘œκΈ°λ²•μ„ λ”°λ₯Έλ‹€.

    1. ν•¨μˆ˜, λ©”μ„œλ“œ, μΈμŠ€ν„΄μŠ€ 이름은 첫 κΈ€μžλ₯Ό μ†Œλ¬Έμžλ‘œ μ‚¬μš©ν•˜λŠ” LowerCamelCaseλ₯Ό μ‚¬μš©ν•œλ‹€.
    2. 클래슀, ꡬ쑰체, μ΅μŠ€ν…μ…˜, ν”„λ‘œν† μ½œ, μ—΄κ±°ν˜•(enum) 이름은 νƒ€μž…μ˜ 이름이기 λ•Œλ¬Έμ— 첫 κΈ€μžλ₯Ό λŒ€λ¬Έμžλ‘œ μ‚¬μš©ν•˜λŠ” UpperCamelCase둜 ν‘œκΈ°ν•œλ‹€.
    3. λͺ…λ Ή ꡬ문 뒀에 μ„Έλ―Έμ½œλ‘ (;)을 λΆ™μ΄λŠ” 것은 선택 사항이닀. (But, ꡳ이 뢙이지 말 것)
    4. λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λΆ„ν•˜λ―€λ‘œ μœ μ˜ν•œλ‹€. (Var와 varλ₯Ό λ‹€λ₯΄κ²Œ 인식함.)
  • O(1) λ³΅μž‘λ„κ°€ μ•„λ‹Œ μ—°μ‚° ν”„λ‘œνΌν‹°(Computed Property)λŠ” μ„€λͺ…을 λ§Œλ“ λ‹€. λŒ€λΆ€λΆ„ μ‚¬λžŒλ“€μ€ μ €μž₯ ν”„λ‘œνΌν‹°μ— μ΅μˆ™ν•΄μ„œ ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μƒκ°ν•˜λŠ”λ°, 생각이 μ–΄κΈ‹λ‚  수 μžˆμ„ λ•Œ κ²½κ³ ν•΄μ•Ό ν•œλ‹€.

  • μ†Œμ†μ΄ μ—†λŠ” 자유둜운 ν•¨μˆ˜λ₯Ό λ§Œλ“€κΈ° λ³΄λ‹€λŠ” λ©”μ†Œλ“œλ‚˜ 속성을 λ§Œλ“ λ‹€. λ‹€μŒμ˜ νŠΉλ³„ν•œ κ²½μš°μ—λ§Œ ν•¨μˆ˜λ₯Ό κ³ λ €ν•˜λΌ.

    1. λͺ…ν™•ν•˜κ²Œ selfκ°€ 없을 λ•Œ : min(x,y,z)
    2. μ œμ•½μ—†λŠ” μ œλ„€λ¦­ ν•¨μˆ˜μΈ 경우 : print(x)
    3. ν•¨μˆ˜ ν‘œν˜„μ΄ νŠΉμ •ν•œ 도메인 ν‘œκΈ°λ²•μ„ μ€€μˆ˜ν•˜λŠ” 경우 : sin(x)
  • λ©”μ†Œλ“œκ°€ 같은 의미λ₯Ό κ°–κ³  μžˆκ±°λ‚˜ νŠΉμ •ν•œ 도메인 μ˜μ—­μ—μ„œλ§Œ λ™μž‘μ„ ν•˜λŠ” κ²½μš°μ—λŠ” κΈ°λ³Έ 이름을 κ³΅μœ ν•  수 μžˆλ‹€.

맀개 λ³€μˆ˜

func move(from start: Point, to end: Point)

  • λ¬Έμ„œν™” ν•  수 μžˆλŠ” 맀개 λ³€μˆ˜ 이름을 μ„ νƒν•œλ‹€. ν•¨μˆ˜λ‚˜ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ λ§€κ°œλ³€μˆ˜κ°€ κ°μΆ°μ Έμžˆλ”λΌλ„ μ—¬μ „νžˆ μ€‘μš”ν•œ 역할을 ν•œλ‹€.

  • λ§€κ°œλ³€μˆ˜ 기본값을 μ§€μ •ν•΄μ„œ νŽΈλ¦¬ν•¨μ„ λ”ν•œλ‹€. 맀개 λ³€μˆ˜μ— ν”νžˆ λ„˜κΈ°λŠ” κ°’ 자체λ₯Ό κΈ°λ³Έκ°’μœΌλ‘œ ν™œμš©ν•˜λΌ.

  • κΈ°λ³Έ μΈμžκ°’μ€ 맀개 λ³€μˆ˜ λͺ©λ‘μ—μ„œ λ§ˆμ§€λ§‰ μœ„μΉ˜λΆ€ν„° λ„£λŠ”λ‹€. κΈ°λ³Έ μΈμžκ°’μ΄ μ—†λŠ” λ§€κ°œλ³€μˆ˜λŠ” λ©”μ†Œλ“œμ—μ„œ 더 μ€‘μš”ν•œ 역할을 ν•˜κ³ , λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜λŠ” κ³³μ—μ„œ μ•ˆμ •μ μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λŠ” ν˜•νƒœλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

인자 λ ˆμ΄λΈ”

func move(from start: Point, to end: Point) x.move(from: x, to: y)

  • λ ˆμ΄λΈ”μ΄ μΈμžκ°’μ„ κ΅¬λΆ„ν•˜λŠ”λ° 도움이 μ•ˆλ˜λ©΄ λͺ¨λ“  λ ˆμ΄λΈ”μ„ μƒλž΅ν•œλ‹€. 예) min(number1, number2), zip(sequence1, sequence2)

  • μ΄ˆκΈ°ν™” 생성 ν•¨μˆ˜(μ΄λ‹ˆμ…œλΌμ΄μ €)μ—μ„œ λ‹€λ₯Έ νƒ€μž… 값을 λ°›μ•„μ„œ λ³€ν™˜ν•˜κ³  λ³΄κ΄€ν•˜λŠ” (값보쑴 λ³€ν™˜) κ²½μš°μ—λŠ” 첫 번째 인자 λ ˆμ΄λΈ”μ„ μƒλž΅ν•œλ‹€. 예) Int64(someUInt32)

  • 첫 번째 μΈμžκ°’μ΄ (μ˜μ–΄μ—μ„œ) μ „μΉ˜μ‚¬ ν˜•νƒœλΌλ©΄ μΈμžκ°’ λ ˆμ΄λΈ”μ„ ν‘œκΈ°ν•œλ‹€.

  • 첫 번째 μΈμžκ°’μ΄ (μ „μΉ˜μ‚¬κ°€ μ•„λ‹ˆλΌ) λ‹€λ₯Έ λ¬Έλ²•μƒμ˜ ꡬ문이라면 λ ˆμ΄λΈ”μ€ μƒλž΅ν•˜κ³ , x.addSubview(y)처럼 κΈ°λ³Έ 이름에 μ˜λ―ΈμžˆλŠ” 단어λ₯Ό 뒀에 뢙여도 λœλ‹€.

  • κ·Έ 외에 λͺ¨λ“  κ²½μš°λŠ” λ ˆμ΄λΈ”μ„ ν‘œκΈ°ν•˜λΌ.


4. νŠΉλ³„ μ§€μΉ¨

  • νŠœν”Œ 멀버에 λ ˆμ΄λΈ”μ„, ν΄λ‘œμ € λ§€κ°œλ³€μˆ˜μ— 이름을 ν‘œκΈ°ν•˜λΌ.

  • Anyλ‚˜ AnyObject, μ œμ•½μ—†λŠ” μ œλ„€λ¦­ λ§€κ°œλ³€μˆ˜μ²˜λŸΌ μ œμ•½μ—†λŠ” λ‹€ν˜•μ„±(polymorphism)은 μ˜€λ²„λ‘œλ“œν•  λ•Œ ν˜Όλ™ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜λΌ.



참고 자료

API Design Guidelines

Introduction to Coding Guidelines for Cocoa

μŠ€μœ„ν”„νŠΈ API κ°€μ΄λ“œλΌμΈ