김동형수 개발기

Grokking Functional Programming - 2부 7장 본문

책 스터디/[완료] FP - Grokking Funtional Programming

Grokking Functional Programming - 2부 7장

김동형수 2023. 1. 4. 22:21

7 유형으로서의 요구사항

이 장에서는 다음을 수행하는 방법을 배웁니다.

  • 오류를 최소화하기 위해 불변 데이터 모델링
  • 불변 데이터로 요구 사항 모델링
  • 컴파일러를 사용하여 요구 사항에서 문제 찾기
  • 논리가 항상 유효한 데이터에서 실행되는지 확인하십시오.
유효하지 않은 인스턴스를 허용하며 프로그래머가 코드에서 각 인스턴스를 처리하도록 합니다.

재미있는 점은 그것들이 모두 String  Int 와 같은 기본 유형을 사용하여 실제 세계의 더 복잡한 비즈니스 엔터티 및 관계를 모델링 하는 것에서 비롯 되었다는 것입니다.

위의 세 가지 요구 사항 중에서 처음 두 개는 행동 요구 사항 이고 마지막 하나는 데이터 요구 사항 입니다. 지금까지 동작(함수)에 중점을 두었고 데이터 요구 사항을 간단한 유형( String s, Int s, Boolean s)으로 모델링했습니다. 우리는 이 접근 방식으로 시작하여 행동과 데이터 모두에 더 안전한 함수형 프로그래밍 기술을 사용하도록 빠르게 전환할 것입니다.

 
이 책에서는 "데이터 모델링"과 "데이터 설계"라는 단어를 같은 의미로 사용합니다. 그것들은 같은 것을 의미합니다. 즉, 비즈니스 엔티티를 데이터 구조로 전송하는 방법입니다.
 
이 책은 코드베이스의 가독성과 유지보수성에 중점을 둡니다. 우리는 이 측면에서 프리미티브 유형 기반 모델링이 좋은 선택이 아니라고 주장합니다.
 
이런 종류의 실수로부터 우리 자신을 보호할 수 있는 매우 간단한 기술이 있으며, 그 과정에서 우리의 삶을 훨씬 더 쉽게 만듭니다. 이를 newtype 이라고 합니다. "제로 비용 래퍼"라고도 합니다. String 과 같은 기본 유형을 사용하는 대신 명명된 유형으로 "래핑"합니다.
 
함수형 프로그래밍 기술을 사용하여 이 패턴에 접근하는 두 가지 방법인 옵션 유형과 대수 데이터 유형 을 보여드리겠습니다
 
순수 함수(동작)의 반환 유형으로 Option 유형을 사용
 
Option 을 사용하는 것은 기본 유형을 사용하는 것만큼 간단하지 않습니다
 

Option의 비교하는 고차함수 forall, exist

forall 은 주어진 Option 내부의 요소 ( Option  Some 인 경우)가 익명 함수로 전달된 조건을 만족하거나 Option 내부에 요소가 없는 경우 (즉, None 인 경우) true 를 반환

 

exist는 none인 경우 false를 반환

두 매개변수가 연도 단위로 기간을 나타내는 단일 엔터티로 함께 결합됩니다. 끝은 여전히 ​​이 값이 없을 수 있음( None )을 전달하는 Option 으로 표시되어 이러한 Period 인스턴스를 개방형으로 만듭니다.

 

FP에서는 합계 유형 의 작업입니다 . Scala에서는 enum 으로 인코딩됩니다 .

 

특정 아티스트가 활동한 기간을 연 단위로 모델링하고 싶었습니다. 지금까지 찾은 두 가지 옵션이 있습니다. 아티스트가 여전히 활동 중일 수 있으며 기간이 제한되어 있거나( end = None ) 아티스트가 더 이상 활동하지 않고 고정된 기간이 있습니다( end = Some(endYear) ). .

우리가 방금 쓴 것을 눈치채셨나요? 두 가지 옵션 이 있습니다 . 동일한 아티스트 에 대해 함께 사용할 수 없으며 유일하게 가능한 값입니다. 그것은 우리가 유한한 가능성을 모델링했을 때와 정확히 같은 경우입니다. 합계 유형을 다시 사용해야 합니다 !

enum YearsActive {
  case StillActive(since: Int)
  case ActiveBetween(start: Int, end: Int)
}

제품 유형 + 합계 유형 = 대수 데이터 유형(ADT)

 

패턴 일치 ( java 14인가 17에서 추가된 기능인데, 함수형 데이터 모델링을 더 강력하게 해주는 것이라고 지금 이해한다. )

 

ADT, 패턴 매칭, 뉴타입 !

Comments