Integer types refactoring guidelines - minsuk-jang/teamproject GitHub Wiki

μ†Œκ°œ

λ§Žμ€ λ‹€λ₯Έ μž‘μ—…μ—μ„œ μ •μˆ˜ μœ ν˜•μ„ refactoring ν•˜λŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€ :

  • λΆ€ν˜Έκ°€ μžˆκ±°λ‚˜ λΆ€ν˜Έμ—†λŠ” μœ ν˜•κ³Ό μ•”μ‹œμ  λ³€ν™˜μ΄ ν˜Όν•©λ˜μ–΄ 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν•˜μ‹­μ‹œμ˜€.
  • μ μ ˆν•œ 경우 크기 의미λ₯Ό κ°•μ‘°ν•©λ‹ˆλ‹€.
  • ν˜•λ³€ν™˜ ν•  ν•„μš”μ—†μ΄ `size_t '값을 λ°˜ν™˜ν•˜λŠ” μ‹œμŠ€ν…œ ν•¨μˆ˜λ₯Ό μ€€μˆ˜ν•©λ‹ˆλ‹€.
  • μš°λ¦¬κ°€ μ‘°μž‘ ν•  수 μžˆλŠ” κ²ƒλ“€μ˜ 크기에 λΆˆν•„μš”ν•œ μ œν•œμ΄ λΆ€κ³Όλ˜μ§€ μ•Šλ„λ‘ ν•˜μ‹­μ‹œμ˜€.
  • λͺ…μ‹œμ  ν˜•λ³€ν™˜μœΌλ‘œ 인해 데이터가 잘릴 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 기타.

μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ refactoring을 μ–΄λ–»κ²Œ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€μ— λ™μ˜ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. ν•˜λ‚˜ :

  • μ™„μ „νžˆ μ˜³λ‹€λŠ” ν•˜λŠ” 것은 μ–΄λ €μš΄ μΌμž…λ‹ˆλ‹€. λͺ¨λ“  κ°€λŠ₯ν•œ 상황에 λŒ€ν•΄ κ΅³κ±΄ν•œ κ·œμΉ™ 집합은 μ–΄μšΈλ¦¬μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 이 지침은 μƒˆλ‘œμš΄ μ‚¬λžŒλ“€μ΄ μ΄λŸ¬ν•œ λ¬Έμ œμ— 직면 ν•  수 μžˆλ„λ‘ 돕고 더 λ§Žμ€ κ²½ν—˜μ΄μžˆλŠ” μ‚¬λžŒλ“€μ΄ μ½”λ“œκ°€ λ™μ§ˆν™”λ˜λ„λ‘ ν•©μ˜λ₯Ό λ„μΆœν•˜κΈ°μœ„ν•œ 원칙을 μˆ˜λ¦½ν•˜λŠ” κΈ°λ³Έ 틀이 될 κ²ƒμž…λ‹ˆλ‹€.
  • 더 이상 μƒκ°ν•˜μ§€ μ•Šκ³  μ μš©ν•˜λŠ” 것과 같은 일련의 기계적인 κ·œμΉ™μ΄ 될 μ˜λ„λŠ” μ—†μŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  νŠΉμ • μ‚¬λ‘€λŠ” 쑰치λ₯Ό μ·¨ν•˜κΈ° 전에 μ‹ μ€‘ν•˜κ²Œ 뢄석해야 ν•©λ‹ˆλ‹€.

즉, 쑰언은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

long μœ ν˜•

  • size_t의 의미λ₯Ό μ§€λ‹Œ long_u
  • uint64_t의 μ˜λ―Έκ°€ μ—†λŠ” long_u
  • long의 의미:
    • κ°„νŽΈν•œ μ „ν™˜μ„ μ‰½κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. --> size_t
      (일반적인 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 문제λ₯Ό ν™•μΈν•˜μ‹­μ‹œμ˜€.)
    • λΆ€ν˜Έκ°€ μžˆλŠ” λ³€ν™˜μ΄ μ–΄λ ΅λ‹€. --> ssize
      (예λ₯Ό λ“€μ–΄, λΉΌκΈ°κ°€ 포함 된 λ³΅μž‘ν•œ μ½”λ“œ)
      μ°Έκ³  :ssizeλŠ” src / nvim / types.h에 μ •μ˜λœ ν”„λ‘œμ νŠΈ μ°¨μ›μ˜ typedefμž…λ‹ˆλ‹€.
  • 크기 μ˜λ―Έμ—†λŠ” long --> int64_t

Int μœ ν˜•

  • 크기 의미λ₯Ό κ°–λŠ” int:
    • κ°„νŽΈν•œ μ „ν™˜μ„ μ‰½κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. --> size_t
      (일반적인 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 문제λ₯Ό ν™•μΈν•˜μ‹­μ‹œμ˜€.)
    • λΆ€ν˜Έκ°€ μžˆλŠ” λ³€ν™˜μ΄ μ–΄λ ΅λ‹€. --> ssize
      (예λ₯Ό λ“€μ–΄, λΉΌκΈ°κ°€ 포함 된 λ³΅μž‘ν•œ μ½”λ“œ)
  • 크기 μ˜λ―Έμ—†λŠ” int --> int

νŠΉλ³„ν•œ μΌ€μ΄μŠ€

μœ„μ˜ 일반적인 쑰언에도 λΆˆκ΅¬ν•˜κ³  더 μ—„κ²©ν•œ 타이핑을 μ„ ν˜Έν•˜λŠ” κ²½μš°κ°€ μžˆμŠ΅λ‹ˆλ‹€.

ꡬ쑰체 ν•„λ“œ

κ°€λŠ₯ν•œ 경우 ꡬ쑰체λ₯Ό μž‘κ²Œ μœ μ§€ν•΄μ•Όν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰κΉŒμ§€:

  • κ°€λŠ₯ν•œ 경우 κ³ μ • λ„ˆλΉ„ μœ ν˜• (int32_t,uint32_t λ“±)을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 이것은:
  • μ§€μ •λœ λ„ˆλΉ„κ°€ 항상 μΆ©λΆ„ν•˜λ‹€λŠ” 것을 ν™•μ‹  ν•  수 μžˆλŠ” κ²½μš°μ—λ§Œ μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€. κ·Έλž˜μ„œ:
  • ν•„λ“œμ— μž„μ˜ / λΆˆν•„μš”ν•œ μ œν•œμ„ 두지 λ§ˆμ‹­μ‹œμ˜€.
  • 예 : ν•„λ“œκ°€ λͺ…ν™•ν•œ 크기 의미λ₯Ό κ°€μ§€κ³  있고 νŠΉλ³„ν•œ μ΄μœ κ°€ μ—†μœΌλ©΄ size_t /ssizeλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. ν•„λ“œμ— μž„μ˜ / λΆˆν•„μš”ν•œ μ œν•œμ„ 두지 λ§ˆμ‹­μ‹œμ˜€.

μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€

  • 전솑 / 직렬화 λ©”μ»€λ‹ˆμ¦˜μ„ 톡해 λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ—°κ²°ν•˜λŠ” ν•¨μˆ˜μ˜ 경우 κ³ μ • 폭 μœ ν˜•μ΄ μ„ ν˜Έλ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄msgpack_rpc.hμ—μ„œ :

bool msgpack_rpc_integer_result(uint32_t result, msgpack_object *req, msgpack_packer *res);


- 곡용 API의 ν•¨μˆ˜ λΆ€λΆ„μ—λŠ” κΈ°λ³Έ μœ ν˜•μ΄ μ„ ν˜Έλ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, κ°€μƒμ˜ `libneovim.h`μ—μ„œ :

  ```c
