DevLog

์•Œ์•„๋ณด๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ• ๋ณธ๋ฌธ

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐœ๋ฐœ๊ฐœ๋ฐœ/๊ธฐํƒ€

์•Œ์•„๋ณด๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ•

Seungjae Lee 2021. 6. 16. 23:55

โ–ถ Indentation – ๋“ค์—ฌ์“ฐ๊ธฐ

Good:

if (condition) {
  action();
}
// ์ฝ”๋“œ์˜ ๋กœ์ง์ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ข…์†์ ์œผ๋กœ ๋‚˜๋‰˜๋Š” ์ฝ”๋“œ๋ฅผ ์“ธ ๋•Œ, 
// ์ข…์†๋œ code block๋Š” ์ฃผ์ธ code block๋ณด๋‹ค ๋‘ ์นธ ๋“ค์—ฌ์“ฐ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.

Bad:

if (condition) {
  action();
}

๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ•  ๋•Œ ํƒญ์ด ์•„๋‹Œ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋“ค์—ฌ์“ฐ๊ธฐ์™€ ๊ด€๋ จ๋œ ํƒญ๊ณผ ์ŠคํŽ˜์ด์Šค ์‚ฌ์ด์˜ ๋…ผ์Ÿ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ๊ณ„์—์„œ๋Š” ์•„์ฃผ ์˜ค๋ž˜๋œ ๋…ผ์Ÿ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ์— ์ทจํ–ฅ์˜ ์ฐจ์ด์ผ ๋ฟ ์ด๊ฒƒ์ด ๋งž๋‹ค ํ‹€๋ฆฌ๋‹ค์˜ ๋ฌธ์ œ๋Š” ์•„๋‹ˆ์ง€๋งŒ,
๋งŽ์€ JavaScript ํ”„๋กœ์ ํŠธ์—์„œ ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ 2๊ฐœ์˜ ์ŠคํŽ˜์ด์Šค๋ฅผ ์“ฐ๊ณ  ์žˆ๊ณ ,
์ ์ฐจ ๋“ค์—ฌ์“ฐ๊ธฐ ๋…ผ์Ÿ์˜ ์Šน๋ฆฌ์ž๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์ˆ˜์˜ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰์ค‘์ธ GitHub์—์„œ๋Š”,
Star(์ผ์ข…์˜ '์ข‹์•„์š”')๋ฅผ ๋ฐ›์€ ํ”„๋กœ์ ํŠธ์˜ 85% ์ด์ƒ์˜ JavaScript ํ”„๋กœ์ ํŠธ๊ฐ€ ์ŠคํŽ˜์ด์Šค ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์ด ์ ˆ๋Œ€๋กœ ํ”ผํ•ด์•ผ ํ•  ๋‹จ ํ•œ๊ฐ€์ง€๋Š”, ๋ฐ”๋กœ ์ŠคํŽ˜์ด์Šค์™€ ํƒญ์„ ํ˜ผ์šฉํ•ด์„œ ์“ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค!

Good:

if (condition) { 
  action(); 
} 
// code block์˜ ๋งˆ์ง€๋ง‰ ์ค„์„ ์“ธ ๋•Œ ๋งˆ์ง€๋ง‰ ์ค„์˜ ์‹œ์ž‘์€, ์‹œ์ž‘ํ•  ๋•Œ ์ค„์˜ ์‹œ์ž‘๊ณผ ๋™์ผํ•œ ๊ณณ์—์„œ ํ•ด์ฃผ์„ธ์š”.

Bad:

if (condition) {
   action(); 
 } 
 // ์ข…์†๋œ code block์˜ ์‹œ์ž‘์— ๋งž์ถ”๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.

Bad:

transmogrify({
  a: {
    b: function(){
    }
}}); 
// code block์ด ๋ฐ”๋€Œ๊ณ  ํ•ด๋‹น code block์— ๋งž์ถฐ ์ค„์„ ๋ฐ”๊ฟ€ ๋•Œ 2์นธ ๋“ค์—ฌ์“ฐ๊ธฐ ๊ทœ์น™์„ ์ง€์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
// ์†์„ฑ a ์•ˆ์— ์†์„ฑ b๊ฐ€ ์žˆ๋Š”๋ฐ, ๋งˆ์น˜ ๊ฐ™์€ ๋ฒ”์ฃผ์— ์žˆ๋Š” ์†์„ฑ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜์™€ ๊ฐ์ฒด์˜ ๊ตฌ๋ถ„์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โ–ถ Naming – ์ด๋ฆ„ ์ง“๊ธฐ

