左耳听风_110_109_Go_编程模式Functional_Options
你好,我是陈浩网名做独house这节课啊,我们来讨论一下function options这个编程模式。
那这个呢是一个函数式编程的应用案例。
呃,编程技巧呢也很好是目前go语言中啊最流行的一种编程模式。
但是呢在正式讨论这个模式之前啊,我们先来看一看我们要解决什么样的问题。
首先呢我来说一说配置选项的问题。
在编程中呢,我们经常需要对一个对象进行相关的配置。
比如说文章里这个业务实体的例子是一个叫server的对象。
那我来简单介绍一下,在这个server对象中呢,我们可以看到他要有真听的IP地址、address和端口号port.那这两个配置选项呢是必填的,然后呢,它还有协议protocol、 timeout和max connections字段。
那这几个字段呢是不能为空的啊,但是呢是有默认值的。
比如说协议呢是TCP,超时三十秒和最大连接数一千零二十四个。
呃,它呢还有一个TRS,这个是安全链接,需要配置相关的证书和私钥,那这个呢是可以为空的。
所以说针对这样的配置呢,我们需要有多种不同的创建不同配置server的函数签名。
就像文章里展示的这样啊,因为构元呢并不支持重载函数,所以呢你得用不同的函数名来应对不同的配置选项。
要解决这个问题呢,最常见的方式啊就是使用一个配置对象。
那文中呢就有一个叫config的对象,我们把那些不是必须要输入的选项都移到这个结构体里。
那这样一来啊,server对象就只剩下两个必选项和这个配置对象了。
于是呢我们就只需要一个new server的函数了。
在使用之前呢,需要构造config对象。
像文章里表示的这样,其实啊这段代码已经算是不错的了,在大多数情况下我们可能就止步于此了。
但是呢对于有洁癖的有追求的程序员来说,他们会看到其中不太好的一点,就是这个config呢并不是必须的。
所以呢你需要判断它是否是new,或者呢我传一个empty的configure.但是这样呢会让我们的代码感觉不太干净。
那如果你是一个java程序员,熟悉设计模式的话,一定会很自然的使用builner模式。
我在文章里呢举了一个例子,那仿照这个模式呢我们就可以改写刚刚的代码了啊,具体呢一看代码就明白了。
这种方式呢也很清楚,不需要额外的config类,使用链式的函数调用的方式呢来构造一个对象啊,需要多加一个builder类。
你可能会觉得这个builder类似乎有点多余,我们似乎可以直接在server上进行这样的builder构造啊,的确是这样的,但是呢在处理错误的时候啊可能会有点麻烦,不如一个包装类啊更好一些。
那如果我们要省掉这个包装的结构体呢,要请出functional options上场,也就是函数式编程。
首先呢我们定义一个函数类型,然后呢我们可以使用函数式的方式定义一组函数。
在这组代码中呢,每一个函数都传入了一个参数,然后呢返回了一个函数。
返回的这个函数呢会设置自己的server参数。
比如说啊当我们调用其中的一个函数,max connections三十的时候,它呢就会返回一个函数。
这个函数的实现呢是把server的max connections设置为三十,这个呢叫做高阶函数。
在数学上,这有点像是计算长方形面积的公式。
Wreked with height等于with乘以height.那这个rect函数呢需要有两个参数,我们包装一下就可以变成计算正方形面积的公式。
Square with等于react with点with也就是说啊square with返回了另外一个函数。
这个函数呢就是react with height,只不过呢它的两个参数是一样的,也就是说FX等于GXX.好了,现在呢我们再定一个new server的函数啊,其中呢有一个可变参数options,它可以传入多个前面声明的函数,然后呢使用一个full loop来设置我们的server对象。
于是呢我们在创建server对象的时候啊,就可以像文章里这样了。
怎么样,是不是非常整洁和优雅呢?我们之前使用config对象的方式呢,有一个选择难题,就是我需要传入一个config参数。
但是呢我不需要的时候啊,我是传new呢,还是传一个空白的config呢?那这种函数式的方式啊不但解决了这个难题,同时呢它也不需要引用一个builder的控制对象,直接使用函数式编程。
在代码阅读上呢也很优雅。
所以啊以后你要玩类似的代码的时候呢,我强烈推荐你啊使用functional options这种方式。
这种方式呢至少带来了六个好处。
第一是直觉式的编程,第二呢是高度的可配置化,第三是很容易维护和扩展。
第四呢是自门档。
第五呢是新来的人,很容易上手。
第六呢就是没有什么令人困惑的事儿,也就是反new还是空。
最后呢我还想给你推荐一个参考文档,是rop pack self referential functions and design.好了,这节课呢就到这里。
那如果你觉得今天的内容啊对你有所帮助,欢迎你帮我分享给更多人。