int neovim_get_current_buffer(void);

계단식 μœ ν˜•

ꡬ쑰체 ν•„λ“œ, ν•¨μˆ˜ 맀개 λ³€μˆ˜ λ˜λŠ” μ „μ—­ λ³€μˆ˜κ°€ 될 수 μžˆλŠ” μž…λ ₯ λ³€μˆ˜κ°€ 있으면 ν•΄λ‹Ή μœ ν˜•μ„ λ‹€λ£¨λŠ” μ½”λ“œμ—μ„œ ν•΄λ‹Ή μœ ν˜•μ„ κ³„λ‹¨μ‹μœΌλ‘œ λ°°μ—΄ν• μ§€ λ˜λŠ” 보닀 잘 κ°„μ£Όν•˜λ©΄ 더 넓은 μœ ν˜•μ„ μ‚¬μš©ν• μ§€ κ²°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€ μ „ν˜•μ μΈ 예λ₯Ό λ“€μžλ©΄, 일단 κ³ μ • λ„ˆλΉ„μ˜ ꡬ쑰체 ν•„λ“œκ°€ β€‹β€‹μžˆλ‹€λ©΄, 그것을 λ‹€λ£¨λŠ” μ½”λ“œ (ν•¨μˆ˜ λ³€μˆ˜ / 맀개 λ³€μˆ˜)λŠ” κ³ μ • 폭 νƒ€μž…μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λ©°, λ‹€λ₯Έ μœ ν˜•μœΌλ‘œ λ„“ν˜€μ•Ό ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 원칙은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • μž…λ ₯ λ³€μˆ˜μ— λŒ€ν•œ μ•‘μ„ΈμŠ€κ°€ 읽기 μ „μš©μΈ 경우 값을 상ν–₯ μ‘°μ • ν•˜κΈ°λ§Œ ν•˜λ©΄ λ‹€λ₯Έ 이유둜 더 μ„ ν˜Έν•˜λŠ” 경우 더 넓은 μœ ν˜•μ„ μ‚¬μš©ν•˜λŠ” 것이 μ•ˆμ „ν•©λ‹ˆλ‹€.
  • μž…λ ₯ λ³€μˆ˜μ— λŒ€ν•œ μ•‘μ„ΈμŠ€κ°€ 읽기/μ“°κΈ°κ°€ κ°€λŠ₯ν•œ 경우 쀑간 λ³€μˆ˜/ 맀개 λ³€μˆ˜λŠ” κ°€λŠ₯ν•œ ν•œ μž…λ ₯ λ³€μˆ˜μ˜ μœ ν˜•μ„ μœ μ§€ν•˜λ €κ³  μ‹œλ„ν•΄μ•Ό ν•©λ‹ˆλ‹€.