๋ณ€์ˆ˜๋ช…์€ ๊ฐ’์˜ ๋ณธ์งˆ์ ์ธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ํ•œ ๋‹จ์–ด(Descriptive word)๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๋ถ„์•ผ(domain)์˜ ํ•ต์‹ฌ์„ ์ž˜ ๋ฌ˜์‚ฌํ•ด์ฃผ๋Š” ๋‹จ์–ด์ผ์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ธˆ์œต ๊ด€๋ จ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ์‚ฐ์—… ๋ถ„์•ผ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋ฅผ ๊ฐ€๋Šฅํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Good:

let interestRate = 0.2; 
// ์ด์ž์œจ์ž„์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ธˆ์œต์ƒํ’ˆ์˜ ์ด์ž์œจ์ธ์ง€ ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋” ์ข‹๊ฒ ๋„ค์š”.

Bad:

let numA = 0.2; 
// ๋‹จ์ง€ ์ˆซ์ž๋ผ๋Š” ๊ฒƒ ์˜๋ฏธ ์™ธ ๋‹ค๋ฅธ ์˜๋ฏธ๊ฐ€ ์—†์–ด ๋ฌด์Šจ ๋ณ€์ˆ˜์ธ์ง€ ์ถ”์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์˜ ํ˜•์‹์ด ์•„๋‹Œ, ๊ทธ ๊ฐ’์˜ ์˜๋ฏธ๊ฐ€ ๋ณ€์ˆ˜ ์ด๋ฆ„์— ๋ฐ˜์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Good:

let animals = ['cat', 'dog', 'fish']; // ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง€๋Š” ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Bad:

let targetInputs = ['cat', 'dog', 'fish']; 
// ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง€๋Š” ๊ตฌ์กฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜๋ช…์œผ๋กœ, animals๊ฐ€ ๋” ๋‚ซ์Šต๋‹ˆ๋‹ค.

Very bad:

let array = ['cat', 'dog', 'fish'];

// targetinputs ๋ณด๋‹ค ๋”์šฑ ์˜๋ฏธ๊ฐ€ ๋ถˆ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ์˜ ๋ชจ์Œ(collection)์ด ํ• ๋‹น๋œ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ๋ณต์ˆ˜ ๋ช…์‚ฌ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.

Good:

let animals = ['cat', 'dog', 'fish'];
// ํ•˜๋‚˜์˜ ๋™๋ฌผ์ด ์•„๋‹ˆ๋ผ, ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์˜ ๋™๋ฌผ์ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ์ž„์ด ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Bad:

let animalList = ['cat', 'dog', 'fish'];
// animals๋กœ ํ‘œํ˜„๋˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๋ฅผ ์กฐ๊ธˆ ๋” ์ž˜ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Very Bad:

let animal = ['cat', 'dog', 'fish'];
// ํ•˜๋‚˜์˜ ๋™๋ฌผ์ธ์ง€, ์—ฌ๋Ÿฌ ๋งˆ๋ฆฌ์˜ ๋™๋ฌผ ๋ฆฌ์ŠคํŠธ์ธ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

boolean์ด ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋Š”  is  ํ˜น์€  are  ์„ ๋ถ™์—ฌ์„œ ์ฐธ ํ˜น์€ ๊ฑฐ์ง“์ž„์„ ๋ถ„๋ช…ํžˆ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ด๋ฏธ boolean์ด ํ• ๋‹น๋œ ๋ณ€์ˆ˜ ์ด๋ฆ„์€ is ํ˜น์€ are์„ ๋ถ™์—ฌ์™”์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”?

Carry is a dog

"์ผ€๋ฆฌ๋Š” ๊ฐ•์•„์ง€์ž…๋‹ˆ๋‹ค"๋ผ๋Š” ์‚ฌ์‹ค์„ ์ฝ”๋“œ๋กœ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. "๊ฐ•์•„์ง€์ž…๋‹ˆ๋‹ค"๊ฐ€ ์ฐธ(true)์ธ์ง€ ๊ฑฐ์ง“(false)์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์ฃ .

