03. 함수
가장 기본적인 단위 함수, 깔끔한 함수를 만들기 위한 지침들 소개
#
작게 만들기- ~4 줄 이하로 작성 권장...
- 들여쓰기 수준은 3단 이상 X
#
한 가지만 수행- 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그함 수는 여러작업을 하는 것이다
- 지정된 함수 이름 추상화 수준이 하나인 단계만 수행
#
함수 당 추상화 수준은 하나- 함수 내 코드는 같은 추상화 수준을 유지
- 위에서 아래로 코드 읽기: 내려가기 규칙
- 위에서 아래로 이야기처럼 읽혀야 좋음
#
Switch 문- Switch 문은 추상 팩토리 패턴으로 꼭꼭 숨기기
- 다시 말해, interface 구현체로 숨겨 사용자가 파악할 필요 없게 하기
- 한번 정돈 참자~
#
서술적인 이름 사용- 함수가 작고 단순할 수록 서술적인 이름을 고르기 쉬워짐
- 길고 서술적인 이름이 짧고 어려운 이름보다 나음
#
함수 인수- 적을 수록 좋음!
- 인수가 만다면 어떤 개념을 추상화할 수 있는지 보자
- 클래스화 하여 인수객체로 넘길 수 있음
- 테스트 관점에서도 인수가 많을 수록, 다양한 케이스를 검사해봐야 해 힘듦
- 출력 인수 XXXXXXXXXXX
- 여기서 출력인수는 레퍼런스 타입이라 인수로 받았는데 해당 인수를 수정하는 것
#
단항 형식 유형- 인수로 뭔가 변환해 결과를 반환하는 경우
- 이벤트 형식: 입력 인수로 시스템 상태를 바꿈
#
플래그 인수- 사용안하는 것을 권장
- 플래그 인수로 분기친다는 의도니 역할이 두개 이상일 가능성이 높음
#
인수 목록String.format
은 가변 인수를 사용하는데 이 가변인수는 하나의 인수라도 봐도 무방
#
동사와 키워드- 함수는 행위를 나타내므로, 동사로 시작해서 명사와 쌍을 이루도록 구성
- 함수 이름에 키워드를 추가하면 인수의 순서를 기억할 필요가 없음
- 물론 요즘 IDE가 좋아서 바로 파악 가능하긴 함
#
부수효과 X- 함수의 이름과는 다른 짓 X
- 이는 시간적 결합이나 순서 종속성을 야기함
checkPassword()
라는 함수에서Sessions.initialize()
의 코드가 들어있다면- 세션을 초기화해도 괜찮은 경우에만 호출이 가능하기 때문에 시간적 결합을 야기함
- 출력 인수도 부수효과의 예
- 정말 어쩔 수 없는 경우가 아니라면 사용 X
#
명령/조회 분리- 뭔가를 수행(명령) 하거나 답하거나(조회) 둘중 하나만 해야함
#
오류 코드를 정의하기 보단 예외 사용- 오류 코드로 작성하면 무수한 if 분기가 탄생하고 중첩됨
- 예외를 사용해서 중첩을 줄이자
#
반복 XDRY: Don't Reapeat Yourself
- 많은 원칙과 기법이 중복을 없애거나 제어할 목적으로 나옴
- RDB, OOP, AOP, 구조적 프로그래밍, COP 등
#
구조적 프로그래밍- OOP에선 함수를 작게 만든다면 구조적 프로그래밍에서 권장하지 않는 return, break, continue 를 여러차례 사용해도 됨
#
그래서 어떻게 함수를 짬?코드짜는게 글쓰기와 비슷하 보통 다음과 같은 과정을 거치게 되더라
- 초안 코드 작성
- 테스트 코드 작성 (TDD 는 테스트 코드부터 짜겠죵?)
- 코드 리팩토링
#
결론- 마스터 프로그래머는 시스템을 구현할 프로그램이 아니라
풀어갈 이야기
로 보더라~ - 해당 장은 함수를 잘 만드는 가이드라인들을 배움