WEB/Insight

[ 쒋은 μ½”λ“œ, λ‚˜μœ μ½”λ“œ ] 가독성 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λΌ

Happhee.dev 2023. 11. 2. 15:01

 

Chapter5. 가독성 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λΌ

 

 

πŸ“ λ“€μ–΄κ°€κΈ°

μ€‘κ³ λ‚˜λΌ μ›Ή μ˜€ν”ˆμ„ μ€€λΉ„ν•˜λ©΄μ„œ, λΉ λ“―ν•œ λ¦¬λ·°μ‹œκ°„μ„ 직접 κ²½ν—˜ν–ˆλ‹€.

κ·Έ μ•ˆμ—μ„œ κΈ°λŠ₯ κ΅¬ν˜„μ— λŒ€ν•œ λ§Œμ‘±λ„λŠ” μžˆμ—ˆμ§€λ§Œ, λ‚˜μ˜ μ½”λ“œ & νŒ€μ›λ“€μ˜ μ½”λ“œμ— λŒ€ν•œ 리뷰 μ‹€λ ₯에 λŒ€ν•œ 뢀쑱함을 느끼게 λ˜μ—ˆλ‹€.

 

λ”°λΌμ„œ 쒋은 μ½”λ“œμ™€ λ‚˜μœ μ½”λ“œλ₯Ό ꡬ별할 수 μžˆλŠ” λŠ₯λ ₯. 

또, νŒ€μ›λ“€κ³Ό μ½”λ“œ 곡유의 깊이λ₯Ό ν™•μž₯ μ‹œν‚€κ³  싢은 λͺ©ν‘œκ°€ 생겨, 이 책을 읽게 λ˜μ—ˆλ‹€.

 

μ–΄λŠ νšŒμ‚¬λ₯Ό 가도, μ„œλΉ„μŠ€λ₯Ό μ˜¨μ „νžˆ 혼자 λ§Œλ“€μ–΄λ‚΄λŠ” 곳은 없을 것이닀.

즉, λ‚΄κ°€ 맑은 κΈ°λŠ₯이더라도 μ–Έμ  κ°€λŠ” λ‹€λ₯Έ μ‚¬λžŒμ΄ 이 μ½”λ“œλ₯Ό 보고 버그λ₯Ό μˆ˜μ •ν•΄μ•Ό ν•  것이며, κ·Έ κ³Όμ •μ—μ„œ λ‚˜μœ μ½”λ“œκ°€ λ‚˜μ˜€κ²Œ λœλ‹€λ©΄, μž‘μ—… μ†λ„λŠ” 느렀질 수 밖에 없을 것이닀.

 

λ§Œμ•½, 퇴사λ₯Ό ν•œ μ‚¬λžŒμ˜ μ½”λ“œλΌλ©΄ λ”λ”μš± 어렀움에 빠질 수 μžˆλŠ” κ°€λŠ₯성이 λ†’μ•„μ§€κ²Œ λœλ‹€.

κ·Έλž˜μ„œ μ½”λ“œμ˜ κ°€λ…μ„±λ§ŒνΌμ€ 항상 μ€‘μš”ν•˜κ²Œ μ—¬κΈ°λ©° κ°œλ°œμ„ ν•˜λŠ” 것이 ν•„μš”ν•˜λ‹€κ³  λŠκ»΄μ‘Œλ‹€.

 

사싀. κ°€λ…μ„±μ˜ 핡심은 κ°œλ°œμžκ°€ μ½”λ“œμ˜ κΈ°λŠ₯을 λΉ λ₯΄κ³  μ •ν™•ν•˜κ²Œ 이해할 수 μžˆλ„λ‘ λ§Œλ“œλŠ” 것이닀.

