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

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

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

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

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

๐Ÿ˜‚ Before

  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('๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.');
    }
  };

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

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

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

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

๐Ÿ˜ After

  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. ํ•จ์ˆ˜๋Š” 'ํ•œ ๊ฐ€์ง€' ์ž‘์—…๋งŒ ํ•ด์•ผ ํ•œ๋‹ค.(p.59)

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

๐Ÿ˜‚ Before

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 ํ•จ์ˆ˜๋„ ๋ณด๋ฉด ์•ˆ์—์„œ ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•˜๋Š” ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

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

๐Ÿ˜ After

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

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

๐Ÿ˜‚ Before

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

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

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

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

๐Ÿ˜ After

function stringNumberToInt(stringNumber) {
  return parseInt(stringNumber.replace(/,/g, ''));
}

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

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

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

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

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

๋ฐ˜์‘ํ˜•
profile

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

@์šฉ๋‡ฝ

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