ํต์ฌ ์์ฝ
- ์ฃผ์์ด ํ์ํ๋ค๋ ๊ฒ์ ์ฝ๋๊ฐ ๋ช ํํ๊ฒ ์ง์ฌ์์ง ์๋ค๋ ๋ป์ด๋ค.
- ⇒ ์ฃผ์์ ์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ์ฝ๋์ ํํ๋ ฅ์ ๊ฐ์ ํด์ ์ฃผ์์ ์ ๊ฑฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
- ์ฃผ์์ผ๋ก ๋ํ๋ด๋ ค๋ ์ค๋ช ์ ํจ์๋ ๋ณ์๋ก ํํํ๋ผ.
- ์ฝ๋๊ฐ ์ด๋ฏธ ํํํ๊ณ ์๋ ์ ๋ณด๋ฅผ ์ฃผ์์ผ๋ก ์ค๋ณต ์ค๋ช ํ์ง ๋ง๋ผ.
- ์์ค ์ฝ๋ ๊ด๋ฆฌ ์์คํ ์ด ์ค ์ ์๋ ์ ๋ณด๋ฅผ ์ฃผ์์ผ๋ก ํํํ์ง ๋ง๋ผ.
- ์ฃผ์ ๊ทผ์ฒ์ ์๋ ์ฝ๋์ ๋ํ ์ ๋ณด๋ง ๊ธฐ์ ํ๋ผ.
- ์ ์ญ์ ์ธ ์ ๋ณด๋ ๋ค๋ฅธ ์์น์ ์๋ ์ฝ๋์ ์์กดํ๋ ์ ๋ณด๋ ๊ธฐ์ ํ์ง ์๋๋ค.
4์ฅ ์ฃผ์
์ฃผ์์ ์ฌ์ฉํ๋ ์ด์ ๋ ์ฝ๋๋ก ์๋๋ฅผ ํํํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฃผ์์ ์์ํ๊ฒ ์ ํ์ง ๋ชปํ๋ค. ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ฃผ์์ ์ ์งํ๊ณ ๋ณด์ํ๊ธฐ๋ ํ์ค์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์ฃผ์์,
- ๊ฑฐ์ง๋ง์ ์์ฃผ ํ๋ค.
- ์ค๋๋ ์๋ก ์ฝ๋์์ ๋ฉ์ด์ง๊ณ ๋ถ๋ฆฌ๋๋ค.
์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ๊ณ ํํ๋ ฅ์ ๊ฐํํ์ฌ ์ ์ด์ ์ฃผ์์ด ํ์ ์๋ ๋ฐฉํฅ์ผ๋ก ์๋์ง๋ฅผ ์๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
์ฝ๋๋ก ์๋๋ฅผ ํํํ๋ผ
// ๐ด Bad
// ์ง์์๊ฒ ๋ณต์ง ํํ์ ๋ฐ์ ์๊ฒฉ์ด ์๋์ง ๊ฒ์ฌํ๋ค.
if((employee.flags & HOURLY_FLAG) && (employee.age > 65))
// ๐ข Good
if(employee.isEligibleForFullBenefits())
์ฝ๋๋ก ์ถฉ๋ถํ ์๋๋ฅผ ํํํ ์ ์๋ค.
์ ์์์์๋ ์ฃผ์์ผ๋ก ๋ฌ๋ ค๋ ์ค๋ช ์ ํจ์๋ก ๋ง๋ค์ด ํํํ์๋ค.
์ข์ ์ฃผ์
๋ฒ์ ์ธ ์ฃผ์
ํ์ค์ ๋ง์ถฐ ์์ฑ๋ ์ ์๊ถ, ์์ ๊ถ, ๋ผ์ด์ ์ค, ์ฐธ์กฐํ ์ธ๋ถ ๋ฌธ์ ์ ๋ณด ๋ฑ
๊ธฐ๋ณธ์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ฃผ์
์์ 1)
// ํ
์คํธ ์ค์ธ Responder ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ค.
function getResponderInstance(): Responder {...}
์์ ๊ฐ์ด ๋ฉ์๋๊ฐ ๋ฐํํ ๊ฐ์ ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ช ํ๋ ์ฃผ์์ ํธ๋ฆฌํ๋ค.
ํ์ง๋ง ๊ฐ๋ฅํ๋ค๋ฉด ์ฃผ์์ ์ ๋ณด๋ฅผ ํจ์๋ช ์ผ๋ก ํํํ๋ ๊ฒ์ด ๋ ์ข๋ค.
function getResponderBeingTested(): Responder {...}
์์ 2)
// yyyy-MM-dd hh:mm:ss
const timePattern = /([0-2][0-9]{3})-([0-1][0-9])-([0-3][0-9]) ([0-5][0-9]):([0-5][0-9]):([0-5][0-9])(([\-\+]([0-1][0-9])\:00))?/;
์ฃผ์์ผ๋ก ์ ๊ทํํ์์ด ์ด๋ค ํฌ๋งท์ ๋ํ๋ด๋์ง ์ ์ค๋ช ํด ์ค๋ค.
์๋๋ฅผ ์ค๋ช ํ๋ ์ฃผ์
์ฃผ์์ ๊ฒฐ์ ์ ๊น๋ฆฐ ์ ์์ ์๋๋ฅผ ์ค๋ช ํ ์ ์๋ค.
์ด๋ฐ ์๋๋ ์ฃผ๋ก ์ฝ๋๋ก ํํํ๊ธฐ ์ด๋ ต๋ค. ์ด๋ฐ ์ ๋ณด์ ํํด์ ์ฃผ์์ ์ ์ฉํ๊ฒ ์ฐ์ผ ์ ์๋ค.
์๋ฏธ๋ฅผ ๋ช ๋ฃํ๊ฒ ๋ฐํ๋ ์ฃผ์
๋ชจํธํ ์ธ์๋ ๋ฐํ๊ฐ์ ์๋ฏธ๋ฅผ ์ฝ๊ธฐ ์ข๊ฒ ํํํ๋ฉด ์ดํดํ๊ธฐ ์ฌ์์ง๋ค.
์ธ์๋ ๋ฐํ๊ฐ ์์ฒด๋ฅผ ๋ช ํํ๊ฒ ๋ง๋ค๊ธฐ ํ๋ ์ฝ๋(ex. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ๋ณ๊ฒฝํ ์ ์๋ ์ฝ๋)๋ผ๋ฉด ์ฃผ์์ด ์ ์ฉํ๋ค.
members.sort((a, b) => a.age - b.age) // ๋์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
โ ๏ธ ์ฃผ์ํ ์ : ์ฃผ์์ด ์ฌ๋ฐ๋ฅธ์ง ๊ฒ์ฆํ ์ ์๋ค.
์๋ชป๋ ์ฃผ์์ ๋ฌ์๋์ ์ํ์ด ๋๋ค. ๋ฐ๋ผ์ ์ฃผ์๋ณด๋ค ๋ ๋์ ๋ฐฉ๋ฒ์ด ์๋์ง ๊ณ ๋ฏผํ๊ณ ์ ํํ ๋ฌ๋๋ก ๊ฐ๋ณํ ์ฃผ์ํด์ผ ํ๋ค.
๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ๋ ์ฃผ์
๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๊ฒฝ๊ณ ํ ๋ชฉ์ ์ผ๋ก ์ฃผ์์ ์ฌ์ฉํ ์ ์๋ค.
// DOM์ ์ฐธ์กฐํ๋ฏ๋ก Server Side์์ ํธ์ถํ์ง ๋ง์ญ์์ค.
function changeBackgroundColor(color: string) {
document.body.style.color = color
}
TODO ์ฃผ์
๋ค์๊ณผ ๊ฐ์ ์ํฉ์ TODO ์ฃผ์์ ๋จ๊ธฐ๋ฉด ์ ์ฉํ๋ค.
- ์์ผ๋ก ํ ์ผ
- ๋น์ฅ ๊ตฌํํ๊ธฐ ์ด๋ ค์ด ๊ฒ
- ๊ฒํ ๊ฐ ํ์ํ ์ฝ๋
- ๊ธฐํ์ด ์ถ๊ฐ๋จ์ ๋ฐ๋ผ ์ถ๊ฐ ๊ตฌํํด์ผ ํ ์ฝ๋
๋๋ค์ IDE์์๋ TODO ์ฃผ์์ ํน๋ณํ ์์์ผ๋ก ํ์ํด ์ฃผ๊ฑฐ๋ ๋ชจ์์ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฏ๋ก ์ฝ๊ฒ ์ถ์ ํ ์ ์๋ค.
์ฃผ๊ธฐ์ ์ผ๋ก TODO ์ฃผ์์ ์ ๊ฒํ๊ณ ์๋ฃ๋ ๊ฒ์ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข๋ค.
๋ด๊ฐ ์ฌ์ฉํ๊ณ ์๋ VSCode Extention: Todo Tree
์ค์์ฑ์ ๊ฐ์กฐํ๋ ์ฃผ์
์์นซ ๋์๋กญ์ง ์๋ค๊ณ ์ฌ๊ฒจ์ง ๋ญ๊ฐ์ ์ค์์ฑ์ ๊ฐ์กฐํ๊ธฐ ์ํด ์ฃผ์์ ์ฌ์ฉํ๋ค.
๊ณต๊ฐ API์์ JsDoc
๊ณต๊ฐ API๋ฅผ ๊ตฌํ ํ๋ค๋ฉด ๋ฐ๋์ ํ๋ฅญํ JsDoc์ ์์ฑํ๋ค.
JsDoc์ด ์ ์์ฑ๋์ด ์๋ค๋ฉด ๋์ ํ์ ์ธ์ด์ธ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์ ์ ๋ํ ํํธ๋ฅผ ์ ๊ณตํ ์ ์๋ค.
ํ์ผ์ //@ts-check
์ฃผ์์ด ์๋ค๋ฉด ํ์
์คํฌ๋ฆฝํธ์ฒ๋ผ ํ์
์ฒดํน์ ํด์ค๋ค.
์ด๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ api๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ ์ ์๋ค.
// @ts-check
/**
* @param a {number}
* @param b {number}
* @returns {number}
*/
const add = (a, b) => a + b;
add("2", 3) //Error: 'string' ํ์์ ์ธ์๋ 'number' ํ์์ ๋งค๊ฐ ๋ณ์์ ํ ๋น๋ ์ ์์ต๋๋ค.
๋ค๋ง, ์ฌ๋ ์ฃผ์๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค.
๋์ ์ฃผ์
๋๋ค์ ์ฃผ์์ด ์ด ๋ฒ์ฃผ์ ์ํ๋ค.
- ํ์ ํ ์ฝ๋๋ฅผ ๋ณ๋ช ํ๋ ์ฃผ์
- ๋ฏธ์ํ ๊ฒฐ์ ์ ํฉ๋ฆฌํํ๋ ์ฃผ์
- ์ฃผ์ ๊ฑฐ๋ฆฌ๋ ๋ ๋ฐฑ์ ๋ถ๊ณผํ ์ฃผ์
์ฃผ์ ๊ฑฐ๋ฆฌ๋ ์ฃผ์
- ํน๋ณํ ์ด์ ์์ด ์๋ฌด๊ฐ ๋๋ ์ ํด์ง ํ๋ก์ธ์ค ๋๋ฌธ์ ๋ค๋ ์ฃผ์
- ์ฃผ์์ ์ดํดํ ์ ์์ด ๋ค๋ฅธ ๋ชจ๋๊น์ง ๋ค์ ธ์ผ ํ๋ ์ฃผ์
๋ ์์ ์ ๋๋ก ์ํตํ์ง ๋ชปํ๋ ์ฃผ์์ ๋ฐ์ดํธ๋ง ๋ญ๋นํ ๋ฟ์ด๋ค.
์ฃผ์์ ๋ฌ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ์ถฉ๋ถํ ์๊ฐ์ ๋ค์ฌ ์ต๊ณ ์ ์ฃผ์์ ๋ฌ์์ผ ํ๋ค.
๊ฐ์ ์ด์ผ๊ธฐ๋ฅผ ์ค๋ณตํ๋ ์ฃผ์
์ฝ๋ ๋ด์ฉ์ ๊ทธ๋๋ก ์ค๋ณตํ์ฌ ์ค๋ช ํ๋ ์ฃผ์์ ํผํ๋ค.
์์นซํ๋ฉด ์ฝ๋๋ณด๋ค ์ฃผ์์ ์ฝ๋ ์๊ฐ์ด ๋ ์ค๋ ๊ฑธ๋ฆฐ๋ค.
- ์ฃผ์์ด ์ฝ๋๋ณด๋ค ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ๋ชปํ๋ค.
- ์ฝ๋๋ฅผ ์ ๋นํํ๋ ์ฃผ์๋ ์๋๊ณ , ์๋๋ ๊ทผ๊ฑฐ๋ฅผ ์ค๋ช ํ์ง๋ ์๋๋ค.
- ์ฝ๋๋ณด๋ค ์ฝ๊ธฐ ์ฝ์ง ์๋ค.
- ์ฝ๋๋ณด๋ค ๋ถ์ ํํด ๋ ์๊ฐ ํจ์๋ฅผ ๋์ถฉ ์ดํดํ๊ณ ๋์ด๊ฐ๊ฒ ๋ง๋ ๋ค.
์คํดํ ์ฌ์ง๊ฐ ์๋ ์ฃผ์
์๋๋ ์ข์ง๋ง ์๋ฐํ๊ฒ ์ฃผ์์ ๋ฌ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
// closed๊ฐ true์ผ ๋ ๋ฐํ๋๋ ์ ํธ๋ฆฌํฐ ํจ์
// ํ์์์์ ๋๋ฌํ๋ฉด ์๋ฌ๋ฅผ ๋ฐ์ํ๋ค.
const setTimer = (timeoutMillies: number) => new Promise((resolve) => setTimeout(resolve, timeoutMillies))
async function waitForClose(timeoutMillies: number) {
if(!closed) {
await setTimer(timeoutMillies)
if (!closed) throw new Error('MockResponseSender could not be closed.')
}
}
์ ์ฝ๋๋ ํจ์๊ฐ ๋ฐํ๋๋ ์์ ์ ๋ํ ์คํด์ ์ฌ์ง๊ฐ ์๋ค.
ํ๋ก๊ทธ๋๋จธ๋ ์ฃผ์์ ์ด์ง ์๋ชป๋ ์ ๋ณด๋ก ์ธํด ๋ค์๊ณผ ๊ฐ์ ์๊ฐ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค.
๐ง๐ป: ‘closed
๊ฐ true๋ก ๋ณํ๋ ์๊ฐ์ ํจ์๊ฐ ๋ฐํ๋๊ฒ ๊ตฌ๋’
์ค์ ๋ก๋ closed
๊ฐ true์ฌ์ผ ํจ์๋ ๋ฐํ๋๋ค. ๊ทธ๊ฒ ์๋๋ฉด ๋ฌด์กฐ๊ฑด ํ์์์์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ closed
๊ฐ ๊ทธ๋๋ true๊ฐ ์๋๋ฉด ์๋ฌ๋ฅผ ๋ฐ์ํ๋ค.
์ฃผ์์ ๋ํ ์คํด ๋๋ฌธ์ ํ๋ก๊ทธ๋๋จธ๋ ์ฝ๋๊ฐ ๋๋ฆฐ ์ด์ ๋ฅผ ์ฐพ๋๋ผ ๊ณจ๋จธ๋ฆฌ๋ฅผ ์์ ์ ์๋ค.
์๋ฌด์ ์ผ๋ก ๋ค๋ ์ฃผ์ / ์์ผ๋ ๋ง๋ ํ ์ฃผ์ / ๋ฌด์์ด ์ก์
๋ชจ๋ ํจ์์ jsDoc๋ฅผ ๋ฌ๊ฑฐ๋ ๋ชจ๋ ๋ณ์์ ์ฃผ์์ ๋ฌ์์ผ ํ๋ค๋ ๊ท์น์ ์ด๋ฆฌ์๋ค.
// ๐ด Bad
/**
*
* @param title CD ์ ๋ชฉ
* @param author CD ์ ์
* @param tracks CD ํธ๋ ์ซ์
* @param durationInMinutes CD ๊ธธ์ด (๋จ์: ๋ถ)
*/
function addCD(
title: string,
author: string,
tracks: number,
durationInMinutes: number
) {
const cd: CD = {
title,
author,
tracks,
durationInMinutes,
};
cdList.push(cd);
}
์์์ ์ฌ์ฉ๋ ์ฃผ์์ ์๋ฌด ๊ฐ์น๊ฐ ์์ผ๋ฉฐ, ์คํ๋ ค ํ๋ก๊ทธ๋๋จธ๋ฅผ ํผ๋์ํฌ ์ ์๋ค.
๋๋ฌด ๋น์ฐํ ์ฌ์ค์ ์ธ๊ธํ๋ฉฐ ์๋ก์ด ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ๋ชปํ๋ ์ฃผ์์ด๊ธฐ๋ ํ๋ค.
์ด๋ฌํ ์ฃผ์์,
- ์ฝ๋๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ ๋ค.
- ์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ฌ์ง๋ฅผ ๋ง๋ ๋ค.
- ๊ฐ๋ฐ์๊ฐ ์ฃผ์์ ๋ฌด์ํ๋ ์ต๊ด์ ๋น ์ง๊ฒ ๋ง๋ ๋ค.
- ๊ฒฐ๊ตญ์ ์ฝ๋๊ฐ ๋ฐ๋๋ฉด์ ์ฃผ์์ ๊ฑฐ์ง๋ง๋ก ๋ณํ๋ค.
์๋ฏธ ์๋ JSDoc์ ๋ฌธ์๋ฅผ ์ ๊ณตํด์ผ ํ๋ค๋ ์๋ชป๋ ์์ฌ์ผ๋ก ํ์ํ ์ก์์ผ ๋ฟ์ด๋ค.
์์ค ์ฝ๋ ๊ด๋ฆฌ ์์คํ ์ ์ญํ ์ ํ๋ ์ฃผ์
- ์ด๋ ฅ์ ๊ธฐ๋กํ๋ ์ฃผ์
- ๊ณต๋ก๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ ์๋ฅผ ํ์ํ๋ ์ฃผ์
/* ํ์์ด๊ฐ ์ถ๊ฐํจ */
- ์ฃผ์์ผ๋ก ์ฒ๋ฆฌํ ์ฝ๋๊ฒฐ๊ตญ ์ธ๋ชจ์๋ ์ฝ๋๊ฐ ์ ์ฐจ ์์ฌ๊ฐ๊ฒ ๋๋ค.
- ๐ง๐ป: ์ด์ ๊ฐ ์์ด์ ๋จ๊ฒจ๋์ ๊ฑด๊ฐ? ์ค์ํ ๋ด์ฉ์ด๋ผ ์ง์ฐ๋ฉด ์ ๋๋ ๊ฑด๊ฐ? ์ฝ๋๋ฅผ ๊ธ๋ฐํ๊ฒ ๋ณ๊ฒฝํ๋ค๋ ์ฌ์ค์ ์๋ ค์ฃผ๋ ค๋ ๊ฑด๊ฐ?
- ์ฃผ์์ผ๋ก ์ฒ๋ฆฌ๋ ์ฝ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ง์ฐ๊ธฐ๋ฅผ ์ฃผ์ ํ๋ค.
์ค๋ซ๋์ ์ฝ๋์ ๋ฐฉ์น๋ ์ด๋ฐ ์ฃผ์์ ์ ์ฐจ ๋ถ์ ํํ๊ณ ์ธ๋ชจ์๋ ์ ๋ณด๋ก ๋ณํ๋ค.
์์ค ์ฝ๋ ๊ด๋ฆฌ ์์คํ ์ด ์ฐ๋ฆฌ๋ฅผ ๋์ ํด ์ฝ๋๋ฅผ ๊ธฐ์ตํด ์ค๋ค. ์์ด๋ฒ๋ฆด ์ผ๋ ค๋ ๋ฒ๋ฆฌ๊ณ ์ฃผ์์ ์ญ์ ํ๋ผ.
ํจ์๋ ๋ณ์๋ก ํํํ ์ ์๋ค๋ฉด ์ฃผ์์ ๋ฌ์ง ๋ง๋ผ
// ๐ด Bad
// ์ ์ญ ๋ชฉ๋ก smodule์ ์ํ๋ ๋ชจ๋์ด ์ฐ๋ฆฌ๊ฐ ์ํ ํ์ ์์คํ
์ ์กด์ฌํ๋๊ฐ?
if (smodule.getDependSubsystems().contains(subSysMod.getSubSystem()))
// ๐ข Good
const moduleDependees = smodule.getDependSubsystems()
const ourSubSystem = subSysMod.getSubSystem()
if (moduleDependees.contains(ourSubSystem))
์ฃผ์์ด ํ์ํ์ง ์๋๋ก ์ฝ๋๋ฅผ ๊ฐ์ ํ๋ ํธ์ด ๋ ์ข๋ค.
์ ์ ํ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์์ ์ฝ๋๋ก ๋ํ๋ด์
์์น๋ฅผ ํ์ํ๋ ์ฃผ์
// Actions ////////////////////////
์์ ๊ฐ์ ๋ฐฐ๋ ์๋ ํน์ ๊ธฐ๋ฅ์ ๋ชจ์๋์ผ๋ฉด ์ ์ฉํ ๊ฒฝ์ฐ๋ ๋๋ฌผ๊ฒ ์๋ค.
ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ ์ฑ๋ง ๋ฎ์ถ๋ฏ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข๋ค. (ํนํ ๋ท๋ถ๋ถ ์ฌ๋์๋ก ์ด์ด์ง๋ ์ก์)
๋๋ฌด ์์ฃผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ๋ฐฐ๋๋ ๋์ ๋๋ฉฐ ์ฃผ์๋ฅผ ํ๊ธฐํ๋ค.
- ๋ฐ๋์ ํ์ํ ๋๋ง ์ฌ์ฉํ๋ผ
- ์์ฃผ ๋๋ฌผ๊ฒ ์ฌ์ฉํ๋ผ
- ๋ฐฐ๋๋ฅผ ๋จ์ฉํ๋ฉด ๋ ์๊ฐ ์ก์์ผ๋ก ์ฌ๊ฒจ ๋ฌด์ํ๋ค
๋ซ๋ ๊ดํธ์ ๋ค๋ ์ฃผ์
์ค์ฒฉ์ด ์ฌํ๊ณ ์ฅํฉํ ํจ์๋ผ๋ฉด ์๋ฏธ๊ฐ ์์ ์๋ ์์ง๋ง,
์ด๋ฐ ๊ฒฝ์ฐ ํจ์๋ฅผ ๋ ์๊ฒ ๋ง๋ค๊ณ ์บก์ํํ๋๋ก ๊ฐ์ ํ๋ ๊ฒ์ด ๋ซ๋ค.
// ๐ด Bad
const main = () => {
try {
while(){
...
} // while
} // try
catch(e) {
...
} // catch
} // main
์ ์ญ ์ ๋ณด
์ฃผ์์ ๋ฌ์์ผ ํ๋ค๋ฉด ๊ทผ์ฒ์ ์๋ ์ฝ๋๋ง ๊ธฐ์ ํ๋ผ
์ฝ๋ ์ผ๋ถ์ ์ฃผ์์ ๋ฌ๋ฉด์ ์์คํ ์ ์ ์ญ ์ ๋ณด๋ ๋ค๋ฅธ ์ฝ๋์ ์์กด์ ์ธ ์ ๋ณด๋ฅผ ๊ธฐ์ ํ์ง ๋ง๋ผ
// ๐ด Bad
/** ์ ํฉ์ฑ ํ
์คํธ๊ฐ ๋์ํ๋ ํฌํธ: ๊ธฐ๋ณธ๊ฐ์ 8082 **/
function setFitnessPort(fitnessPort: number) {
...
}
setFitnessPort
ํจ์๋ ๊ธฐ๋ณธ๊ฐ์ ํต์ ํ์ง ์๋๋ค.
ํฌํธ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ ์ฝ๋๊ฐ ๋ณํด๋ ํด๋น ์ฃผ์์ด ๋ณํ๋ฆฌ๋ผ๋ ๋ณด์ฅ์ ์ ํ ์๋ค.
๊ฒฐ๊ตญ ์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ํฌ๋ค.
๋น๊ณต๊ฐ ์ฝ๋์์ JSDoc
๊ณต๊ฐ API๋ JSDoc์ด ์ ์ฉํ์ง๋ง, ์ธ๋ถ์์ ์ฌ์ฉํ ์ฝ๋๊ฐ ์๋๋ผ๋ฉด ์ธ๋ชจ๊ฐ ์๋ค.
์ ์ฉํ์ง๋ ์๊ณ JSDoc์ ์์ฑ ํ์์ผ๋ก ์ธํด ์ฝ๋๋ง ์ฐ๋งํด์ง๋ค.
์์
์๋ผํ ์คํ ๋ค์ค์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ์ฝ๋์ด๋ค. ๋ฆฌํฉํ ๋ง ์ ๊ณผ ํ๋ฅผ ๋น๊ตํ๋ฉฐ ํด๋ฆฐ์ฝ๋๊ฐ ์ฃผ์์ ์ด๋ป๊ฒ ๋์ฒดํ ์ ์๋์ง ํ์ธํด ๋ณด์.
/* 4-7 generatePrimes.ts */
export default function generatePrimes(maxValue: number) {
if (maxValue >= 2) {
// ์ ์ผํ๊ฒ ์ ํจํ ๊ฒฝ์ฐ
// ์ ์ธ
const s = maxValue + 1; // ๋ฐฐ์ด ํฌ๊ธฐ
const f: boolean[] = new Array(s).fill(true); // ๋ฐฐ์ด์ true๋ก ์ด๊ธฐํ
// ์์๊ฐ ์๋ ์๋ ค์ง ์ซ์๋ฅผ ์ ๊ฑฐ
f[0] = false;
f[1] = false
//์ฒด
for (let i = 2; i < Math.sqrt(s) + 1; i++) {
if (f[i]) {
// i๊ฐ ๋จ์ ์๋ ์ซ์๋ผ๋ฉด ์ด ์ซ์์ ๋ฐฐ์๋ฅผ ๊ตฌํ๋ค.
for (let j = 2 * i; j < s; j += i) {
f[j] = false; // ๋ฐฐ์๋ ์์๊ฐ ์๋๋ค
}
}
}
// ์์๋ฅผ ๊ฒฐ๊ณผ ๋ฐฐ์ด๋ก ์ด๋ํ๋ค
const primes: number[] = [];
for (let i = 0; i < s; i++) {
if (f[i]) primes.push(i);
}
return primes;
} else {
// maxValue < 2
return []; // ์
๋ ฅ์ด ์๋ชป๋๋ฉด ๋น์ด ์๋ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
}
}
/* 4-8 generatePrimes.ts (๋ฆฌํฉํ ๋ง ๋ฒ์ ) */
let crossedOut: boolean[]
export default function generatePrimes(maxValue: number) {
if (maxValue < 2) {
return [];
} else {
crossedOut = uncrossIntegerUpTo(maxValue);
crossOutMultiples();
const result = putUncrossedIntegersIntoResult();
return result;
}
}
function uncrossIntegerUpTo(maxValue: number) {
const crossedOut = new Array(maxValue + 1).fill(false, 2);
return crossedOut;
}
function crossOutMultiples() {
const limit = determineIterationLimit();
for (let i = 2; i <= limit; i++) {
if (notCrossed(i)) crossOutMultiplesOf(i);
}
}
function determineIterationLimit() {
// ๋ฐฐ์ด์ ์๋ ๋ชจ๋ ๋ฐฐ์๋ ๋ฐฐ์ด ํฌ๊ธฐ์ ์ ๊ณฑ๊ทผ๋ณด๋ค ์์ ์์์ ์ธ์๋ค
// ๋ฐ๋ผ์ ์ด ์ ๊ณฑ๊ทผ๋ณด๋ค ๋ ํฐ ์ซ์์ ๋ฐฐ์๋ ์ ๊ฑฐํ ํ์๊ฐ ์๋ค.
const iterationLimit = Math.sqrt(crossedOut.length);
return iterationLimit;
}
function crossOutMultiplesOf(i: number) {
for (let multiple = 2 * i; multiple < crossedOut.length; multiple += i) {
crossedOut[multiple] = true;
}
}
function notCrossed(i: number) {
return crossedOut[i] === false;
}
function putUncrossedIntegersIntoResult() {
const result: number[] = []
for (let i = 2; i < crossedOut.length; i++) {
if (notCrossed(i)) result.push(i);
}
return result
}
๋ง๋ฌด๋ฆฌ
์ฃผ์์ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ฅผ ์ํ ๋ฐฐ๋ ค๋ผ๊ณ ์๊ฐํ๋ค. ํนํ ์ฝ๋๋ง์ผ๋ก๋ ํํํ๊ธฐ ์ด๋ ค์ด ๋ชฉ์ ๊ณผ ์๋๋ฅผ ๋ํ๋ผ ๋ ์ข์ ์ง์นจ์ด ๋ ์ ์๋ค.
ํ์ง๋ง ์ฃผ์์ ๋๋ฌด ์์กดํ๋ ๊ฒ์ ์ข์ง ์๋ค. ์ฃผ์์ ์ด๋ค ํด๋ก๋ ๊ฒ์ฆํ ์ ์์ผ๋ฉฐ, ์๊ฐ์ด ์ง๋ ์๋ก ์คํ๋ ค ์คํด์ ํผ๋์ ๋ถ๋ฌ์ผ์ผํฌ ์ ์๋ค.
๊ฐ์ฅ ์ข์ ๊ฒ์ ์ฃผ์์ด ํ์ํ์ง ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ. ์ฃผ์์ด ์ค๋ช ํ๋ ๊ฒ์ ๋๋ถ๋ถ ๊น๋ํ ์ฝ๋ ๊ตฌ์กฐ์ ๋ช ํํ ๋ค์ด๋ฐ์ผ๋ก ๋์ฒด๋ ์ ์๋ค.
์ฃผ์๋ณด๋จ ํด๋ฆฐ์ฝ๋!
'๐ฟ ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[three.js] ์ฌ์ฉ์ ์ ์ ์ง์ค๋ฉํธ๋ฆฌ (0) | 2023.06.22 |
---|---|
[three.js] Material ์ฌ๋ฌ๊ฐ์ง map์ ์ ์ฉํด ๋์ฑ ์ฌ์ค์ ์ธ ํ ์ค์ณ๋ฅผ ๋ง๋ค์ด๋ณด์ (0) | 2023.06.15 |
[three.js] Material์ ํ ์ค์ณ๋ฅผ ์ ํ๋ณด์ (0) | 2023.06.09 |
[three.js] Material - ์ค๋ธ์ ํธ์ ์ฌ์ง์ ๋ค์ํ๊ฒ ์ค์ ํด๋ณด์ (0) | 2023.06.09 |
[three.js] Scene Graph๋ฅผ ์ด์ฉํ ๊ณต๊ฐ๊ตฌ์ฑ (0) | 2023.06.08 |