ν•˜μ§€λ§Œ, λ‹€λ₯Έ μ‚¬λžŒμ—κ²Œ μ½”λ“œμ˜ 세뢀적인 λ‚΄μš©μ„ λͺ…ν™•ν•˜κ²Œ ν•˜λŠ” 것은 그에 맞게 ν•©λ‹Ήν•œ μ½”λ“œκ°€ λ‚˜μ™€μ•Ό ν•œλ‹€λŠ” 것이닀.

 

μ–΄λ–»κ²Œ 이λ₯Ό μœ„ν•œ μ½”λ“œλ₯Ό λ§Œλ“€μ–΄λ‚Ό 수 μžˆλŠ”κ±ΈκΉŒ?


βœ… μ„œμˆ ν˜• λͺ…μΉ­

κ°€μž₯ κΈ°λ³Έ 쀑에 기본이 μ•„λ‹κΉŒ μ‹Άλ‹€.

μš°λ¦¬κ°€ λ§Œλ“œλŠ” λ³€μˆ˜, ν•¨μˆ˜λ“€μ˜ 이름을 λ‹¨μˆœνžˆ 'A'라고만 μ§“λŠ”λ‹€λ©΄, λŒ€μ²΄ λˆ„κ°€ 이걸 μ–΄λ–€ 역할을 ν•˜λŠ” 객체인지 μ•Œ 수 μžˆμ„κΉŒ?

 

아무도 없을 것 이닀.

 

λ”°λΌμ„œ, 이름을 뢙일 λ•Œμ—λŠ” μ •ν™•νžˆ 그것이 무엇이고, 무엇을 ν•˜λŠ”μ§€ μ„€λͺ…ν•΄μ£ΌλŠ” λͺ…칭이 ν•„μš”ν•˜λ‹€.

 

❗️단, μ£Όμ„μœΌλ‘œ 이λ₯Ό λŒ€μ²΄ν•˜λŠ” 것은 μ˜¬λ°”λ₯΄μ§€ μ•Šλ‹€ ❗️

주석을 μ„œμˆ ν˜•μœΌλ‘œ μž‘μ„±ν•œλ‹€λ©΄, κ°œλ°œμžλŠ” μ½”λ“œλ₯Ό μœ„μ•„λž˜λ‘œ μŠ€ν¬λ‘€ν•˜λ©΄μ„œ ν•΄λ‹Ή μ½”λ“œλ₯Ό 이해해야 ν•œλ‹€. 

 

주석을 ν¬ν•¨ν•œ μ½”λ“œκ°€ μˆ˜λ°±λ§Œμ€„μ΄ λ„˜μ–΄κ°„λ‹€λ©΄...? 

이것은 κ½€ 번거둜운 일둜 λ‹€κ°€μ˜€κ²Œ 될 것이닀.


βœ… μ£Όμ„λ¬Έμ˜ μ μ ˆν•œ μ‚¬μš©

주석은 μ•„λž˜μ˜ 3κ°€μ§€ λͺ©μ μœΌλ‘œ μˆ˜ν–‰λ  수 μžˆλ‹€.

  1. μ½”λ“œκ°€ 무엇을 ν•˜λŠ”μ§€
  2. μ½”λ“œκ°€ μ™œ κ·Έ 일을 ν•˜λŠ”μ§€
  3. 기타 정보(ex μ‚¬μš© μ§€μΉ¨)λ₯Ό 제곡

주석은 큰 λ‹¨μœ„μ˜ μ½”λ“œκ°€ 무엇을 ν•˜λŠ”μ§€ μš”μ•½ν•  λ•Œ, μš©μ΄ν•˜λ‹€κ³  말할 수 μžˆλ‹€.

반면, ν•œ 쀄 ν•œ 쀄 μ½”λ“œμ— λŒ€ν•œ μ„€λͺ…은 가독성을 λ–¨μ–΄λœ¨λ¦¬λŠ” 방법이 λœλ‹€.

