Naming Convention

m_ngyeongΒ·2023λ…„ 11μ›” 2일
0

Concept

λͺ©λ‘ 보기
4/7
post-thumbnail

Naming Convention

Before we go any further,

πŸͺ Camel Case

userName, userAge

  • 첫 λ‹¨μ–΄μ˜ 첫 κΈ€μžλŠ” μ†Œλ¬Έμž,
    κ·Έ 이후에 μ—°κ²°λœ 각 λ‹¨μ–΄μ˜ 첫 κΈ€μžλŠ” λŒ€λ¬Έμžλ‘œ ν‘œκΈ°
  • λ³€μˆ˜λͺ…, ν•¨μˆ˜λͺ…에 μ‚¬μš©

πŸ‘¨β€πŸ« Pascal Case

UserName, UserAge

  • λͺ¨λ“  λ‹¨μ–΄μ˜ 첫 κΈ€μžλŠ” λŒ€λ¬Έμžλ‘œ ν‘œκΈ°
  • 주둜 클래슀λͺ…에 μ‚¬μš©

πŸ‡­πŸ‡Ί Hugurian Notation

strUserName, iUserAge

  • 접두어에 μžλ£Œν˜• 뢙이기
  • Window APIμ—μ„œ μ‚¬μš©ν•˜λŠ” ν‘œκΈ°λ²•

🐍 Snake Case

user_name, user_age

  • λͺ¨λ“  단어가 μ†Œλ¬Έμžμ΄κ±°λ‚˜ λŒ€λ¬Έμž
  • 단어와 단어 사이에 underbar( _ )둜 ꡬ뢄
  • name spcace, data type, λ³€μˆ˜λͺ…, ν•¨μˆ˜λͺ…, 파일λͺ… 등에 μ‚¬μš©

πŸ₯™ Kebab Case

user-name, user-age

  • 단어와 단어 사이에 dash( - )둜 ꡬ뢄

Naming Convention

  • camelCase, PascalCase, snake_case λ“±λ“± ν•˜λ‚˜μ˜ λͺ…λͺ… κ·œμΉ™μ„ μ„ νƒν•˜κ³  μ‚¬μš©ν•΄μ•Ό ν•œλ‹€

S-I-D

  • Short(짧은) : κΈ°μ–΅ν•˜κΈ° μ‰¬μ›Œμ•Ό 함
  • Intuitive(직관적) : 일반적으둜 μ‚¬μš©ν•˜λŠ” 말에 κ°€κΉκ²Œ μ½ν˜€μ•Ό 함
  • Descriptive(μ„€λͺ…) : κ°€μž₯ 효율적인 λ°©μ‹μœΌλ‘œ μˆ˜ν–‰/μ†Œμœ ν•˜λŠ” 것을 λ‚˜νƒ€λ‚΄μ•Ό 함

단좕어 μ‚¬μš© μ§€μ–‘

λ˜λ„λ‘ 쀑볡 λ°©μ§€

  • ν΄λž˜μŠ€μ™€ ν•¨μˆ˜λͺ…, ν•¨μˆ˜λͺ…κ³Ό λ³€μˆ˜λͺ… μ‚¬μ΄μ˜ 쀑볡을 ν”Όν•œλ‹€
class MenuItem {
  /* Method name duplicates the context (which is "MenuItem") */
  handleMenuItemClick = (event) => { ... }

  /* Reads nicely as `MenuItem.handleClick()` */
  handleClick = (event) => { ... }
}

μ˜ˆμƒ κ²°κ³Ό 반영

// Bad
let isEnabled = itemCount > 3
return <Button disabled={!isEnabled} />

// Good
let isDisabled = itemCount <= 3
return <Button disabled={isDisabled} />

General Rules

  • Variable : Camel Case
    • Constant Variable : Upper Case
let lastName = 'Kim';
const SECONDS = 60;
  • Function(Method) : 동사 + Camel Case
    • Private Method : underbar( _ ), ex) _getUSerName()
  • Class & Component : Pascal Case
class UserInformation {
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  getUserName = () => {
    return `${this.firstName} ${this.lastName}`;
  }
}
  • Boolean Type : is/are/has둜 μ‹œμž‘
let isVisible = false;
let hasEncryption = true;

Naming Function

A/HC/LC Pattern은 μ•„λž˜μ™€ 같은 νŒ¨ν„΄μœΌλ‘œ ν•¨μˆ˜ 이름을 λͺ…λͺ…ν•˜λŠ” 방법둠이닀. μ‰½κ²Œ 말해, ν•¨μˆ˜κ°€ ν•˜λŠ” 일을 동사(Action) + λͺ©μ μ–΄(Context)둜 κ΅¬μ„±ν•œ 것인데, μ’€ 더 λͺ…ν™•ν•œ ν‘œν˜„μ„ μœ„ν•΄ Contextλ₯Ό High Context와 Low Context둜 λ‚˜λˆŒ 수 μžˆλ‹€.
prefix? + action (A) + high context (HC) + low context? (LC)