let isDog = true;
let ๊ฐ•์•„์ง€์ž…๋‹ˆ๋‹ค = true;

Good:

let areEqual = true;

Bad:

let pass = true;

ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋™์‚ฌ๋กœ ์‹œ์ž‘ํ•˜๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜์˜ ๊ธฐ๋Šฅ์„ ๋‹ด์€ ๋™์‚ฌ๋ฅผ ํ•จ์ˆ˜๋ช…์— ํฌํ•จํ•˜๋ฉด ์—ญํ• ์„ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’, ๊ทธ๋ฆฌ๊ณ  ๋‘˜ ์‚ฌ์ด์˜ ๋ณ€ํ™˜ ๊ณผ์ •์„ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

Good:

let countBlocks = function() { 
  // ๋ฒฝ๋Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํ•จ์ˆ˜์ž„์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
}

Good:

let countWaterBlocksBetweenTowers = function() { 
  // ํƒ€์›Œ ์‚ฌ์ด์˜ ๋ฒฝ๋Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํ•จ์ˆ˜์ž„์„ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
}

Bad:

let waterBlocks = function() { 
  // ๋ณ€์ˆ˜๋ช…์œผ๋กœ๋Š” ์—ญํ• ์ด ํŒŒ์•…์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์•„๋ž˜์˜ ์ฃผ์„์ด ์—†์œผ๋ฉด ๋ฌด์Šจ ์—ญํ• ์„ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. 
  // ์ด ํ•จ์ˆ˜๋Š” ๋ฒฝ๋Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํƒ€์›Œ ์‚ฌ์ด์˜ ๋ฒฝ๋Œ์„ ์„ธ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.  
}

๋ณ€์ˆ˜ ํ• ๋‹น ๊ฐ’์ด Class์ธ ๊ฒฝ์šฐ์— ์ฃผ๋กœ ๋ณ€์ˆ˜์˜ ์ฒซ ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

class Animal(){
  // ES6 ๋ถ€ํ„ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ class๊ฐ€ ํ• ๋‹น๋˜๋Š” ๋ณ€์ˆ˜๋Š” ์ฒซ ๊ธ€์ž๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ์ ์Šต๋‹ˆ๋‹ค. 
}
  • new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ํ•จ์ˆ˜์— ํ•œํ•ด์„œ ๋Œ€๋ฌธ์ž๋ฅผ ์“ฐ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. class ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
function Animal() {
  // class ์ƒ์„ฑ์ž ํ•จ์ˆ˜๊ฐ€ ๋  ํ•จ์ˆ˜์ž„์œผ๋กœ ๋Œ€๋ฌธ์ž๋กœ ์ ์Šต๋‹ˆ๋‹ค. 
}

์ƒ์ˆ˜๋Š” ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ์ ์Šต๋‹ˆ๋‹ค.

const MAX_ITEMS_IN_QUEUE = 100;

โ–ถ ๊ธฐํ˜ธ ๋ฐ ๊ตฌ๋‘์ (punctuation)

๋ฌธ๋ฒ•์ ์œผ๋กœ ์ƒ๋žต ๊ฐ€๋Šฅํ•œ ๋•Œ์—๋„ ์ค‘๊ด„ํ˜ธ๋Š” ์ƒ๋žตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Good:

for (key in object) {
  alert(key); 
} 
// for๋ฌธ์˜ ์ž‘๋™ ๋ฒ”์œ„๋ฅผ ๋ˆˆ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Bad:

for (key in object) 
  alert(key); 
// for๋ฌธ์˜ ์ž‘๋™ ๋ฒ”์œ„๋ฅผ ๋ˆˆ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

JavaScript์˜ ๋ฌธ์ž์—ด ํ‘œ์‹œ๋ฅผ ์œ„ํ•ด์„œ ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

HTML์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํฐ ๋”ฐ์˜ดํ‘œ์™€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฌธ์ž์—ด ํ‘œ๊ธฐ ์‹œ ์ž‘์€ ๋”ฐ์˜ดํ‘œ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Good:

