함수형 옵션 패턴 (Functional Options Pattern)
함수형 옵션 패턴은 함수가 선택적 인수를 허용하는 함수형 프로그래밍 에서 유래했다. 함수형 옵션 패턴을 사용하여 기존 함수 구조를 손상시키지 않고 확장할 수 있는 유여한 인터페이스를 제공한다.
Go에서는 구조체를 단순화 하기 위해서 사용하며 서로 다른 매개변수를 가진 많은 생성자를 정의하는 대신 다양한 함수 옵션을 허용하여 단일 생성자를 정의할 수 있다.
type ClientOptions struct {
Url string
Port int
Method string
}
type Option func(*ClientOptions) error
func WithUrl(url string) Option {
return func(co *ClientOptions) error {
co.Url = url
return nil
}
}
func WithPort(port int) Option {
return func(co *ClientOptions) error {
co.Port = port
return nil
}
}
func WithMethod(method string) Option {
return func(co *ClientOptions) error {
co.Method = method
return nil
}
}
func NewClient(opts ...Option) (*ClientOptions, error) {
var co ClientOptions
for _, opt := range opts {
err := opt(&co)
if err != nil {
return nil, err
}
}
return &co, nil
}
func main() {
client, err := NewClient(WithUrl("http://localhost"), WithPort(8080), WithMethod("GET"))
if err != nil {
panic(err)
}
log.Println(client.Port)
log.Println(client.Url)
log.Println(client)
}
결론
함수형 옵션 패턴은 가변적인 파라메터가 있을때 생성자 함수의 로직을 단순화 하고 유지 보수성을 높여 줄수 있다. 기존 코드의 변경 없이 옵션을 추가할 수 있으므로 재사용성이 높은 코드를 작성 할 수 있다.