๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
๋ฐ˜์‘ํ˜•

Clean Code ๋ฏธ์…˜ 5 Day 22, 23

ํด๋ฆฐ ์ฝ”๋“œ ์ฝ์œผ๋ฉฐ ๋ผˆ๋งž์•˜๋˜ ๋‚ด์šฉ ์ค‘ 3๊ฐ€์ง€ ์ง„๋ฆฌ ๋ฅผ ๊ณ ๋ฅด๊ณ , ์ง„๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์˜ˆ์‹œ ์ด 3๊ฐ€์ง€๋ฅผ ๋งŒ๋“ค๊ธฐ.

1. ์ง„๋ฆฌ 1. try/catch ๋ธ”๋ก์„ ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋‚ด๋Š” ํŽธ์ด ์ข‹๋‹ค. (p.58)

1.1. ๋ฌด์—‡์„ ๊ณ ์ณค๋Š”๊ฐ€?

๐Ÿ˜‚ Before

<javascript />
const saveAsImageHandler = async () => { const target = document.getElementById('content'); if (!target) return alert('๊ฒฐ๊ณผ ์ €์žฅ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.'); alert( '์ƒˆ๋กœ์šด ์ฐฝ์ด ์—ด๋ฆฌ๋ฉด\nPC์—์„œ๋Š” ์šฐํด๋ฆญ -> ์ด๋ฏธ์ง€ ์ €์žฅํ•˜๊ธฐ\n๋ชจ๋ฐ”์ผ์€ ์ด๋ฏธ์ง€๋ฅผ ๊พน ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!\n*์ƒˆ๋กœ์šด ์ฐฝ์ด ์•ˆ ์—ด๋ฆฐ๋‹ค๋ฉด ํŒ์—…์„ ํ•ด์ œํ•ด์ฃผ์„ธ์š”*' ); try { const canvas = await html2canvas(target); canvas.toBlob((blob) => { if (blob) { const uri = URL.createObjectURL(blob); window.open(uri); } }); } catch (error) { alert('๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.'); } };

ํŽ˜์ด์ง€์˜ ํ•ด๋‹น ์˜์—ญ์„ ์บก์ฒ˜ํ•ด์„œ ์ด๋ฏธ์ง€๋กœ ์ €์žฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค.

๋ณด๋‹ค์‹œํ”ผ ํ•œ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ •์ƒ ๋™์ž‘๊ณผ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋™์ž‘์„ ๋’ค์„ž์œผ๋ฉด์„œ ์—ฌ๋Ÿฌ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ์— ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

1.2. ์–ด๋–ป๊ฒŒ ๊ณ ์ณค๋Š”๊ฐ€?

๐Ÿ˜ After

<javascript />
const saveImage = async () => { const target = document.getElementById('content'); if (target) { alert( '์ƒˆ๋กœ์šด ์ฐฝ์ด ์—ด๋ฆฌ๋ฉด\nPC์—์„œ๋Š” ์šฐํด๋ฆญ -> ์ด๋ฏธ์ง€ ์ €์žฅํ•˜๊ธฐ\n๋ชจ๋ฐ”์ผ์€ ์ด๋ฏธ์ง€๋ฅผ ๊พน ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!\n*์ƒˆ๋กœ์šด ์ฐฝ์ด ์•ˆ ์—ด๋ฆฐ๋‹ค๋ฉด ํŒ์—…์„ ํ•ด์ œํ•ด์ฃผ์„ธ์š”*' ); const canvas = await html2canvas(target); canvas.toBlob((blob) => { if (blob) { const uri = URL.createObjectURL(blob); window.open(uri); } }); } }; const saveImageError = () => { return alert('๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.'); }; const onClick = () => { try { saveImage(); } catch (error) { saveImageError(); } };

๋ฒ„ํŠผ์„ ํด๋ฆญ ํ–ˆ์„ ๋•Œ ๋™์ž‘ํ•˜๋Š” ํ•จ์ˆ˜ onClick ํ•จ์ˆ˜์—๋‹ค๊ฐ€ try/catch๋ฌธ์„ ์ž‘์„ฑํ–ˆ๋‹ค.

try/catch๋ฌธ ์•ˆ์—๋Š” ์ •์ƒ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜ saveImage๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ˜ธ์ถœํ•˜๊ฒŒ ํ–ˆ๊ณ ,

์˜ค๋ฅ˜ ๋™์ž‘ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜ saveImageError ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ˜ธ์ถœํ•˜๊ฒŒ ํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๋ฝ‘์•„๋ƒ„์œผ๋กœ์จ ๊ตฌ์กฐ๊ฐ€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜จ๋‹ค.

2. ์ง„๋ฆฌ 2. ํ•จ์ˆ˜๋Š” 'ํ•œ ๊ฐ€์ง€' ์ž‘์—…๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.(p.59)

2.1. ๋ฌด์—‡์„ ๊ณ ์ณค๋Š”๊ฐ€?

๐Ÿ˜‚ Before