let dog = 'dog';
let cat = 'cat';

Acceptable:

let dog = "dog";
let cat = "cat";
// ํฐ ๋”ฐ์˜ดํ‘œ๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

Bad:

let dog = 'dog';
let cat = "cat";
// ๋„์–ด์“ฐ๊ธฐ์™€ tab๊ณผ ๊ฐ™์ด ํ˜ผ์šฉ์€ ์ตœ์•…์˜ ์ฝ”๋“œ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.

 

์ค„ ๋ฐ”๊ฟˆ์ด ํ•„์š”ํ•œ ๋ฌธ์ž์—ด์„ ์ •์˜ํ•  ๋•Œ๋Š”  (๋ฐฑํ‹ฑ, backtick) ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Good:

let multilineText = `this is line one 
this is line two 
this is line three`; 
// ์—”ํ„ฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

Bad:

let multilineText = 'this is line one' + '\n' + 'this is line two' + '\n' + 'this is line three'; 
// ์—”ํ„ฐ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์‹คํ–‰์˜ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์ธ Statement(๋ฌธ)์˜ ๋์— ์„ธ๋ฏธ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Good:

alert('hi');

Bad:

alert('hi')

  if  for  while  ๋ฌธ์˜ ๋์—๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘๊ด„ํ˜ธ๋กœ ๋๋‚˜๋Š” Statement๋Š” ์ด๋ฏธ ์ข…๋ฃŒ๊ฐ€ ์•”์‹œ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์„ธ๋ฏธ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Good:

if (condition) {
  response(); 
}

Bad:

if (condition) {
  response(); 
};

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ๋์—๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 if for while  ๊ตฌ๋ฌธ์˜ ๋์ฒ˜๋Ÿผ ๋ณด์ผ์ง€๋ผ๋„ ์ฝ”๋“œ ๋์— ์„ธ๋ฏธ์ฝœ๋ก ์„ ์จ์•ผํ•ฉ๋‹ˆ๋‹ค.

Good:

let greet = function () { 
  alert('hi'); 
};

Bad:

let greet = function () {
  alert('hi');
}

์„ธ๋ฏธ์ฝœ๋ก ์„ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋„ ๋”๋Ÿฌ ์žˆ์œผ๋ฉฐ, ESLint Standard Style์—์„œ๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์„ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค๊ณ  ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์„ธ๋ฏธ์ฝœ๋ก ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ์ตœ๊ทผ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ ์„ธ๋ฏธ์ฝœ๋ก ์„ ์—„๋ฐ€ํ•˜๊ฒŒ ์ ์ง€ ์•Š์•„๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์„ธ๋ฏธ์ฝœ๋ก  ์ž๋™ ์‚ฝ์ž… ๊ธฐ๋Šฅ์ธ ASI(automatic semicolon insertion)์ด ๋Œ€๋ถ€๋ถ„์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์—์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์„ธ๋ฏธ์ฝœ๋ก ์„ ์™œ ์ž‘์„ฑํ•˜๋Š”์ง€ ์•Œ๊ณ  ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์—๋Š” ์ดํ›„ ๋””๋ฒ„๊น… ๋Šฅ๋ ฅ ํ–ฅ์ƒ์— ํฐ ์ฐจ์ด๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. "์ด๊ฑด ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹ˆ๋‹ค."๋ผ๊ณ  ํ™•์‹ ์ด ๋Š˜์–ด์•ผ, ๋ฌด์˜๋ฏธํ•œ ์‚ฝ์งˆ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


โ–ถ ์—ฐ์‚ฐ์ž์™€ ํ‚ค์›Œ๋“œ

์—„๊ฒฉํ•œ ๋น„๊ต ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”

์—„๊ฒฉํ•˜์ง€ ์•Š์€ ๋™์น˜ ์—ฐ์‚ฐ(loose equality, ==, !=)๋Š” ์—„๋ฐ€ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ์—„๊ฒฉํ•œ ๋™์น˜ ์—ฐ์‚ฐ(strict equality, ===, !==)์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

Good:

