코드의 문제를 작게 나누려면 해당 문제를 깊이 이해하고 있어야 합니다. 그리고 알기 쉬운 이름을 붙이려면 분할된 대상의 본질을 제대로 잡을 수 있어야 합니다.
함수의 분할 단위는 줄 수가 아닙니다. 하나의 의미를 나타내는 코드라면 비록 한 줄이라고 해도 함수화해야 하는 후보가 됩니다.
코드에 사전 조건 또는 사후 조건이 있을 때는 assert 함수를 사용하는 습관을 들여주세요.
assert 때문이 아니라, 사전 조건 / 사후 조건을 잘 챙겨야 겠다고 생각이 들어서..
if 조건문과 for 반복문을 사용하는 알고리즘은 대부분 일반적인 알고리즘 함수로 변환할 수 있습니다.
변환 전용 배열을 사용하면 if 조건문을 제거할 수 있습니다.
function idToNum(id) {
if (id === 0) return 10
if (id === 1) return 15
if (id === 2) return 30
if (id === 3) return 50
throw new Error('wrong id')
}
function idToNum(id) {
if (id < 0 || id > 3) throw new Error('wrong id')
const table = [10,15,30,50]
return table[id]
}
결정표를 사용한 if 조건문 제거
const Hand = {
Rock: 0,
Scissors: 1,
Paper: 2,
}
const Result = {
Win: 1,
Lose: 2,
Draw: 3,
}
function judgement(my, target) {
if (my === target) return Result.Draw
if (my === Hand.Rock && target === Hand.Scissors) return Result.Win
if (my === Hand.Scissors && target === Hand.Paper) return Result.Win
if (my === Hand.Paper && target === Hand.Rock) return Result.Win
return Result.Lose
}
function judgement(my, target) {
const result = [
[Result.Draw, Result.Win, Result.Lose],
[Result.Lose, Result.Draw, Result.Win],
[Result.Win, Result.Lose, Result.Draw],
]
return result[my][target]
}
for 반복문의 기본 원칙은 '1개의 작업만 반복'입니다.
case 내부에는 복잡한 코드를 작성하지 말아주세요. 분기에만 집중하도록 합시다.