<javascript />
function increaseAudioTimer() { time++; let mins = Math.floor((time % 3600) / 60); let secs = (time % 3600) % 60; audioTime.innerHTML = `${mins < 10 ? `0${mins}` : mins}:${secs < 10 ? `0${secs}` : secs}`; } function resetAudioTimer() { clearInterval(timerInterval); time = START_TIME; audioTime.innerHTML = '00:00'; }

์˜ค๋””์˜ค์˜ ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์ดˆ๊ธฐํ™” ํ•˜๋Š” ์ด๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

๊ฐ ํ•จ์ˆ˜๋“ค์—์„œ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ค‘๋ณต๋˜๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

increaseAudioTimer ํ•จ์ˆ˜ ์•ˆ์—์„œ๋Š” ์‹œ๊ฐ„์„ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ๋ถ„, ์ดˆ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์‹๊ณผ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

resetAudioTimer ํ•จ์ˆ˜๋„ ๋ณด๋ฉด ์•ˆ์—์„œ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๋Š” ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2.2. ์–ด๋–ป๊ฒŒ ๊ณ ์ณค๋Š”๊ฐ€?

๐Ÿ˜ After

<javascript />
function resetAudioTimer() { clearInterval(timerInterval); time = START_TIME; displayAudioTime(0, 0); } function displayAudioTime(mins, secs) { audioTime.innerHTML = `${mins < 10 ? `0${mins}` : mins}:${ secs < 10 ? `0${secs}` : secs }`; } function increaseAudioTimer() { time++; const { mins, secs } = getPlayTime(); displayAudioTime(mins, secs); } function getPlayTime() { const mins = Math.floor((time % 3600) / 60); const secs = (time % 3600) % 60; return { mins, secs }; }
  1. ์‹œ๊ฐ„์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ธฐ๋Šฅ์„ getPlayTime ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค.
  2. ์ค‘๋ณต๋˜๋Š” ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋Šฅ์„ displayAudioTime ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค.

๊ฐ๊ฐ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์„œ ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๊ณ  ๋‚˜์ค‘์— ๋ฆฌํŒฉํ† ๋ง์„ ํ•˜๊ฒŒ ๋˜์–ด๋„ ํ•ด๋‹น ํ•จ์ˆ˜๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์ ์ด ์ƒ๊ฒผ๋‹ค.

3. ์ง„๋ฆฌ 3. ์ฝ”๋“œ๋งŒ์ด ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์œ ์ผํ•œ ์ถœ์ฒ˜๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ๋ฆฌ๋Š” ์ฃผ์„์„ ๊ฐ€๋Šฅํ•œ ์ค„์ด๋„๋ก ๊พธ์ค€ํžˆ ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. (p.69)

3.1. ๋ฌด์—‡์„ ๊ณ ์ณค๋Š”๊ฐ€?

๐Ÿ˜‚ Before

<javascript />
// ๋ฌธ์ž๋ฅผ ํฌํ•จํ•œ ์ˆซ์ž๋กœ๋œ ๋ฌธ์ž๋“ค์„ ์ •์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜ function stringNumberToInt(stringNumber) { return parseInt(stringNumber.replace(/,/g, '')); } // ์ฒœ ์ž๋ฆฌ ์ฝค๋งˆ ํ•จ์ˆ˜ function numberFormat(inputNumber) { return inputNumber.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); }

ํ•จ์ˆ˜๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„์ด ์ถ”๊ฐ€ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฃผ์„์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ณ  ํ•จ์ˆ˜ ์ž์ฒด๋กœ๋งŒ ์„ค๋ช…์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋” ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

3.2. ์–ด๋–ป๊ฒŒ ๊ณ ์ณค๋Š”๊ฐ€?

๐Ÿ˜ After

<javascript />
function stringNumberToInt(stringNumber) { return parseInt(stringNumber.replace(/,/g, '')); } function addCommatoThousandDigits(inputNumber) { return inputNumber.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); }

์ฒซ๋ฒˆ์งธ ํ•จ์ˆ˜ stringNumberToInt๋Š” ํ•จ์ˆ˜๋ช…๋งŒ ๋ด๋„ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ์ฃผ์„์€ ์ œ๊ฑฐํ•ด์คฌ๋‹ค.

๋‘ ๋ฒˆ์งธ ํ•จ์ˆ˜ addComaToThousandDigits ํ•จ์ˆ˜๋Š” ์ฒœ ์ž๋ฆฌ ์ˆซ์ž์— ์ฝค๋งˆ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋‹ค.

๋ณ€๊ฒฝ ์ „์—๋Š” ํ•จ์ˆ˜ numberFormat์ด๋ผ๋Š” ๋ชจํ˜ธํ•œ ํ•จ์ˆ˜๋ช…์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์„์ด ํ•„์š”ํ–ˆ๊ฒ ์ง€๋งŒ,

๋ณ€๊ฒฝ ํ›„์—๋Š” ์ฃผ์„์ด ์—†์–ด๋„ ์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š”์ง€ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ๋˜์—ˆ๋‹ค.

๋ฐ˜์‘ํ˜•
profile

๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป

@์šฉ๋‡ฝ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!