함수형 코딩 #2
함수형 코딩, 에릭 노먼드
챕터 8, 계층형 설계 1
계층형 설계란 ?
- 테스트, 재사용, 유지보수가 용이하도록 소프트웨어 코드를 Layer로 쌓아올리는 설계
- 원칙 1, 계층형 설계에서 의존성 방향은 위에서 아래로 향한다. 즉, 동일 계층에서의 함수들을 서로 참조하지 않는다. 만약 그런경우라면 더 추상화가 가능하다.
- 원칙 2, 코드가 읽기 어려운 이유는 여러 계층이 섞여있어서 그렇다. 아래의 예시의 계층을 보자.
- 장바구니 비즈니스 규칙 - Top
- 일반 비즈니스 규칙
- 장바구니 기본 동작
- 제품 기본 동작
- 함수형 유틸
- javascript 언어 기능 - Bottom
- 동일한 계층의 함수들은 하위 계층의 함수들을 이용해서 구현한다. 동일 계층을 서로 참조하지 않는다. 여러 수준의 함수로 구현되었다면 코드스멜이다.
계층형 설계의 4가지 패턴
- 1, 직접구현 : 최상위 계층이 최하위 계층을 참조한다면 코드스멜이다. 적절한 만큼의 하위 계층을 참조해야 한다.
- 2, 추상화 벽
- 3, 작은 인터페이스
- 4, 편리한 계층
좋은 설계인지 판단하고 직관 키우는 방법
- 호출 그래프로 정리해본다.
- 그리고 각 계층에 범주를 정의해서 모든 계층에 적절한 함수가 있는지 확인한다.
- 호출 그래프에서의 의존성 방향이 위 원칙에서 벗어나는지 확인한다.
- 완벽한 정답은 없다만, 계층 구조를 탄탄히 만들어가는 점진적 과정에서 직관이 키워진다.
리액트에서 계층 구조 생각하기
- View Binder : 뷰에 필요한 데이터 변형
- View: 화면단에서 이벤트 처리 수준
- View: 디자인 시스템 컴포넌트
- 토큰, 아톰, 컴포넌트, 패턴
챕터 9, 계층형 설계 2
계층형 설계의 4가지 패턴
1, 직접 설계 : 하위 계층을 이용해서 함수를 구현하는 것
- 만약 너무 깊은 계층을 사용해서 구현을 하고 있으면 코드 스멜을 의심한다. (호출 그래프의 화살표의 길이가 긴 경우 )
- 즉, 동일한 계층은 하위 동일한 Level의 계층을 이용해서 만드는게 좋다.
2, 추상화 벽 : Backend와 API 인터페이스를 미리 정하는것과 비슷하다.
- 추상화의 벽을 세우고 위쪽에는 비즈니스 로직 아래쪽에는 데이터를 다루는 로직으로 계층 분리.
- 그러면 데이터 자료구조가 바뀌어도 비즈니스 로직은 그대로 유지가 가능하다.
- 장점 1, 쉽게 구현 변경 - 추상화의 벽 기준으로 상위 수준은 아래의 변경사항과 독립적
- 장점 2, 추상화는 뇌 용량의 한계를 극복하여 문제 해결과 커뮤니케이션 비용을 절감해준다.
-- 장바구니 비즈니스 규칙 - Top
-- 일반 비즈니스 규칙 --- (1) 비즈니스 추상화의 벽
-- 장바구니 기본 동작 --- (2) 장바구니 자료구조를 배열에서 객체로 변경하면 이 레이어를 수정해야 한다. (1)은 건드릴 필요가 없다. 당연히 호출하는 4번 함수들도 변경되어야 ㅎㄴ다.
-- 제품 기본 동작
-- 함수형 유틸 --- (4)
-- javascript 언어 기능 - Bottom
3, 작은 인터페이스 : 시스템이 커질수록 작고 강력한 기능의 인터페이스로 만드는게 좋다.
- 로그를 남길 위치는 추상화의 벽 위 비즈니스 규칙 중 액션에 해당하는 함수에 남기는게 좋다.
- 로그는 액션이고 하위 계층에 두는 순간 액션이 전체로 번진다.
4, 편리한 계층 : 현재 코딩작업에 문제없이 진행되면 아직은 괜찮다. 완벽한 계층은 없다.
계층별 유지보수, 재사용성, 테스트 관점 장단점
- 하위 계층을 상위에서 많이 사용 하면 테스트 가치가 더 높다.
- 하위 계층을 상위에서 많이 사용 하기 좋기 때문에, 재사용성 높다.
- 상위 계층은 의존하는 함수가 적어 자주 변경하거나 새로 만들기 좋다.
-- 장바구니 비즈니스 규칙 --- 상위 계층 - 장점 : 유지보수 쉬움(변경, 생성 쉬움)
-- 일반 비즈니스 규칙
-- 장바구니 기본 동작
-- 제품 기본 동작
-- 함수형 유틸
-- javascript 언어 기능 --- 장점 : 테스트 가치 높음, 재사용성 높음