游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

一些实用的编程模式Options模式

  今天开个新系列,讲一些实用的编程模式,每个编程模式学完后,都能马上在实战中应用起来,让我们写出更富表达力、易维护、好扩展、优雅亿点点的代码。
  这些编程模式的示例我会用Go来演示,但其实这些模式大多与语言无关,无论你平时主攻Go、Java还是JavaScript我觉得都能用上。
  为避免贴长篇代码,我会适当用一些伪代码
  系列第一篇要分享的编程模式是函数式编程里的Options模式Options模式解决什么问题
  Options模式可以让具有多个可选参数的函数或者方法更整洁和好扩展,当一个函数具有五六个甚至十个以上的可选参数时使用这种模式的优势会体现的很明显,我们还是通过一些例子慢慢感受一下。
  比如我们要在项目里封装一个通用的发Http请求的工具函数,它的参数可能会有哪些呢?因为是工具函数,要做到通用就必然需要定义很多能配置HTTP客户端的参数,比如:funcHttpRequest(methodstring,urlstring,body〔〕byte,headersmap〔string〕string,timeouttime。Duration)。。。
  函数签名里的返回值这里就省略了,太宽影响阅读,这里大家注意一下。
  上面这个工具函数,如果只是做GET请求的话,很多HTTP客户端的设置是不需要设置的,而且超时时间我们一般都会设置一个默认的。如果还按普通定义函数的方法来实现的话,函数逻辑里势必会有不少判断空值的逻辑。ifbody!nil{设置请求体Data。。。。。。}ifheaders!nil{设置请求头。。。。。。}
  调用的时候,调用者的代码也不得不传一些零值给不需要自定义的配置参数。HttpRequest(GET,https:www。baidu。com,nil,nil,2time。Second)
  如果是Java的话,其实是可以通过方法的重载解决这个问题,但是如果可选的参数是十几个,各个调用方对可选参数的顺序要求不一样的话,定义这个多重载方法显然不是一个好的解决方案。
  另外一种常用的解决方案是,工具函数的签名定义时,不再定义各个可能需要配置的可选参数,转而定义一个配置对象。typeHttpClientConfigstruct{timeouttime。Durationheadersmap〔string〕stringbody〔〕byte}funcHttpRequest(methodstring,urlstring,configHttpClientConfig)。。。配置对象方案的问题
  函数签名里通过传递一个配置对象来聚合各种可能的可选参数这个方案,对调用者来说,比上一种方法看起来简洁了不少,如果全都是默认选项只需要给配置对象这个参数传递一个零值即可。HttpRequest(GET,https:www。baidu。com,nil)
  但是对于函数的实现方来说,仍然少不了那些选项参数非零只的判断,而且因为配置对象在函数外部可以改变,这就有一定几率配置对象在函数内部未被使用前被外部程序改变,真正发生了相关的BUG,排查起来会比较头疼。可变参数方案的问题
  与配置对象方案类似,如果单纯通过可变参数来解决这个问题,也会有不少问题funcHttpRequest(methodstring,urlstring,options。。。interface{})。。。
  虽然参数是可变的,但是实现方需要通过遍历设置HTTP客户端的不同选项,这就让可变参数固定了传递顺序,调用方如果想要设置某个可选项还得记住参数顺序,切无法直接通过函数签名就确定参数顺序,貌似还不如咱们最原始的解决方案。使用Options模式的方案
  最后,我们来说一下使用Options模式怎么解决这个问题,其实如果你如果使用过gRPC的话,会发现gRPC的SDK里Options模式出现的几率相当高,比如它的客户端方法可以传递不少以with开头的闭包函数方法。client。cc,errgrpc。Dial(127。0。0。1:12305,grpc。WithInsecure(),grpc。WithUnaryInterceptor(。。。),grpc。WithStreamInterceptor(。。。),grpc。WithAuthority(。。。))
  这些配置方法返回的都是一个名为DialOption的interfacetypeDialOptioninterface{apply(dialOptions)}funcWithInsecure()DialOption{。。。}
  现在我们就使用Options模式对我们的工具函数进行一下改造,首先定义一个契约和配置对象。针对可选的HTTP请求配置项,模仿gRPC使用的Options设计模式实现typerequestOptionstruct{timeouttime。Durationdatastringheadersmap〔string〕string}typeOptionstruct{applyfunc(optionrequestOption)}funcdefaultRequestOptions()requestOption{returnrequestOption{默认请求选项timeout:5time。Second,data:,headers:nil,}}
  接下来我们要定义的配置函数,每个都会设置请求配置对象里的某一个配置funcWithTimeout(timeouttime。Duration)Option{returnOption{apply:func(optionrequestOption){option。timeouttimeout},}}funcWithData(datastring)Option{returnOption{apply:func(optionrequestOption){option。datadata},}}
  那么此时我们的工具函数的签名就应用上上面定义的接口契约funcHttpRequest(methodstring,urlstring,options。。。Option)。。。
  在其实现里我们只需要遍历options这个可变参数,调用每个Option对象的apply方法对配置对象进行配置即可,不用在担心可变参数的顺序。funchttpRequest(methodstring,urlstring,options。。。Option){reqOpts:defaultRequestOptions()默认的请求选项for,opt:rangeoptions{在reqOpts上应用通过options设置的选项opt。apply(reqOpts)}创建请求对象req,err:http。NewRequest(method,url,strings。NewReader(reqOpts。data))设置请求头forkey,value:rangereqOpts。headers{req。Header。Add(key,value)}发起请求。。。。。。return}总结
  最后我们的HTTP工具函数的调用方式就变成了,下面这种更灵活更富表达力的方式。HttpRequest(GET,url)HttpRequest(POST,url,WithHeaders(headers)HttpRequest(POST,url,WithTimeout(timeout),WithHeaders(headers),WithData(data))
  从实现方来看呢?如果后面要给配置对象里增加其他配置项,只需要扩充类型的字段,再定义一个对应的With方法即可,扩展性完全在可接受范围内。
  好了Options模式你学会没,想不想赶快用起来,可以在我的GitHub仓库gocookbook找到完整可运行的代码

DaVinciResolve17杜比全景声流程3月17日下午3点(下周三),BlackmagicDesign的DaVinciResolve专家将为大家带来DaVinciResolve17杜比全景声(DolbyAtmos)流……华为P50又爆新消息,或成为首款鸿蒙OS智能手机根据相关媒体报道称,华为很可能在今年的3月份到4月份推出三款P系列智能手机,也就是P40系列的继任者P50。分别是华为p50。P50pro,P50proplus,现如今,网上关……爱威影音正式推出玫瑰公爵组合壹号爱威影音从2021年下半年起,隆重推出玫瑰公爵系列组合,经过精心搭配与多次聆听,最终选择了发烧音响领域的乌托邦,法国Focal劲浪搭配超过50年历史,源自剑桥的英国剑桥Camb……可怡科技等候一个英雄的归来提到漫威大家率先想到的肯定都是复仇者联盟的确,整个复联是漫威最庞大的世界观各路英雄群星荟萃神仙打架眼花缭乱应接不暇可怡科技:等候一个英雄的归来……联通三千兆来袭,打造全场景极速网络方案以匠心致未来互联网时代背景下,网络如同信息传输的血脉,其重要性不言而喻。相信不少人都有过类似经历,家里的WiFi信号时断时续,追剧经常被加载中断;办公室带宽总不够用,传输……氢能源汽车未来会成为主流吗?人类赖以生存的根本一直以来都是传统化石能源。时至今日,全球环境压力巨大,推动新能源行业的发展和能源变革已是大势所趋。今天在全国各大城市飞奔的新能源车,其实就已经完全摆脱了……手机到底有没有必要贴膜?我每天都能发布许多手机新资讯,但我发现大家关心新手机的同时,还会关心新的手机该买哪种钢化玻璃膜、以及哪一种手机壳。事实上,手机壳如何选择,我还真的没有太好的推荐,毕竟手机壳的外……大众新车全优通过?中保研最新碰撞测试成绩出炉10月28日,中保研公布了2021年第一批新车碰撞测试成绩,共涉及五个品牌的五款车型,分别是长安福特锐际、长安马自达CX30、上汽大众ID。4X、长安UNIK以及广汽讴歌RDX……子弹短信这么火,做起来其实很容易。你知道其中的原理吗?虽然从今天来看子弹短信是昙花一现。号称百万注册量。现在随着老罗锤子科技的崩盘。也已经奄奄一息啦。当然我们对于社交的需求并没有终结。如果你的企业想做一个内部的聊天工具。想更……明晚油价将上涨0。170。18元升明晚油价将上涨0。170。18元升审核状态:已通过类别:企业新闻发布人:100137055发布时间:2021100909:08比亚迪车主请注意,明晚油价将上涨0。170。……提升屏奴幸福感海信阅读手机A5Pro为你呈现精彩与以往车马很慢,书信很远的生活不同,随着生活节奏的加快,由于没有太多闲暇,许多人开始通过电子阅读进行碎片式学习,于是护眼、便捷成了很多人购买阅读器的考量标准。为了满足大家的需求……不管霜降还是双降?企业降本增效就是要降今年寒冷到来的仿佛更早一些,就业形势同样也很严峻。对于应届生,同样是毕业,有的人还没出校门就收获百万年薪offer,也有很多人一毕业就失业。。。。。。近日,一位00……
三防手机天花板,零下30度也能用,AGMG1系列来袭10月28日,AGMG1系列正式发布。作为一款三防旗舰手机,这次的G1系列又会给我们带来哪些惊喜呢?看完全程发布会后,我来和大家分享一下。和其它智能手机不同,AGMG1从……千兆家庭用网怎么建?近几年运营商网络高速发展,纷纷将宽带从百兆升级到千兆宽带,且价格更加低廉,迈入家庭千兆宽带时代。无论是8K高清视频,还是其他智慧家庭产品,其核心都离不开高速宽带的支撑,一个好的……市场小档口,竟能月销百万?与食品行业打了16年的交道的殷老板,从起初打工做水果批发积累资源,到开辟出自己的食品经商之路,从单枪匹马到占据3个批发市场开设7家门店。拥有了12人骨干团队,4年积累熟客100……为河北高速ETC畅通保驾护航,维谛技术的电源产品好在哪?关于游玩,今天我们不聊山不聊水、只聊这个话题。为什么现在越来越多的人喜欢外出旅游?一个人出游,一家人出游,以及其他方式的出游。穷游啊,自驾游啊,等等都在按照自……吃鸡王者荣耀最佳伴侣,战斧G5单边游戏手柄轻体验现在手机游戏市场越来越火爆,诸如和平精英,王者荣耀等一些非常不错的游戏都能手机上畅快淋漓的游玩。在手游这么大的市场环境下自然有一些追求提升手游使用感受的厂商,他们将主机的……使用近30年,蓝底白字92式车牌即将拜拜?还记得某一年春晚小品里的一句台词:人这辈子怎么这么多的证,我不相信这么多的证,证明不了我的身份!。那么今天我们就来说说汽车的身份证车牌。现如今买车,钱不是问题,问题是需要……配电脑应该买大主板还是小主板?我来告诉你逼格到底重不重要!前言:草鸡曾经有个朋友的室友(电脑小白)自己一个人跑去买了个笔记本电脑,开开心心的抱着电脑回宿舍,到宿舍后下了个娱乐大师检测一下却快哭了出来。结果就是因为,他买了一台样机……299一套的智能电动窗帘,是真的吗?相关问题我们汇总下智能窗帘本身不是高科技的物件,大家可能平时接触的少,总觉的是很贵的东西。其实,智能窗帘现在已经很普及了,新房装修一般都是会预留的,很多朋友,还没开始装修,就在咨询相关的问……网络货运的五大合规风险,应该这样避免经过3年不断的摸索与尝试之后,2020年1月1日,由交通运输部及国家税务总局联合印发的交运规〔2019〕12号《网络平台道路货物运输经营管理暂行办法》(简称《网络货运管理办法》……18TB硬盘来了,有哪些设备可以支持呢?随着5G到来,网络速度越来越快,我们对数据存储空间的需求也越来越大。今年,希捷发布了全新的18TB超大容量硬盘,主要面向中小企业NAS应用场景。麦沃对产品进行了及时的升级……集特智能无风扇工控机的优势?无风扇工控机(嵌入式工控机、低功耗工控机)通俗的说法就是专门为工业现场而设计的机构紧凑的计算机。无风扇工控机可以灵活的应用在对温度及使用空间等苛刻的环境中,包括车载、医疗、零售……黑科技什么的,全都点满!索尼SRSXB23无线音箱体验你不是有好多杯子么?怎么又买一个,当我妈对我的快递如此评价时,我也很好奇,大脑飞速旋转仍未记得我最近有买过保温杯,回家看到才发现,哦,原来是索尼的无线音箱SRSXB23,这个外……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网