Loops

μš°λ¦¬λŠ” thisκ°€ 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•Šλ„λ‘ μ„Έμ‹¬ν•œ 주의λ₯Ό 기울이고 μžˆμŒμ„ μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. here에 μ„€λͺ…λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ‘œλΆ€ν„° 결둠을 내릴 수 μžˆμŠ΅λ‹ˆλ‹€.

λ£¨ν”„μ—λŠ” counter λ³€μˆ˜μ™€ limit ν‘œν˜„μ΄ μžˆμŠ΅λ‹ˆλ‹€ (쑰건은 counter와 limit의 비ꡐ μž…λ‹ˆλ‹€.) condition (즉, counter 및 limit이 λ‹€λ₯Έ λΆ€ν˜Έμ˜ μœ ν˜•μ„ κ°€μ§ˆ λ•Œ)μ—μ„œ λ‹€λ₯Έ λΆ€ν˜Έ μœ ν˜•μ„ ν˜Όν•©ν•  뿐만 μ•„λ‹ˆλΌ limit ν‘œν˜„μ˜ μ•”μ‹œμ  λ³€ν™˜μœΌλ‘œ 인해 주둜 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•”μ‹œμ  λ³€ν™˜ 및 type-signedness-mixing 문제λ₯Ό λ°©μ§€ν•˜κ³  κ°μ†Œμ‹œν‚€κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒμ„ μˆ˜ν–‰ν•˜μ‹­μ‹œμ˜€.

  • κ°€λŠ₯ν•œ 경우 condition ν‘œν˜„μ‹ λ‚΄μ˜ λ³€μˆ˜μ—μ„œ λ‹€λ₯Έ μ„œλͺ… μœ ν˜•μ„ ν”Όν•˜μ‹­μ‹œμ˜€ (λ§Žμ€ 였λ₯˜λŠ” λΆ€ν˜Έ μœ ν˜•μ—μ„œ λΆ€ν˜Έμ—†λŠ” μœ ν˜•μœΌλ‘œ μ•”μ‹œμ μœΌλ‘œ λ³€ν™˜λ˜κΈ° λ•Œλ¬Έμ— λ°œμƒν•©λ‹ˆλ‹€).
  • μ›μΉ™μ μœΌλ‘œ, limit expression의 νƒ€μž…μ€ counter의 νƒ€μž…μ„ κ²°μ •ν•©λ‹ˆλ‹€. limit ν‘œν˜„μ‹μ΄ size_t인 경우 counter도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. limit ν‘œν˜„μ‹μ΄ ssize인 경우 counter도 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. λ“±λ“±.
  • counter 및 limit의 κ²°κ³Ό μœ ν˜•μ΄ λΆ€ν˜Έκ°€ μ—†λŠ” 경우 :
    • ν•œκ³„ 값에 λŒ€ν•œ limit ν‘œν˜„μ‹μ„ ν™•μΈν•˜μ‹­μ‹œμ˜€ (예 : 크기가 0 인 경우).
    • (쑰건이 항상 μ–‘μˆ˜κ°€ 될 수 μžˆμŒμ„ 증λͺ…ν•  수 없도둝 ν•˜μ§€ μ•ŠλŠ” ν•œ) substraction을 μ‚¬μš©ν•˜μ—¬ condition을 ν”Όν•˜μ‹­μ‹œμ˜€.
  • μ΅œμ ν™”λ‘œ ssize λŒ€μ‹  intλ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ size_t λŒ€μ‹  unsigned intλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 단, μ΄λŸ¬ν•œ μœ ν˜•μ΄ 항상 μΆ©λΆ„ν•  κ²ƒμ΄λΌλŠ” 확신이 μžˆμ–΄μ•Όλ§Œ μ΅œμ ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μž„μ˜/λΆˆν•„μš”ν•œ μ œν•œμ„ 두지 λ§ˆμ‹­μ‹œμ˜€.
⚠️ **GitHub.com Fallback** ⚠️