( λŒ€λΆ€λΆ„μ΄ κ·Έλ ‡λ‹€λŠ” κ²ƒμ΄λ‹ˆ μ˜€ν•΄ν•˜μ§€ μ•ŠκΈ°λ₯Ό λ°”λž€λ‹€.)

 

λ”λΆˆμ–΄, μ½”λ“œμ™€ μ€‘λ³΅λœ 주석문은 차라리 μ½”λ“œμ˜ 가독성을 λ†’μ΄λŠ” λ°©ν–₯으둜 μˆ˜μ •ν•˜λŠ” 것이 μ’‹λ‹€.

 

const getGenerateId = (infoData : string[]) => {
	// infoData[0]은 이름, infoData[1]은 μ„±μœΌλ‘œ
    //{이름}.{μ„±}의 ν˜•νƒœλ‘œ IDλ₯Ό μƒμ„±ν•œλ‹€.
	return infoData[0] + '.' + infoData[1];
}

 

μœ„μ˜ μƒν™©μ—μ„œ 주석은 μ½”λ“œμ™€ μ€‘λ³΅λ˜μ—ˆμœΌλ©°, μ§„μ§œ λ¬Έμ œλŠ” μ½”λ“œκ°€ 읽기 μ‰½κ²Œ μž‘μ„±λ˜μ§€ μ•Šμ•˜λ‹€λŠ” 것이닀.

κ·Έλ ‡λ‹€λ©΄ μ—¬κΈ°μ„œλŠ” 주석이 μ•„λ‹ˆλΌ μ½”λ“œλ₯Ό λ°”κΎΈλŠ” 것이 λ§žλ‹€.

const getGenerateId = (infoData : string[]) => {
	const [ firstName, lastName ] = infoData;
    
	return firstName + '.' + lastName;
}

 

μ½”λ“œ 자체둜 μ„€λͺ…이 λ˜λ„λ‘ μž‘μ„±ν•˜μ—¬ μœ μ§€ 및 κ΄€λ¦¬μ˜ κ³Όλ„ν•œ λΉ„μš©μ„ 쀄일 수 있게 λ˜μ—ˆλ‹€.

 

λ”°λΌμ„œ, 주석문은 μ½”λ“œλ§ŒμœΌλ‘œλŠ” 전달할 수 μ—†λŠ” 세뢀사항 ( ex. μ œν’ˆ λ˜λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ μ˜μ‚¬ κ²°μ •, ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’μ΄ 무엇인지 μ„€λͺ…ν•˜λŠ” λ¬Έμ„œ)λ₯Ό μš”μ•½ν•˜λŠ”λ° μœ μš©ν•˜λ‹€κ³  λ³Ό 수 μžˆλ‹€.


βœ… μ½”λ“œ 쀄 수λ₯Ό κ³ μ •ν•˜μ§€ 말라.

일반적으둜 μ½”λ“œλ² μ΄μŠ€μ˜ 쀄 μˆ˜κ°€ μ μ„μˆ˜λ‘ μ’‹λ‹€. λΌλŠ” 말듀을 λ“€μ–΄λ³Έ 적이 μžˆμ„ 것이닀.

 

ν•˜μ§€λ§Œ, 간결함을 μœ„ν•΄ 이해λ ₯을 λ–¨μ–΄λœ¨λ¦¬λŠ” μ½”λ“œλŠ” ν”Όν•΄μ•Ό ν•œλ‹€.

이해λ₯Ό ν•  수 μ—†λ‹€λ©΄, λ‹€λ₯Έ κ°œλ°œμžλ“€μ€ 이 μ½”λ“œκ°€ 무엇을 ν•˜λŠ”μ§€ μ•ŒκΈ° μœ„ν•΄ λ§Žμ€ μ‹œκ°„μ„ νˆ¬μžν•  것이닀. 

 

λ”°λΌμ„œ, 더 λ§Žμ€ 쀄이 μ‚¬μš©λ˜λ”λΌλ„ 가독성이 높은 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

 

