클린코드의 함수에서 가장 중요한 세 가지는 다음과 같습니다!
1. 길이가 짧고
2. 이름이 좋고
3. 체계가 잡힌
하나의 함수는 하나의 행동만 정의해야 한다
하나의 행동만 해야 함수를 작성하는 것, 테스트하는 것 그리고 이해하는 것이 쉬워진다.
하나의 행동만 하는지 어떻게 판단할까?
함수의 핵심 기능을 파악해서, 이 함수의 추상화 수준이 하나인지 판단하는 것이다!
JavaScript는 Haskell처럼 함수형 프로그래밍 언어
는 아니지만 함수형 프로그래밍처럼 작성할 수 있다.
함수형 언어는 더 깔끔하고 테스트하기 쉽다.
선언형: 알고리즘을 명시하지 않고, 목표를 명시한다
명령형: 알고리즘을 명시하고, 목표는 명시 하지 않는다
const programmerOutput = [
{
name: 'Uncle Bobby',
linesOfCode: 500
}, {
name: 'Suzie Q',
linesOfCode: 1500
}, {
name: 'Jimmy Gosling',
linesOfCode: 150
}, {
name: 'Gracie Hopper',
linesOfCode: 1000
}
];
let totalOutput = 0;
for (let i = 0; i < programmerOutput.length; i++) {
totalOutput += programmerOutput[i].linesOfCode;
}
const totalOutput = programmerOutput
.map(programmer => programmer.linesOfCode)
.reduce((acc, linesOfCode) => acc + linesOfCode, INITIAL_VALUE);
조건문 작성을 피하라는 것은 매우 불가능한 일로 보입니다.
이 얘기를 처음 듣는 사람들은 대부분 "If문 없이 어떻게 코드를 짜나요?"라고 말합니다.
하지만 다형성
을 이용한다면 동일한 작업을 수행할 수 있습니다.
두번째 질문은 보통 "네 좋네요 근데 내가 왜 그렇게 해야하나요?"이죠.
그에 대한 대답은, 앞서 우리가 공부했던 clean code 컨셉에 있습니다.
함수는 단 하나의 일만 수행하여야 합니다.
당신이 함수나 클래스에 if문을 쓴다면 그것은 그 함수나 클래스가 한가지 이상의 일을 수행하고 있다고 말하는 것과 같습니다.
기억하세요, 하나의 함수는 딱 하나의 일만 해야합니다.
class Airplane {
// ...
getCruisingAltitude() {
switch (this.type) {
case '777':
return this.getMaxAltitude() - this.getPassengerCount();
case 'Air Force One':
return this.getMaxAltitude();
case 'Cessna':
return this.getMaxAltitude() - this.getFuelExpenditure();
}
}
}
class Airplane {
// ...
}
class Boeing777 extends Airplane {
// ...
getCruisingAltitude() {
return this.getMaxAltitude() - this.getPassengerCount();
}
}
class AirForceOne extends Airplane {
// ...
getCruisingAltitude() {
return this.getMaxAltitude();
}
}
class Cessna extends Airplane {
// ...
getCruisingAltitude() {
return this.getMaxAltitude() - this.getFuelExpenditure();
}
}
최신 브라우저들은 런타임에 많은 최적화 작업을 수행합니다.
대부분 당신이 코드를 최적화 하는 것은 시간낭비일 가능성이 많습니다.
// 오래된 브라우저의 경우 캐시되지 않은 `list.length`를 통한 반복문은 높은 코스트를 가졌습니다.
// 그 이유는 `list.length`를 매번 계산해야만 했기 때문인데, 최신 브라우저에서는 이것이 최적화 되었습니다.
for (let i = 0, len = list.length; i < len; i++) {
// ...
}
for (let i = 0; i < list.length; i++) {
// ...
}
정리하지 않은 문항 : 12, 13 (왜 그렇게 해야해?) / 18