NamePrefixAction
getUserget
getUserMessagesget
handleClickOutsidehandle
shouldDisplayMessageshouldDisplay

Action

ν•¨μˆ˜ μ΄λ¦„μ˜ 동사 λΆ€λΆ„μœΌλ‘œ ν•¨μˆ˜κ°€ μˆ˜ν–‰ν•˜λŠ” μž‘μ—…μ„ μ„€λͺ…ν•œλ‹€.

  • get : Accesses data immediately
function getFruitCount() {
  return this.fruits.length
}
  • fetch : getκ³Ό λΉ„μŠ·ν•œ 역할을 κ°€μ§€μ§€λ§Œ 비동기 처리
function fetchPosts(postCount) {
  return fetch('https://api.dev/posts', {...})
}
  • set : 선언적인 λ°©μ‹μœΌλ‘œ λ³€μˆ˜ μ„€μ •
let fruits = 0

function setFruits(nextFruits) {
  fruits = nextFruits
}

setFruits(5)
console.log(fruits) // 5
  • reset : λ³€μˆ˜λ₯Ό 초기 κ°’ λ˜λŠ” μƒνƒœλ‘œ λ‹€μ‹œ μ„€μ •
const initialFruits = 5
let fruits = initialFruits
setFruits(10)
console.log(fruits) // 10

function resetFruits() {
  fruits = initialFruits
}

resetFruits()
console.log(fruits) // 5
  • remove : Removes something from somewhere
    검색 μ„œλΉ„μŠ€μ—μ„œ 검색 쑰건을 μ‚­μ œν•˜λŠ” 건 remove(not delete)
function removeFilter(filterName, filters) {
  return filters.filter((name) => name !== filterName)
}

const selectedFilters = ['price', 'availability', 'size']
removeFilter('price', selectedFilters)
  • delete : νŠΉμ • μ˜μ—­μ—μ„œ μ™„μ „νžˆ μ‚­μ œ, μ½˜ν…μΈ μ—μ„œ κ²Œμ‹œλ¬Ό μ‚­μ œ
function deletePost(id) {
  return database.find({ id }).delete()
}
  • compose : κΈ°μ‘΄μœΌλ‘œλΆ€ν„° 데이터 생성, λŒ€λΆ€λΆ„ λ¬Έμžμ—΄/객체/ν•¨μˆ˜μ—μ„œ μ‚¬μš©
function composePageUrl(pageName, pageId) {
  return (pageName.toLowerCase() + '-' + pageId)
}
  • handle : μž‘μ—… 처리, 주둜 콜백 ν•¨μˆ˜μ˜ 이름을 μ§€μ •ν•  λ•Œ μ‚¬μš©
function handleLinkClick() {
  console.log('Clicked a link!')
}

link.addEventListener('click', handleLinkClick)

Context : ν•¨μˆ˜κ°€ μž‘λ™ν•˜λŠ” 도메인

ν•¨μˆ˜λŠ” 무언가에 λŒ€ν•œ λ™μž‘μ΄κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜κ°€ μž‘λ™ κ°€λŠ₯ν•œ 도메인이 무언지인지 적어도 μ˜ˆμƒλ˜λŠ” λ°μ΄ν„°ν˜•μ€ 무엇인지 λͺ…μ‹œν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

Prefixes(접두사)

  • λ³€μˆ˜μ˜ 의미λ₯Ό ν–₯μƒν•˜κ³  비ꡐ적 ν•¨μˆ˜λͺ…에 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • is : Context의 νŠΉμ„± λ˜λŠ” μƒνƒœλ₯Ό μ„€λͺ…, 주둜 boolean
  • has : Contextκ°€ νŠΉμ • value/stateλ₯Ό κ°€μ§€κ³  μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ„€λͺ…, 주둜 boolean
  • should : νŠΉμ • actionκ³Ό κ²°ν•©λœ 긍정적인 쑰건문(주둜 boolean)을 반영,
  • max/min
  • prev/next : μƒνƒœ μ „ν™˜μ„ μ„€λͺ…ν•  λ•Œ μ‚¬μš©
function fetchPosts() {
  let prevPosts = this.state.posts

  let fetchedPosts = fetch('...')
  let nextPosts = concat(prevPosts, fetchedPosts)

  this.setState({ posts: nextPosts })
}
  • Singular(λ‹¨μˆ˜ν˜•)/Plurals볡수(ν˜•) : 데이터가 λ‹¨μˆ˜μΈμ§€ λ³΅μˆ˜μΈμ§€μ— 따라 λ³€μˆ˜ 이름에 적용

μ°Έκ³ λ¬Έμ„œ,
https://skyksit.tistory.com/entry/Javascript-Naming-Convention-λͺ…λͺ…-κ·œμΉ™,
https://github.com/kettanaito/naming-cheatsheet#ahclc-pattern

profile
ΚšΘ‰Ιž

0개의 λŒ“κΈ€