λ‹€λ§Œ 이제, μ½”λ“œμ˜ 길이가 κΈΈμ–΄μ§„λ‹€λ©΄ 기쑴의 μ½”λ“œλ₯Ό μž¬μ‚¬μš©ν•˜μ§€ μ•Šκ±°λ‚˜ λΆˆν•„μš”ν•œ 무언가가 κ³„μ†ν•΄μ„œ λ“±μž₯ν•œλ‹€λŠ” κ²ƒμ΄λ‹ˆ ν•΄λ‹Ή 문제λ₯Ό μ‚΄νŽ΄λ³Ό ν•„μš”λŠ” μžˆλ‹€. 


βœ… 깊이 μ€‘μ²©λœ μ½”λ“œλ₯Ό ν”Όν•˜λΌ.

μ½”λ“œμ˜ ν•œ λΈ”λŸ­μ΄λΌκ³  λ§ν•˜λ©΄,

ν•¨μˆ˜ 호좜  & if문의 쑰건 블둝 & for 루프와 같은 반볡문으둜 μ‚΄νŽ΄λ³Ό 수 μžˆλ‹€.

 

λ§Žμ€ μ½”λ“œλ“€μ΄ μ€‘μ²©λœ ν˜•νƒœλ₯Ό κ°€μ§„ ꡬ쑰가 μžˆλŠ” 반면, κ·Έλ ‡μ§€ μ•Šμ€ ꡬ쑰도 μžˆλ‹€.

 

사싀, 쀑첩이 많이 생성될 수둝 ν•œ λΈ”λ‘μ—μ„œ λ„ˆλ¬΄ λ§Žμ€ 일을 μˆ˜ν–‰ν•˜κ²Œ 될 것이닀.

λ”°λΌμ„œ μš°λ¦¬λŠ” μž‘μ€ ν•¨μˆ˜λ‘œ λΆ„λ¦¬ν•˜μ—¬ 쀑첩을 μ΅œλŒ€ν•œ μ œκ±°ν•˜λŠ” λ…Έλ ₯을 ν•΄μ•Ό ν•œλ‹€. 


βœ… κ°€λ…μ„±μžˆλŠ” ν•¨μˆ˜ 호좜

μ•žμ„œ λ§ν•œ κ²ƒμ²˜λŸΌ, ν•¨μˆ˜λ₯Ό μž‘κ²Œ λΆ„λ¦¬ν•˜λŠ” 것은 λ‘œμ§μ„ λ‚˜λˆ„λŠ” 일이닀.

λ•Œλ¬Έμ—, ν•¨μˆ˜μ˜ 이름을 μž‘μ„±ν•  λ•ŒλŠ” μ„œμˆ μ  μœ ν˜•μœΌλ‘œ μ‚¬μš©ν•˜λ©°, λͺ…λͺ…λœ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

 

예λ₯Ό λ“€μ–΄μ„œ μ‚΄νŽ΄λ³΄μž.

const sendMessage = (message: string , priority : number, allowRetry : boolean) => {
	
}
// λͺ…λͺ…λ˜μ§€ μ•Šμ€ λ§€κ°œλ³€μˆ˜
sendMessage("happhee", 1, true);

μœ„μ˜ μ˜ˆμ‹œλŠ” λͺ…λͺ…λ˜μ§€ μ•Šμ€ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•œ 것이닀.

λ¬Έμžμ—΄κ³Ό 숫자, λΆˆλ¦¬μ–Έκ°’μ΄ 각각 무엇을 μ˜λ―Έν•˜λŠ”μ§€λŠ” 호좜된 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ‚΄νŽ΄λ³΄μ•„μ•Ό μ•Œ 수 μžˆλ‹€.

 

λ¬Όλ‘  μ½”λ“œκ°€ κ·Όμ²˜μ— 있으면 이λ₯Ό νŒŒμ•…ν•˜κΈ° μ‰½κ² μ§€λ§Œ, 멀리 λ–¨μ–΄μ Έμžˆλ‹€λ©΄ 직관적인 μ΄ν•΄λŠ” νž˜λ“€μ–΄λ³΄μΈλ‹€.

