go的with模式
这种方式称为链式调用。用来构建对象。
1.示例代码
package main
import "fmt"
type Field struct {
Name string
Description string
}
func NewField() *Field {
return &Field{}
}
func (f *Field) WithName(name string) *Field {
f.Name = name
return f
}
func (f *Field) WithDescription(desc string) *Field {
f.Description = desc
return f
}
func main() {
f := NewField().
WithName("tom").
WithDescription("this is a desc")
fmt.Println(*f)
}
看起来没必要使用WithName()、WithDescription()函数。
f := NewField()
f.Name = "tom"
f.Description = "this is a desc"
两段代码熟高熟低一看便知。
2.链式调用的优点
下面总结了一些使用链式调用的几个优点:
1.提高代码可读性:通过链式调用,可以清晰地看到对象的构建过程。
2.灵活性:使用构建器模式,你可以灵活地控制哪些字段是必须设置的,哪些是可选的。你可以通过方法的存在与否来隐式地表示这一点。
3.减少错误:由于链式调用通常涉及到多个方法的连续调用,并且每个方法都返回对象的引用,因此可以避免一些常见的错误,如忘记保存方法的返回值或错误地传递对象引用。
4.易于扩展:链式调用允许你在不修改现有代码的情况下添加新的字段设置方法。这意味着你可以在不破坏现有代码的情况下扩展对象的功能。相比之下,如果直接设置字段值,并且后来需要添加验证或转换逻辑,则可能需要修改多个地方的代码。
5.链式调用的限制:虽然链式调用有其优势,但它也有一些限制。例如,如果某个字段的设置依赖于另一个字段的值,那么链式调用的顺序就变得非常重要,这可能会增加代码的复杂性。此外,如果对象的状态在构建过程中需要根据某些条件动态变化,那么链式调用可能不是最佳选择。
6.集中校验逻辑:在链式调用的过程中,你可以在每个设置参数的方法中添加校验逻辑。这样做的好处是所有的校验逻辑都集中在与参数设置相关的方法中,使得校验的意图更加明显,也更容易维护。