본문 바로가기

F#

(12)
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 생성 함수 연결 Result type을 생성하는 함수끼리 깔끔하게 합성하는 법을 알아봅시다. 다음은 문제의 시각적 표현입니다. 일반 함수는 철도 트랙의 일부로 시각화할 수 있습니다. 그러나 Result 출력이 있는 함수는 다음과 같이 두 개로 분할되는 철도 트랙으로 시각화할 수 있습니다. 이러한 종류의 함수를 철도에 비유한 후 스위치 함수라 부를 것입니다. 종종 "모나딕" 함수라고도 합니다. 그렇다면 이러한 "스위치" 함수 중 두 개를 어떻게 연결해야 할까요? 출력이 성공하면 시리즈의 다음 함수로 넘어가고 싶지만, 출력이 오류라면 그림과 같이 우회하고 싶습니다. 두 오류 트랙이 모두 연결되도록 이 두 스위치를 어떻게 결합합니까? 다음과 같이 분명합니다. 그리고 이러한 방식으로 파이프라인의 모든 단계를 연결하면 다음과 같..
함수 파이프라인 합성하기 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..
파이프라인으로 워크플로 모델링하기 - 개요 및 상태 머신 이전 두 장에서 타입을 사용하여 일반적인 방식으로 도메인 모델링을 수행하는 방법을 보았습니다. 이 장에서는 거기서 배운 내용을 주문 처리(order-placing ) 워크플로에 적용할 것입니다. 그 과정에서 모든 워크플로를 모델링하는 데 유용한 여러 기술을 살펴보겠습니다. 목표는 항상 그렇듯이 도메인 전문가가 읽을 수 있는 것을 만드는 것입니다. 이제 주문하기 워크플로의 단계를 다시 살펴보겠습니다. 다음은 모델링해야 할 사항에 대한 요약입니다. ​ workflow "Place Order" = ​ input: UnvalidatedOrder ​ output (on success): ​ OrderAcknowledgmentSent ​ AND OrderPlaced (to send to shipping) ​ AND..
타입으로 도메인 모델링하기 with F# - Aggregate (집합체) 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 Order 및 OrderLine 타입에 대해 자세히 살펴보겠습니다. type OrderLine = { OrderLineId : int Price : float // etc } type Order = { OrderLines : OrderLine list // etc } 첫째, Order는 Entity인가요, Value Objec..