📌 1주차 - Assignment #04
📚 TIL (2024.01.29) - 3장. 함수
🎈 책에서 기억하고 싶은 내용을 써보세요.
함수를 잘 만드는 법
작게 만들어라!
함수를 만드는 첫째 규칙은 '작게!'다.
함수를 만드는 둘째 규칙은 '더 작게!'다.
함수는 일반적으로 2 ~ 4줄 정도로 짧게하는 것이 좋다.
중첩 구조가 생길만큼 함수가 커져서는 안 된다는 뜻이다.
그러므로 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다.
당연한 말이지만, 그래야 함수는 읽고 이해하기 쉬워진다.
한 가지만 해라!
"함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다."
지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다. 어쨌거나 우리가 함수를 만드는 이유는 큰 개념을 (다시 말해, 함수 이름을) 다음 추상화 수준에서 여러 단계로 나눠 수행하기 위해서가 아니던가.
함수가 '한 가지'만 하는지 판단하는 방법 - 단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.
Switch 문
switch 문은 작게 만들기 어렵다! 다형적 객체를 생성하는 코드 안에서만 꽁꽁 숨겨서 사용하자. - 그렇다고 모든 상황에서 이렇게만 쓰일 수는 없다.
서술적인 이름을 사용하라!
함수의 좋은 이름: 함수가 하는 일을 잘 표현하는 이름
"코드를 읽으면서 짐작했던 기능을 각 루틴이 그대로 수행한다면 깨끗한 코드라고 불러도 되겠다."
길고 서술적인 이름이 짧고 어려운 이름보다 좋다. 길고 서술적인 이름이 길고 서술적인 주석보다 좋다. 함수 이름을 정할 때는 여러 단어가 쉽게 읽히는 명명법을 사용한다.
모듈 내에서 함수 이름은 같은 문구, 명사, 동사를 사용한다.
함수 인수
함수에서 이상적인 인수 개수는 0개. 다음은 1개, 2개이다. 3개는 가능한 피하는 편이 좋고 4개 이상은 사용하지 않는게 좋다.
- 함수에 인수를 1개 넘기는 이유
1. 인수에 질문을 던지는 경우
boolean fileExists("MyFile") // String 형식으로 받은 파일 이름이 존재하는지 확인하는 함수
2. 인수를 뭔가로 변환해 결과를 반환하는 경우
InputStream fileOpen("MyFile") // String 형식의 파일 이름을 InputStream으로 리턴받는다.
3. 이벤트- 드물게 사용하지만 아주 유용한 함수 형식이다.
- 입력인수만 있으며 출력인수는 없다.
- 이벤트 함수는 해당 함수가 이벤트라는 사실이 코드에 명확히 드러나야 한다.
passwordAttemptFailedNtimes(int attempts) // 비밀번호를 몇 번 틀렸는지 알려주는 함수다
부수효과를 일으키지 마라!
함수에서 하기로 했던 행위 이외의 행위, 즉 부수효과를 일으키지 마라.
- 함수명에서 드러나지 않는 행위를 하는 위험에 처한다.
- 시간적인 결합 즉, 특정상황에서만 해당 함수를 호출할 수 있게 된다.
명령과 조회를 구분하라
함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다. 둘 다 하면 혼란을 초래한다.
오류 코드보다 예외를 사용하라!
명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 미묘하게 위반한다. 자칫하면 if 문에서 명령을 표현식으로 사용하기 쉬운 탓이다.
if (deletePage(page) == E_OK)
위 코드는 동사/형용사 혼란을 일으키지 않는 대신 여러 단계로 중첩되는 코드를 야기한다. 오류 코드를 반환하면 호출자는 오류 코드를 곧바로 처리해야 한다는 문제에 부딪힌다.
Try/Catch 블록 뽑아내기
try/catch 블록은 원래 추하다. 코드 구조에 혼란을 일으키며, 정상 동작과 오류 처리 동작을 뒤섞는다. 그러므로 try/catch 블록을 별도 함수로 뽑아내는 편이 좋다.
반복하지 마라!
중복은 소프트웨어의 모든 악의 근원이다.
구조적 프로그래밍
모든 함수와 함수 내 모든 블록에 입구(entry)와 출구(exit)가 하나만 존재해야 한다. 즉, 함수는 return 문이 하나여야 한다. 루프 안에서 break나 continue는 절대로 안된다.
결론 - 함수를 어떻게 짜죠?
소프트웨어를 짜는 행위는 여느 글짓기와 비슷하다. 논문이나 기사를 작성할 때는 먼저 생각을 기록한 후 읽기 좋게 다듬는다. 초안은 대개 서투르고 어수선하므로 원하는 대로 읽힐 때까지 말을 다듬고 문장를 고치고 정리한다.
함수를 짤 때도 마찬가지다. 처음에는 길고 복잡하다. 들여쓰기 단계도 많고 중복된 루프도 많다. 인수 목록도 아주 길다. 이름은 즉흥적이고 코드는 중복된다. 하지만 나는 그 서투른 코드를 빠짐없이 테스트하는 단위 테스트 케이스도 만든다.
그런 다음 코드를 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거한다. 메서드를 줄이고 순서를 바꾼다. 때로는 전체 클래스를 쪼개기도 한다. 누구도 처음부터 탁 짜내지 않는다.
진짜 목표는 시스템이라는 이야기를 풀어가는 데 있다는 사실을 명심해야 한다. 우리가 작성하는 함수가 분명하고 정확한 언어로 깔끔하게 같이 맞아떨어져야 이야기를 풀어가기가 쉬워진다는 사실을 기억해야 한다.
🎈 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요.
이론적으로는 알고 있던 내용들이었는데, 사실 실무에서는 짧고 간단한 이름을 주로 사용했던 것 같다.
작게 만들기, 한 가지만 하기, 서술적인 이름을 사용하기, 인수는 되도록이면 적게!
처음부터 잘 짜여진 코드는 누구에게도 어려운 것이라고 하니 좀 위안이 되었다. 나도 그동안 내가 했던 코드들을 잘 리팩토링 해보며 개선해 가야 겠다!
🎈 궁금한 내용이나, 잘 이해되지 않는 내용이 있다면 적어보세요.
다형성(polymorphism)이란?
: 프로그램 언어 각 요소들(상수, 변수, 식, 객체, 메소드 등)이 다양한 자료형(type)에 속하는 것이 허가되는 성질