"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Golang용 Mo 패키지에 Do 표기법 도입

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

2024-08-15에 게시됨
검색:624

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 표기 사용

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 표기법은 오류 전파를 자동으로 처리하고 오류가 발생하면 실행을 단락시킵니다. 이를 통해 더 깔끔하고 유지 관리하기 쉬운 코드가 생성되며, 이는 복잡한 워크플로에서 특히 유용합니다.

릴리스 선언문 이 글은 https://dev.to/taman9333/introducing-do-notation-in-the-mo-package-for-golang-1jpc?1에서 복제됩니다. 침해 내용이 있는 경우, [email protected]으로 문의하시기 바랍니다. 그것을 삭제하려면
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3