if (0 === '') {
  alert('looks like they\'re equal'); 
} 
// ์—„๊ฒฉํ•œ ๋™์น˜ ์—ฐ์‚ฐ์€ `0`๊ณผ `''`์„ ๋‹ค๋ฅด๋‹ค๊ณ  ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Bad:

if (0 == '') { 
  alert('looks like they\'re equal'); 
} 
// ์—„๊ฒฉํ•˜์ง€ ์•Š์€ ๋™์น˜ ์—ฐ์‚ฐ์€ `0`๊ณผ `''`์„ ๊ฐ™๋‹ค๊ณ  ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

3ํ•ญ ์—ฐ์‚ฐ์ž( ? )๋Š” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ๊ฒฝ์šฐ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3ํ•ญ ์—ฐ์‚ฐ์ž๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์žฅํ™ฉํ•œ ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

Good:

if (actual !== expected) {
  console.log('FAILED ' + testName + ': Expected ' + expected + ', but got ' + actual); 
} else {
  console.log('passed'); 
}

Bad:

return (actual === expected) ? 'passed' : 'FAILED ['+ testName + '] Expected "'+expected+'",but got '+'"'+actual+'"';

not ์—ฐ์‚ฐ์ž(!)๋Š” ๋ฐ”๋กœ ์•ž์— ๋ถ™์—ฌ์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Good:

