Do 표기법은 Haskell 및 Scala와 같은 함수형 프로그래밍 언어에서 주로 사용되는 구문 설탕입니다. 모나드 연산의 연결을 단순화하여 코드를 더 읽기 쉽고 유지 관리하기 쉽게 만듭니다. 이 기능을 Go에 도입함으로써 이제 모나드로 작업할 때 더 깔끔하고 표현력이 풍부한 코드를 작성할 수 있습니다.
모나드를 다룰 때, 특히 복잡한 비즈니스 로직에서 연결 작업이 번거로울 수 있습니다. 오류를 처리하고 다양한 상태를 관리하면 따라가기 어려운 구조가 깊게 중첩되는 경우가 많습니다. Do 표기법을 사용하면 명령형 프로그래밍과 유사하지만 함수형 프로그래밍의 모든 이점을 활용하여 순차 스타일로 모나드 연산을 작성할 수 있습니다.
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 함수를 사용하여 원활하게 연결될 수 있는 결과를 반환하므로 깔끔하고 읽기 쉬운 오류 처리가 보장됩니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!