Skip to main content

함수형 코딩 #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 언어 기능 --- 장점 : 테스트 가치 높음, 재사용성 높음