이λ₯Ό 고쳐보면, μ•„λž˜μ™€ κ°™λ‹€. 

const sendMessage = (message: string , priority : number, allowRetry : boolean) => {
	
}
// λͺ…λͺ…λœ λ§€κ°œλ³€μˆ˜ 
sendMessage({ message : "happhee", priority : 1, allowRetry : true});

ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜ 각각에 λŒ€ν•œ 속성을 μ•Œ 수 μžˆμ–΄, 보닀 더 직관적인 호좜이 κ°€λŠ₯ν•΄μ‘Œλ‹€.


βœ… μ„€λͺ…λ˜μ§€ μ•Šμ€ 값을 μ‚¬μš©ν•˜μ§€ 말라.

  • μ–΄λ–€ 값은 λ‹€λ₯Έ 쑰건에 μ˜ν•΄ λ³€ν™˜ν•  λ•Œ μ‚¬μš©ν•˜λŠ” κ³„μˆ˜
  • μž‘μ—…μ΄ μ‹€νŒ¨ν•  경우, μž¬μ‹œλ„μ˜ μ΅œλŒ€ νšŸμˆ˜μ™€ 같이 μ‘°μ • κ°€λŠ₯ν•œ νŒŒλΌλ―Έν„° κ°’

μ΄λ ‡κ²Œ ν•˜λ“œ μ½”λ“œλ‘œ λ‚˜νƒ€λ‚œ κ°’μ˜ 경우, ν•΄λ‹Ή 값이 μ–΄λ–€ 의미λ₯Ό κ°€μ§€κ³  μžˆλŠ”μ§€ 컴퓨터와 κ°œλ°œμžκ°€ λͺ¨λ‘ μ•Œκ³  μžˆμ–΄μ•Ό ν•œλ‹€.

κ³„μˆ˜μ— λŒ€ν•œ μ„€λͺ…이 μ—†λ‹€λ©΄, ν˜Όλž€μ„ μ΄ˆλž˜ν•˜κ³  이둜 인해 버그가 λ°œμƒν•  수 μžˆλ‹€.

 

μš°λ¦¬λŠ” κ·Έ 값이 무엇을 μ˜λ―Έν•˜λŠ”μ§€ λ‹€λ₯Έ κ°œλ°œμžλ“€μ—κ²Œ λͺ…ν™•ν•˜κ²Œ ν•΄μ£ΌλŠ” 것이 μ€‘μš”ν•˜λ‹€.

  1. μƒμˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” κ³΅κΈ‰μž ν•¨μˆ˜ πŸ‘‰ 일반적인 μƒμˆ˜ κ°œλ…μ΄λž‘ 거의 동일
  2. λ³€ν™˜μ„ μˆ˜ν–‰ν•˜λŠ” 헬퍼 ν•¨μˆ˜ πŸ‘‰ μˆ˜λŸ‰μ˜ λ³€ν™˜μ„ ν•˜μœ„ 문제둜 λ§Œλ“€μ–΄ μ‚¬μš©

βœ… 읡λͺ… ν•¨μˆ˜λ₯Ό μ μ ˆν•˜κ²Œ μ‚¬μš©.

ν”„λ‘ νŠΈμ—”λ“œ 개발자라면, Javascriptλ₯Ό ν•œ λ²ˆμ΄λΌλ„ 곡뢀해 λ³Έ μ‚¬λžŒμ΄λΌλ©΄,

읡λͺ… ν•¨μˆ˜μ— λŒ€ν•΄ 잘 μ•Œκ³  μžˆμ„ 것이닀.

 

