본문 바로가기

함수형 프로그래밍

(14)
설계를 깔끔하게 발전시키기 https://pragprog.com/titles/swdddf/domain-modeling-made-functional/ Domain Modeling Made Functional Use domain-driven design to effectively model your business domain, and implement that model with F#. pragprog.com 해당 책의 마지막 장입니다(13) TLDR : 초이스 타입을 이용해 관심사가 유사한 필드를 하나의 차원으로 통합하라! 도메인 모델의 구현이 끝이 아닙니다. 요구 사항이 변경되면 모델이 지저분해지고 다양한 하위 시스템이 얽혀 테스트하기 어려워집니다. 이제 마지막 과제가 있습니다. 시스템에 영양을 최소화하면서 설계가 발전할 수 있..
DDD 구현 : 모나드와 Async Monads and More 모나드는 "모나딕" 함수를을 직렬로 연결할 수 있는 프로그래밍 패턴일 뿐입니다. "모나딕" 함수는 무엇입니까? "normal" 값을 취하고 일종의 "enhanced" 값을 반환하는 함수입니다. 오류 처리 접근 방식에서 "enhanced" 값은 Result type에 래핑된 것이므로 모나딕 함수는 Result 생성 "switch" 함수의 종류입니다. (Ok, 혹은 serviceExceptionAdaptor) (아래의 switchFn 위치에 들어가는 Result 생성자 + map 기능 결합 함수) 모나딕 함수 (return) // 생성자 함수 예시 ​/// "Adapter block" that converts exception-throwing services​ ​ ​/// int..
DDD 구현 : 파이프라인에 모나드 적용하기, computation expression https://itchallenger.tistory.com/428 DDD 구현 : 모나드로 Result 생성 함수 연결 Result type을 생성하는 함수끼리 깔끔하게 합성하는 법을 알아봅시다. 다음은 문제의 시각적 표현입니다. 일반 함수는 철도 트랙의 일부로 시각화할 수 있습니다. 그러나 Result 출력이 있는 함수는 itchallenger.tistory.com 이전 게시물에서 모나드를 설명했습니다. 비동기 효과와 서비스 종속성을 무시하면서 파이프라인의 구성 요소를 빠르게 다시 살펴보겠습니다. 첫째, ValidateOrder는 입력 데이터가 올바른 형식이 아닌 경우 오류를 반환하므로 "switch" 함수이고 서명은 다음과 같습니다. (switch 함수는 생성자입니다~) ​type​ Validate..
DDD 구현 : 오류 모델링 제품 코드의 형식이 잘못되었거나 고객 이름이 너무 길거나 주소 확인 서비스가 시간 초과되면 어떻게 될까요? 모든 시스템에는 오류가 있으며 이를 처리하는 방법이 중요합니다. 일관되고 투명한 오류 처리는 모든 종류의 시스템에 중요합니다. Result type 시그니처를 다루는 방법을 알아봅니다. 우리는 못생긴 조건문과 try/catch 문으로 코드를 오염시키지 않고 오류를 우아하게 캡처하는 함수형 접근 방식을 탐구합니다. 또한 특정 종류의 오류를 도메인 오류로 처리해야 하는 이유를 살펴봅니다. 해당 오류들은 도메인 주도 설계의 연장입니다. Result type으로 에러를 명확히 표현하기 함수형 프로그래밍 기술들은 무언가를(값, 타입, 오류 등) 가능한 한 명확하게 만드는 데 중점을 두며 이는 오류 처리에도 ..
함수 파이프라인 합성하기 with F# 2. 작은 파이프라인 조합하기 이제 서브스텝의 구현을 하나의 파이프라인으로 합성하여 워크플로를 완료할 준비가 되었습니다. ​ ​let​ placeOrder : PlaceOrderWorkflow = ​ ​fun​ unvalidatedOrder -> ​ unvalidatedOrder ​ |> validateOrder ​ |> priceOrder ​ |> acknowledgeOrder ​ |> createEvents 그러나 validateOrder에는 UnvalidatedOrder 외에 두 개의 추가 입력(의존성)이 있다는 문제가 있습니다. 현재로서는 PlaceOrder 워크플로의 입력을 validateOrder 함수에 연결하는 쉬운 방법이 없습니다. 입력과 출력이 일치하지 않기 때문입니다. 다양한 "모양"의 함수를 합성하는 것은 함수형 ..
함수 파이프라인 합성하기 with F# 1. 검증 로직 구현하기 https://pragprog.com/titles/swdddf/domain-modeling-made-functional/ Domain Modeling Made Functional Use domain-driven design to effectively model your business domain, and implement that model with F#. pragprog.com 이펙트 시그니처를 피해가며 파이프라인의 단계를 구현하고, 종속성을 주입하는 방법을 알아봅니다. 또한 세 가지 함수형 프로그래밍 패턴을 알아봅니다. "adapter function"를 사용하여 함수를 한 "모양"에서 다른 "모양"으로 변환. (ex : checkProductCodeExists의 출력을 bool에서 ProductC..
DDD 기능 구현을 위한 함수 이해하기 with F# https://pragprog.com/titles/swdddf/domain-modeling-made-functional/ Domain Modeling Made Functional Use domain-driven design to effectively model your business domain, and implement that model with F#. pragprog.com 해당 시리즈는 Domain Modeling Made Functional 책의 번역 및 정리 내용입니다. Functions, Functions, Everywhere 먼저 함수형 프로그래밍이 객체 지향 프로그래밍과 왜 다른지 살펴보겠습니다. 함수형 프로그래밍은 함수를 가장 중요한 것으로 다루며 프로그래밍하는 것입니다. 대부분의 모..
파이프라인으로 워크플로 모델링하기 - 워크플로 합성 및 나머지 서브스텝을 조합하여 워크플로 만들기 이제 모든 단계에 대한 정의가 있습니다. 따라서 각각에 대한 구현이 있을 때 한 단계의 출력을 다음 단계의 입력에 연결하여 전체 워크플로를 구축할 수 있어야 합니다. 하지만 그렇게 간단하지 않을 것입니다! 입력과 출력만 나열되도록 종속성을 제거한 상태에서 모든 단계의 정의를 한 곳에서 살펴보겠습니다. ​ ​type​ ValidateOrder = ​ UnvalidatedOrder ​// input​ ​ -> AsyncResult ​// output​ ​ ​ ​type​ PriceOrder = ​ ValidatedOrder ​// input​ ​ -> Result ​// output​ ​ ​ ​type​ AcknowledgeOrder = ​ PricedOrder ​// i..