함수형 프로그래밍에 관한 기본기를 다지고 실전에서 사용하고 위한 방법을 다루는 책
→ 개인적으로 너무 기본만 다룬다는 생각은 들며, 리팩토링만 너무 중심이 된다
- 구조적 프로그래밍의 핵심
- 흐름 제어를 단순한 패턴으로 만드는데 집중
- 중첩 가능한 블록으로 순차적으로 실행되는 구문으로 여김
- 객체 지향 프로그래밍의 핵심
- 데이터 접근 구조에 집중하여 캡슐화에 중점
- 상속을 통한 복잡한 객체 구성
- 함수형 프로그래밍의 핵심
- 수학 함수를 이용하고 부수 효과를 피하고 순수 함수를 사용하는 프로그래밍 스타일
- 부수 효과를 잘 관리하는데 중점 → 계산, 액션의 분리
- 컬렉션을 하나 씩 처리하지 않고 한번에 처리
-
함수형 코드
- 프로그래머는 최대한 액션에서 계산을 빼내고, 계산에서는 데이터를 분리해 내야 합니다.
- 데이터 → 계산 → 액션 순으로 구현하게 된다
- 액션이 적을 수록 좋은 함수형 프로그래밍 코드가 된다
- 액션
- 호출하는 시점과 횟수에 따라 결과가 다른 함수
- 액션을 부르는 함수는 액션으로 분류된다
- 가능한 작게 작성되어야 한다
- 계산 ( 순수 함수 )
- 입력이 같다면 출력이 항상 같은 함수
- 횟수/시점과 무관한 코드
- 실행하기 전까지 결과를 알 수 없다
- 데이터
- 이벤트에 대해 기록한 사실
- 해석이 반드시 필요하다
-
Copy-On-Write
- 변경 가능한 데이터를 입력으로 하여 불변성을 유지 할 수 있도록 하는 함수
쓰기로 분류되는 액션을 읽기인 계산으로 변경하게 된다
- 쓰기와 읽기를 동시에 하는 함수는 함수를 분리하여 처리한다
- 주로 얕은 복사(Shallow copy) 를 이용하여 속도를 높인다
- 함수 구현 방법
- 입력에 대한 복사본 만들기
- 복사본의 데이터를 변경 ( 컬렉션의 경우 변경되는 데이터만 복사하고 나머지는 공유 한다 )
- 복사본을 리턴
-
Defensive Copy
- 신뢰할 수 없는 코드로부터 깊은 복사를 이용하여 불변성을 유지할 수 있도록 하는 함수
- Copy-On-Write를 사용할 수 없는 곳에서 사용
- 함수 구현 방법
- 외부 호출 직전에 복사본을 작성
- 복사본을 외부 코드에 전달
- 외부 코드에서 변경된 복사본에서 다시 복사본을 작성하여 사용
-
계층화 설계
- 상위 계층일수록 자주 변경되고, 하위 계층일수록 자주 바뀌지 않는 코드를 두는 설계 방식
- 상위 계층에서 하위 계층으로 갈수록 테스트의 효과가 크다
- 하위 계층일 수록 재 사용성이 높아진다
- 계층화 설계 지침
- 직접 구현
- 저 수준의 코드를 추출하여 코드를 명확히 한다
- 호출 그래프를 통해 정확한 계층을 추정한다 → 주로 바로 아래 계층을 호출하는 것이 좋다
- 헬퍼(유틸리티) 함수를 이용해
계층화 시킨것 처럼 보이게 만들지 않아야 한다
- 추상화 벽
- 데이터의 구조를 몰라도 함수를 사용할 수 있도록 만든 계층
- 팀 간의 책임을 명확하게 하고, 복잡한 것을 줄이기 위한 곳에만 사용
- 작은 인터페이스
- 새로운 기능을 추가할 때 상위 계층(추상화 벽 위)에 두는 설계 지침
- 추상화 벽에 코드가 많을 수록 개발에 어려움이 많기 때문에 사용
- 편리한 계층
- 지금 사용하는 코드가 편리하다면 설계를 더 하지 말아야 한다는 트레이드 오프 규칙
-
일급 함수의 이용
- 코드 스멜
- 암묵적 인자
- 함수에 암묵적 입/출력이 있다면 액션이 된다
- 주로 함수 이름에 필드를 결정하는 문자열이 존재한다
- 제거 리팩토링
- 암묵적 인자(하드 코딩)를 확인한다
- 입력은 함수의 인자로, 출력은 리턴으로 변경한다
- 함수를 호출하는 곳을 변경한다
- 일급이 아닌 문법
- 중복되는 코드가 계속 작성되어 코드 스멜
- 제거 리팩토링
- 함수 본문에서 앞/뒷부분을 확인한다
- 본문(차이가 있는 부분)을 함수로 추출한다
- 기존 함수에서 새로 추출된 함수를 함수 형태로 감싸 호출한다 → 직접 호출하게 되면 반드시 실행되므로 함수로 한번 감싸야 한다
- 함수형 도구 체이닝 = 스트림 결합
- 주로 쓰이는 함수형 도구: Map, Filter, Reduce, pluck, concat(flatmap), groupBy, countBy
- 함수형 도구를 하나로 조합하는 행위
- 체인을 명확하게 만드는 방법
- 단계에 이름 붙이기
- 콜백에 이름 붙이기 → 더 선호되는 방법
- 재귀 함수
- 반복문 대신 사용되기도 하나 중첩된(Nested) 데이터에도 사용된다
- For문보다 가독성이 좋다
- 구현 방법
-
타임라인 다이어그램
-
반응형 패턴와 어니언 아키텍처
- 데이터 지향: 이벤트와 엔티티에 대한 사실을 표현하기 위해 일반 데이터 구조를 사용하는 프로그래밍 형식