말 κ·ΈλŒ€λ‘œ 이름이 μ—†λŠ” ν•¨μˆ˜μ΄λ©°, 일반적으둜 μ½”λ“œ λ‚΄μ˜ ν•„μš”ν•œ μ§€μ μ—μ„œ 인라인으둜 μ •μ˜λœλ‹€.

κ°„λ‹¨ν•œ λ‘œμ§μ—μ„œ μœ λ¦¬ν•œ μž₯점을 κ°€μ§„ 읡λͺ…ν•¨μˆ˜.

const getUsefulFeedback = (feedbackList: Feedback[]) => {
	return feedbackList.filter((feedback) => !feedback.comment );
}

 

return λ¬Έμ—μ„œ 가독성이 λ–¨μ–΄μ§„λ‹€κ³  μƒκ°ν•œλ‹€λ©΄, λͺ…λͺ…ν•¨μˆ˜λ₯Ό 인수둜 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

const getUsefulFeedback = (feedbackList: Feedback[]) => {
	return feedbackList.filter(isEmptyComment);
}
const isEmptyComment = (feedback : Feedback ) => {
	return !feedback.comment;
}

 

λͺ…λͺ…ν•¨μˆ˜λ₯Ό 인수둜 μ‚¬μš©ν•˜λŠ” 방법은 읡λͺ… ν•¨μˆ˜κ°€ κΈΈμ–΄μ§ˆ λ•Œμ— 해결책이 λ˜κΈ°λ„ ν•œλ‹€. 

 


βœ… ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ μƒˆλ‘œμš΄ κΈ°λŠ₯을 ν™œμš©ν•˜λΌ.

일반적으둜 μ½”λ“œ ν’ˆμ§ˆμ„ κ°œμ„ ν•˜κ³ μž ν•œλ‹€λ©΄, μ–Έμ–΄κ°€ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 μ‚¬μš©ν•˜λŠ” 것이 λ°”λžŒμ§ν•˜λ‹€.

κ·ΈλŸ¬λ‚˜ νŒ€μ›λ“€μ΄ ν•΄λ‹Ή κΈ°λŠ₯에 λŒ€ν•΄ μ΅μˆ™ν•˜μ§€ μ•Šλ‹€λ©΄ μ§€μ–‘ν•˜λŠ” 것이 쒋을 λ•Œλ„ μžˆλ‹€.

 

즉, ν•΄λ‹Ή κΈ°λŠ₯을 λ‹¨μˆœνžˆ μƒˆλ‘­λ‹€λŠ” 이유둜 μ‚¬μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 

μž‘μ—…μ— μ ν•©ν•œ 도ꡬ이기에 μ‚¬μš©ν•œλ‹€λŠ” 점을 λΆ„λͺ…ν•˜κ²Œ ν•˜λ©° μ½”λ“œμ˜ 퀄리티λ₯Ό ν–₯μƒμ‹œμΌœμ•Ό ν•œλ‹€.


πŸ“ 마무리

가독성과 μ½”λ“œμ— λŒ€ν•΄ λ‹€λ€„λ³΄λ©΄μ„œ, μ–΄λ–»κ²Œ μ½”λ“œ λ¦¬νŒ©ν† λ§κ³Ό 리뷰λ₯Ό μ§„ν–‰ν•΄μ•Ό ν•˜λŠ”μ§€ λ°©ν–₯성을 μ‘°κΈˆμ€ μž‘μ„ 수 있게 된 것 κ°™λ‹€.

κ³„μ†ν•΄μ„œ μ•žμ„  λ‚΄μš©λ“€μ„ μž‘μ—…μ— μ μš©ν•΄λ³΄λ©΄μ„œ, 체화λ₯Ό μ‹œν‚€λ„λ‘ λ…Έλ ₯ν•΄μ•Ό λΉ„λ‘œμ†Œ λ‚˜μ˜ μ§€μ‹μœΌλ‘œ λ‚˜μ•„κ°ˆ 수 μžˆμ„ 것 κ°™λ‹€.