일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 만들면서배우는클린아키텍처
- web
- 개발방법론
- 테스트
- 테스트주도개발
- 개발서적
- 스터디
- 도메인 주도 개발 시작하기
- 코틀린
- 아키텍처
- FP
- 이펙티브코틀린
- 유지보수
- Spring
- TDD
- Thymeleaf
- Kotlin
- 객체지향의사실과오해
- 함수형프로그래밍
- template
- 클린아키텍처
- 조영호
- 추상화 설계
- 헥사고날아키텍처
- GrokkingFunctionalProgramming
- Boot Legacy 차이점
- 계층형아키텍처
- DDD
- 책스터디
- Java
- Today
- Total
김동형수 개발기
Grokking Functional Programming - 2부 8장 본문
Grokking Functional Programming - 2부 8장
김동형수 2023. 1. 11. 20:048 값으로 IO
이 장에서는 다음을 수행하는 방법을 배웁니다.
- 값을 사용하여 부작용이 있는 프로그램을 나타냅니다.
- 안전하지 않은 출처의 데이터 사용
- 프로그램 외부에 데이터를 안전하게 저장
- 코드에 부작용이 있음을 나타냅니다.
- 순수한 코드와 불순한 코드 분리
외부 API 사용
안전하지 않은 코드
두 가지 유형의 IO 작업의 주요 속성은 여러 요인에 따라 다르게 동작할 수 있는 코드인 안전하지 않은 코드를 실행한다는 것입니다. 이것이 공유 가변 메모리 주소에서 읽고 쓰는 것이 안전하지 않은 것으로 취급되고 부작용이 있는 IO 작업 범주에 속하는 이유입니다. 순수 함수는 언제 어디에서 사용하든 항상 동일하게 동작해야 한다는 점을 기억하세요.
def schedule(attendees: List[String],
lengthHours: Int): IO[Option[MeetingTime]] = {
for {
existingMeetings <- scheduledMeetings(attendees)
possibleMeeting = possibleMeetings(scheduledMeetings,
8, 16, lengthHours).headOption
_ <- possibleMeeting match {
case Some(meeting) => createMeeting(attendees, meeting)
case None => IO.unit
}
} yield possibleMeeting
}
// We are yet to cover how the IO type works, but note how rich the signature is and what it says about the function.
// Additionally, note that this implementation is more versatile because it is able to schedule meetings for more than two people.
함수의 첫 번째 줄은 많은 코드베이스에서 볼 수 있는 것입니다. 그것은 두 가지 일을 하기 때문에 나쁘다:
- 아래에서 일부 IO 작업을 수행합니다(대부분 네트워크를 통한 API 호출).
- IO 작업의 결과( List<MeetingTime> )를 제공합니다.
우리 에게 정말 중요한 것은 행동 자체가 아니라 결과입니다
IO[A] 에는 몇 가지 구체적인 하위 유형이 있지만 단순성을 위해 여기서는 Pure[A] 및 Delay[A] 의 두 가지만 소개합니다 .
IO.pure 와 IO.delay 의 차이점은 전자는 즉시 평가의 예이고 후자는 지연 평가의 예라는 것입니다. 이 장의 뒷부분에서 이에 대해 더 깊이 논의할 것입니다.
IO.delay 는 코드 블록을 가져와 실행하지 않지만 이 전달된 코드 블록을 "나타내는" 값과 실행 시 생성할 값을 반환합니다.
IO[A] 는 특수 함수 unsafeRunSync() 를 실행하여 실행할 수 있습니다 .
IO 에도 flatMap 이 있다는 것이 밝혀졌습니다 !
def castTheDieTwice(): IO[Int] = {
for {
firstCast <- castTheDie()
secondCast <- castTheDie()
} yield firstCast + secondCast
}
// This whole for expression produces a value of type IO[Int]. It describes a program to be executed in a different place.
FP의 본질은 입력 값을 새로운 출력 값으로 변환하는 함수를 작성하는 것입니다 .
IO 를 드물게 사용해야 합니다 . 이 장에서는 IO 를 소개 하므로 많이 사용하지만 더 많은 것을 구현하면서 대부분의 논리를 순수한 비 IO 기능으로 추출하는 방법에 주목하십시오.
IO 값 내부에 복구 메커니즘도 인코딩할 수 있습니다!
orElse
이것은 FP에서 매우 일반적인 패턴입니다. 우리는 가능한 모든 비즈니스 관련 논리를 거짓말하지 않는 순수 함수로 추출하고 기능적 핵심으로 함께 묶고 개별적으로 테스트한 다음 주요 프로세스에서 사용합니다. 이렇게 하면 우려 사항이 점점 더 복잡해집니다. 그것이 기능적 아키텍처의 기초입니다.
회의 스케줄러 예제와 관련된 세 가지 추가 시나리오에서 IO 를 사용하는 방법을 보여드리겠습니다 . 첫 번째는 캐싱 입니다. 우리의 현재 솔루션은 API 호출이 실패할 때 캐시된 값을 얻을 수 있도록 예약된 회의에 캐시를 사용하는 것이 확실히 도움이 될 것입니다. 일반적으로 이것은 캐시에서 오래된 값을 제거하고, 캐시의 값을 업데이트하고, 캐시가 일관성이 있는지 확인하는 등 고려해야 할 여러 가지 문제가 있기 때문에 10장에서 자세히 논의할 주제입니다. 여기에서는 IO 유형 을 사용하여 구현하는 방법을 간략하게 보여줍니다 . 전체 솔루션은 다음과 같은 세 가지 추가 기능입니다 .
'책 스터디 > [완료] FP - Grokking Funtional Programming' 카테고리의 다른 글
Grokking Functional Programming - 2부 10장 (0) | 2023.01.26 |
---|---|
Grokking Functional Programming - 2부 9장 (0) | 2023.01.19 |
Grokking Functional Programming - 2부 7장 (0) | 2023.01.04 |
Grokking Functional Programming - 2부 6장 (0) | 2022.12.21 |
Grokking Functional Programming - 2부 5장 (0) | 2022.12.14 |