if (!isEqual) {

Bad:

if (! isEqual) {

โ–ถ ์งง๊ฒŒ ์“ฐ๊ธฐ

์ฝ”๋“œ๋Š” ๋œป์ด ๋ถ„๋ช…ํ•˜๊ณ  ์‹คํ–‰ ๋˜๋Š” ํ•œ, ๋˜๋„๋ก ์งง๊ฒŒ ์“ฐ์„ธ์š”.

Good:

function square(n) {
  return n * n; 
}

Not as good:

function square(n) {
  let squaredN = n * n; 
  return squaredN; 
}
// ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

๋ถ€์ •์˜ ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•œ ๊ณณ์—๋งŒ NOT ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Good:

if(equalSizes && equalValues) {
  // ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ฐ™๊ณ , ๊ฐ’์ด ๊ฐ™์€ ๊ฒฝ์šฐ 
} else { 
}

Bad:

if(!equalSizes || !equalValues) { 
  // ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ฐ™์ง€ ์•Š๊ฑฐ๋‚˜ ๊ฐ’์ด ๊ฐ’์ง€ ์•Š์€ ๊ฒฝ์šฐ 
} else { 
} 
// ์ด ์กฐ๊ฑด๋ฌธ์€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์กฐ๊ฑด์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Boolean์œผ๋กœ ํ‰๊ฐ€๋˜๋Š” ํ‘œํ˜„๋ฌธ์€ ๋ฐ”๋กœ return ํ•˜์„ธ์š”

Good:

return charSet.size > text.length;

Bad:

if(charSet.size < text.length) {
  return false; 
}
return true; 
// ๋น„๊ต๋ฌธ์€ ๋ฌด์กฐ๊ฑด true ํ˜น์€ false๋กœ ํ‰๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์žฅํ™ฉํ•˜๊ฒŒ ์กฐ๊ฑด๋ฌธ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โ–ถ ์ฝ”๋“œ ๋ฌธ์žฅ๊ณผ ๊ตฌ๋ฌธ ์‚ฌ์ด ๊ณต๊ฐ„

ํ•œ ๋ฒˆ์— ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด์„œ, ์ค„ ๋ฐ”๊ฟˆ์€ ์ตœ์†Œ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Good:

function square(n) { 
  return n * n; 
} 

function assertEqual(actual, expected, testName) {
  // compare actual and expected 
}

Bad:

function square(n) {
  return n * n; 
} 



function assertEqual(actual, expected, testName) {
  // compare actual and expected 
}

์ค„์„ ๋ฐ”๊ฟ”์•ผํ•  ๋•Œ๋„ ์žˆ๊ณ , ์ค„ ๋ฐ”๊ฟˆ์„ ์ž์ œํ•ด์•ผ ํ•  ๋•Œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
ํŒ๋‹จ ๊ธฐ์ค€์€ ์–ด๋–ป๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด๊ฐ€? ์ž…๋‹ˆ๋‹ค.

๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ์ผ๊ด€์„ฑ์žˆ๊ฒŒ, ์ตœ์†Œํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Good:alert('I chose to put no visual padding around this string'); // ๊ด„ํ˜ธ์™€ ๋”ฐ์˜ดํ‘œ ์‚ฌ์ด ๊ณต๋ฐฑ์ด ์—†์Šต๋‹ˆ๋‹ค.Good:alert( 'I chose to put visual padding around this string' ); // ๊ด„ํ˜ธ์™€ ๋”ฐ์˜ดํ‘œ ์‚ฌ์ด ๊ณต๋ฐฑ์ด ์ผ๊ด€๋˜๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค.Bad:alert( 'I only put visual padding on one side of this string'); // ํ•œ ์ชฝ์—๋Š” ๊ณต๋ฐฑ์ด ์žˆ๊ณ , ํ•œ ์ชฝ์—๋Š” ๊ณต๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ๋ผ์ธ์— ๊ฐ’์„ ๋ณด๊ธฐ ์œ„ํ•ด ํ•˜๋Š” ๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค.

Good:

let firstItem = getFirst(); 
let secondItem = getSecond();
let thirteenthItem = getThirteenth();

Bad:

let firstItem = getFirst(); 
let secondItem = getSecond(); 
let thirteenthItem = getThirteenth(); 
// ๋ถˆํ•„์š”ํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค.

์ฝค๋งˆ(,) ์‚ฌ์ด๋Š” ํ•œ ์นธ ๋„์–ด์”๋‹ˆ๋‹ค.

Good:

assertEqual(Math.pow(3, 2), 9, 'Math.pow squares properly');

Bad:

assertEqual(Math.pow(3,2),9,'Math.pow squares properly');

์—ฐ์‚ฐ์ž ์‚ฌ์ด๋Š” ํ•œ ์นธ ๋„์–ด์”๋‹ˆ๋‹ค.

Good:

'Failed [' + testName + ']'...

Good:

if(actual === expected){
  // action 
} else { 
  // alternate action 
}

Bad:

'Failed ['+testName+']'...

Bad:

if(actual===expected){ 
  // action 
}else{
  // alternate action
}

์ฃผ์„

  • ์ฃผ์„์€ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์„์„ ์ ๊ธฐ ์ „์—, ๋ณ€์ˆ˜ ์ด๋ฆ„๊ณผ ๊ตฌ์กฐ๋กœ ์ฝ”๋“œ์˜ ๋ชฉ์ ์ด ๋ช…ํ™•ํžˆ ํ‘œํ˜„๋˜๋ฉด ์ฃผ์„์„ ์ ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์„์œผ๋กœ ์ฝ”๋“œ์˜ ์ž‘๋™์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋ฐ”๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ๊ฐ€๋…์„ฑ์ด ์ข‹๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ณต๋ถ€ ๋ชฉ์ ์œผ๋กœ ์ฃผ์„์„ ์ ์—ˆ๋Š”๋ฐ์š”, ์ด๊ฒƒ๋„ ํ•˜๋ฉด ์•ˆ๋˜๋‚˜์š”?

  • ์ฃผ์„์„ ๊ณต๋ถ€ ๋ชฉ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ข‹์œผ๋‚˜, ์ˆ™๋‹ฌ๋˜์–ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์— ์ฃผ์„์„ ๋‹ค๋Š” ๊ฒƒ์€ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฝ๋‹ˆ๋‹ค. ์ ์ฐจ์ ์œผ๋กœ ์ค„์—ฌ๋‚˜๊ฐ‘์‹œ๋‹ค.

โ–ถ camelCase vs. snake_case 

JavaScript์—์„œ๋Š” ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•  ๋•Œ 'Camel Casing'์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Ruby ๊ฐ™์€ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” 'Snake Casing'๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Good:

let camelCased = 'Used in javascript';

Bad:

let snake_cased = 'Used in other languages';

JavaScript์—์„œ '๋ฑ€ ๋ชจ์–‘'์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š”, ์ƒ์ˆ˜ ์ด๋ฆ„์„ ์ง€์„ ๋•Œ์ž…๋‹ˆ๋‹ค.

const MAX_ITEMS_IN_QUEUE = 100;
Comments