Summary
함수를 잘 만드는 방법?!
1. 작게 만들어라
2. 한 가지만 해라
3. 함수당 추상화 수준은 하나로
4. switch 문 사용 지양하라
5. 서술적인 이름을 사용하라
6. 함수 인수(0개가 이상적이다)
7. 부수 효과를 일으키지 마라
8. 명령과 조회를 분리하라
9. 오류 코드보다 예외를 사용하라
10. 반복하지 마라
11. 구조적 프로그래밍
책에서 기억하고 싶은 내용
어떤 프로그램의 가장 기본적인 단위 === 함수
Q. 의도를 분명히 표현하는 함수를 어떻게 구현할 수 있을까?
Q. 함수에 어떤 속성을 부여해야 처음 읽는 사람이 프로그램 내부를 직관적으로 파악할 수 있을까?
이번 장에서 배울 것?
함수를 잘 만드는 법
각 함수가 너무도 명백하도록 만들어라
각 함수가 이야기 하나를 표현하도록 만들어라
각 함수가 너무도 멋지게 다음 무대를 준비하도록 만들어라
블록과 들여쓰기
if 문/ else 문/ while 문 등에 들어가는 블록은 한줄이어야 함
중첩 구조가 생길만큼 함수가 커져서는 안된다
함수에서 들여쓰기수준은 1단이나 2단을 넘어서는 안 된다
한 가지
작업만 하려면 함수 내 모든 문장의 추상화 수준이 동일해야 한다내려가기
규칙한 가지
만 하는 함수다단항 형식
boolean fileExists("MyFile")
InputStream fileOpen("MyFile")
플래그 인수(사용하지 마세요)
플래그 인수를 사용하지 말아야하는 이유?
함수가 한꺼번에 여러 가지를 처리한다고 대놓고 공표하는 셈
// 안좋은 예
function createFile(name, isTemp) {
if(isTemp) {
fs.create(`./temp/${name}`);
} else {
fs.create(name);
}
}
// 좋은 예
function createFile(name) {
fs.create(name);
}
function createTempFile(name){
createFile(`./temp/${name}`);
}
이항 함수(불가피한 이유가 아니면 사용을 지양하자)
삼항 함수(불가피한 이유가 아니면 사용을 지양하자)
인수 객체
new Circle(x, y, radius);
const center = new Point(x, y);
new Circle(center, radius);
// or
new Circle({x, y, radius})
동사와 키워드
// writeField(name) 더 이해하기 쉽다
write(name);
writeField(name);
// 후자로 작성하면 인수 순서를 기억할 필요가 없어진다
assertEquals(expected, actual);
assertExpectedEqualsActual(expected, actual);
if(deletePage(page) === E_OK) { ... }
위 코드처럼 오류 코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 한다는 문제에 부딪힌다try{
functionThatMightThrow();
} catch(e) {
console.log(e);
}
정상 동작과 오류 처리 동작을 분리하면 코드를 이해하고 수정하기 쉬워진다한 가지
작업에 속한다오늘 읽은 소감
책에 나와 있는 함수를 잘 만드는 법은 내 코드로 직접 리팩토링을 해봐야지 습득할 수 있을 것 같다. 아직은 책만 읽은 상태여서 이해가 100% 되지 않았다. 깨끗한 코드를 짜기 위해서 연습을 많이 해야겠다.