往期见:

什么是配置和选项模式

配置可以理解为用户需要定制的参数,缓存时间、数据库参数等都可以理解为定制参数。本系统的配置包括随机选择数据和按序选择数据,还有脚本重试次数和超时时长。在上一版代码中,我们用Option结构体包装这些可选参数,并在函数中挨个传入。

代码如下,Runsh函数中我们传入options结构体,并将其数据取出传入给函数体内调用的函数。

最终调用该函数的代码如下,在最外层函数配置options的参数,如下面的代码配置模式为将所有数据按序进行脚本刷取,时间设定为一秒,重试次数为5(重试功能尚未开发)。

虽然这比较符合编程的直觉,在代码上也比较够用但是会存在一些问题。

直接传参存在的问题

  1. 在子函数中不断暴露各种结构体内字段,比如说options.dataReadPattern和options.proportion。这种方式使子函数的代码一团糟,该结构体的控制权在整个代码中被随意破坏,不符合封装的思想。
  2. 当使用者调用你的包时,需要跳出来先理解你的option结构体和每个字段所包含的意思。比如一个人想要配置随机抽样30%的数据执行脚本,他就需要理解你的option和对应的字段或者看注释才能使用该功能。


选项模式

解决上述两个问题的办法就是选项模式!为了让代码清晰,我们避免直接调用字段。首先我们将option重命名为config,因为option字段后续有更合适的含义。因此,需要对使用参数都添加Get方法。以数据选择模式举例,这样就更容易理解代码。


当然,上文的解决方案仅仅是对基本的封装完善。为了让用户更好地理解功能配置。我们将更改配置的函数命名为Option。

这段代码非常容易理解,我们将传入参数为*Config的所有函数都重命名为Option,这样我们实现的各种功能配置函数都可以用统一的类型进行传值

然后就可以补充对应的各种方法,这些函数都返回一个Option函数,本质上他只是对config的赋值函数做一层包装,但是此时使用者就可以通过你的调用函数直接更改Config结构体的值来配置,不用关注内部的细节


如果有因为可能有多项配置,我们需要暴露一个SetConfig函数

此时使用者只需要简单调用配置方法就可以更改Config以实现所需要的功能。

下述代码将脚本刷取模式改为随机选择50%数据执行脚本,秒级刷取。

总结:选项模式的本质与使用

选项模式的本质时为结构体做了一层封装保护,并且以一种可命名的方式进行内部属性的赋值。这样我们就可以在整个生命周期中控制和保护结构体的赋值。


下期预告

下一期我们将介绍如何写出简洁、直观、可维护的代码,携带大量的参考和学习资料,供大家在整体上把握