Golang용 Mo 패키지에 Do 표기법 도입

王林
풀어 주다: 2024-07-16 16:32:12
원래의
731명이 탐색했습니다.

Introducing Do Notation in the Mo Package for Golang

Do 표기법이란 무엇입니까?

Do 표기법은 Haskell 및 Scala와 같은 함수형 프로그래밍 언어에서 주로 사용되는 구문 설탕입니다. 모나드 연산의 연결을 단순화하여 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만듭니다. 이 기능을 Go에 도입함으로써 이제 모나드로 작업할 때 더 깔끔하고 표현력이 풍부한 코드를 작성할 수 있습니다.

표기법을 왜 하는가?

모나드를 다룰 때, 특히 복잡한 비즈니스 로직에서 연결 작업이 번거로울 수 있습니다. 오류를 처리하고 다양한 상태를 관리하면 따라가기 어려운 구조가 깊게 중첩되는 경우가 많습니다. Do 표기법을 사용하면 명령형 프로그래밍과 유사하지만 함수형 프로그래밍의 모든 이점을 활용하여 순차 스타일로 모나드 연산을 작성할 수 있습니다.

Mo 패키지에서는 어떻게 작동하나요?

Go에서는 do 표기법을 구현하는 것이 쉽지 않았지만 Do 함수를 사용하여 구현했습니다. 예를 들어 어떻게 사용하는지 간단히 살펴보겠습니다.

package main

import (
    "errors"
    "fmt"
    "github.com/samber/mo"
)

func validateBooking(params map[string]string) mo.Result[map[string]string] {
    if params["guest"] != "" && params["roomType"] != "" {
        return mo.Ok(params)
    }
    return mo.Err[map[string]string](errors.New("validation failed"))
}

func createBooking(guest string) mo.Result[string] {
    if guest != "" {
        return mo.Ok("Booking Created for: " + guest)
    }
    return mo.Err[string](errors.New("booking creation failed"))
}

func assignRoom(booking string, roomType string) mo.Result[string] {
    if roomType != "" {
        return mo.Ok("Room Assigned: " + roomType + " for " + booking)
    }
    return mo.Err[string](errors.New("room assignment failed"))
}

// This could be a service package that performs the entire process
func bookRoom(params map[string]string) mo.Result[[]string] {
    return mo.Do(func() []string {
        // Validate booking parameters
        values := validateBooking(params).MustGet()

        // Create booking
        booking := createBooking(values["guest"]).MustGet()

        // Assign room
        room := assignRoom(booking, values["roomType"]).MustGet()

        // Return success with booking and room details
        return []string{booking, room}
    })
}

func main() {
    params := map[string]string{
        "guest":   "Foo",
        "roomType": "Suite",
    }

    result := bookRoom(params)
    if result.IsError() {
        fmt.Println("Error:", result.Error())
    } else {
        fmt.Println("Success:", result.MustGet())
    }
}
로그인 후 복사

이 예에서 bookRoom은 Do 함수를 사용하여 예약 매개변수 확인, 예약 생성, 객실 할당 등 여러 작업을 순차적으로 수행합니다. 각 단계는 Do 함수를 사용하여 원활하게 연결될 수 있는 결과를 반환하므로 깔끔하고 읽기 쉬운 오류 처리가 보장됩니다.

bookRoom 기능 비교

DO 표기 없음

두 가지 옵션이 있습니다:

1. 바인딩 사용(구현된 경우):
모나드의 "바인드" 작업은 이러한 작업의 중첩되고 순차적인 특성으로 인해 모나드 작업이 많을 때 콜백 지옥과 유사할 수 있습니다. 이러한 작업이 많이 연결되면 코드가 깊게 중첩되어 읽기가 더 어려워질 수 있습니다. 이는 비동기 프로그래밍에서 콜백이 얼마나 깊게 중첩될 수 있는지와 유사합니다. Mo 패키지에 바인드가 구현된 경우 이 예에서 이를 사용하면 다음과 같습니다.

func bookRoom(params map[string]string) mo.Result[[]string] {
    return bind(validateBooking(params), func(values map[string]string) mo.Result[[]string] {
        return bind(createBooking(values["guest"]), func(booking string) mo.Result[[]string] {
            return bind(assignRoom(booking, values["roomType"]), func(room string) mo.Result[[]string] {
                return mo.Ok([]string{booking, room})
            })
        })
    })
}
로그인 후 복사

이러한 접근 방식은 읽기 및 유지 관리가 금방 어려워집니다.

2. .Get() 사용:
또 다른 옵션은 모나드에서 .Get()을 사용하여 모나드를 풀고 기본 값과 오류를 얻는 것입니다. 이는 일반적인 Go 코드처럼 보이지만 오류 처리가 장황할 수 있습니다.

func bookRoom(params map[string]string) mo.Result[[]string] {
    values, err := validateBooking(params).Get()
    if err != nil {
        return mo.Err[[]string](err)
    }

    booking, err := createBooking(values["guest"]).Get()
    if err != nil {
        return mo.Err[[]string](err)
    }

    room, err := assignRoom(booking, values["roomType"]).Get()
    if err != nil {
        return mo.Err[[]string](err)
    }

    return mo.Ok([]string{booking, room})
}
로그인 후 복사

이 접근 방식은 바인드를 사용하는 것보다 읽기 쉽지만 여전히 상용구 오류 처리가 많이 필요합니다.

Do-Notation 사용

do 표기법을 사용하면 모나드에서 .MustGet()을 호출하여 오류 없이 기본 값을 직접 가져올 수 있습니다. 이 함수(MustGet())는 모나드에 오류가 있으면 패닉 상태가 됩니다. 그러나 do 표기법은 이를 처리하고 오류가 있거나 래핑되지 않은 값을 다시 반환하는 경우 실행을 단축합니다.

func bookRoom(params map[string]string) mo.Result[[]string] {
    return mo.Do(func() []string {
        values := validateBooking(params).MustGet()
        booking := createBooking(values["guest"]).MustGet()
        room := assignRoom(booking, values["roomType"]).MustGet()
        return []string{booking, room}
    })
}
로그인 후 복사

이 접근 방식은 깔끔하고 간결하며 읽기 쉬우므로 상용구 오류 처리 코드가 크게 줄어듭니다.


최종 생각

do 표기법을 사용하는 가장 큰 장점 중 하나는 모나딕 ​​연산을 수행할 때마다 오류를 확인할 필요가 없다는 것입니다. 모나드가 오류 유형을 가질 수 있더라도 do 표기법은 오류 전파를 자동으로 처리하고 오류가 발생하면 실행을 단락시킵니다. 이를 통해 더 깔끔하고 유지 관리하기 쉬운 코드가 생성되며, 이는 복잡한 워크플로에서 특히 유용합니다.

위 내용은 Golang용 Mo 패키지에 Do 표기법 도입의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!