Pada modul ini kita akan membahas cara menambahkan extension pada builder yang telah ada dengan menggunakan pendekatan functional programming.
Berikut contoh code penerapan function programming untuk melakukan extension pada builder.
package main import "fmt" type Person struct { name, position string } type personMod func(*Person) type PersonBuilder struct { actions []personMod } func (b *PersonBuilder) Called(name string) *PersonBuilder { b.actions = append(b.actions, func(p *Person) { p.name = name }) return b } func (b *PersonBuilder) Build() *Person { p := Person{} for _, a := range b.actions { a(&p) } return &p } // extend PersonBuilder func (b *PersonBuilder) WorksAsA(position string) *PersonBuilder { b.actions = append(b.actions, func(p *Person) { p.position = position }) return b } func main() { b := PersonBuilder{} p := b.Called("Budi").WorksAsA("Kasir").Build() fmt.Println(*p) }
Idenya adalah membuat list dari aksi yang akan dilakukan, yang akan dieksekusi belakangan. Lihat code berikut:
type PersonBuilder struct {
actions []personMod
}
Misalnya, fungsi awal yang dibuat adalah untuk mengisi data name.
func (b *PersonBuilder) Called(name string) *PersonBuilder {
b.actions = append(b.actions, func(p *Person) {
p.name = name
})
return b
}
Ketika dibutuhkan menambahkan data pekerjaa, dapat dilakukan extension pada builder.
func (b *PersonBuilder) WorksAsA(position string) *PersonBuilder {
b.actions = append(b.actions, func(p *Person) {
p.position = position
})
return b
}