当前位置: 首页 > 知识库问答 >
问题:

后端 - Go使用选项模式的优点是什么?

端木弘方
2023-10-13

之前在写一个限流器的时候,习惯性的用了选项模式来配置

type LeakyLimiter struct {    lock     sync.Mutex    last     time.Time    sleep    time.Duration    perReq   time.Duration    maxSlack time.Duration}type leakyOptions struct {    maxSlack time.Duration}type LeakyOption interface {    apply(*leakyOptions)}type leakyOptionFunc func(options *leakyOptions)func (l leakyOptionFunc) apply(o *leakyOptions) {    l(o)}func WithMaxSlack(maxSlack time.Duration) LeakyOption {    return leakyOptionFunc(func(options *leakyOptions) {        options.maxSlack = maxSlack    })}func NewLeakyLimiter(rate int, opts ...LeakyOption) *LeakyLimiter {    options := leakyOptions{        maxSlack: -10 * time.Second / time.Duration(rate),    }    for _, option := range opts {        option.apply(&options)    }    return &LeakyLimiter{        perReq:   time.Second / time.Duration(rate),        maxSlack: options.maxSlack,    }}

但是突然想到,能不能直接暴露出能够修改可配置项的函数

type LeakyLimiter struct {    lock     sync.Mutex    last     time.Time    sleep    time.Duration    perReq   time.Duration    maxSlack time.Duration}func (l *LeakyLimiter) WithMaxSlack(maxSlack time.Duration) *LeakyLimiter {    l.maxSlack = maxSlack    return l}func NewLeakyLimiter(rate int) *LeakyLimiter {    return &LeakyLimiter{        perReq:   time.Second / time.Duration(rate),        maxSlack: -10 * time.Second / time.Duration(rate),    }}

相比于这种直接配置的方式,选项模式的优点在哪里呢?感觉扩展性和可读性也没有提升,这种方式也可以链式调用。
我个人想的可能是不暴露修改的接口,在调用构造函数以后就不会被修改了安全一点。
除了这一个以外还有其他的考量吗?希望听听各位大大的分析

共有1个答案

解晟睿
2023-10-13

选项模式(或称为策略模式)的主要优点在于它允许用户通过封装和组合不同的行为或策略来定制对象的行为,而不是通过直接修改对象。这在许多情况下都是非常有用的。这里有几个主要的好处:

  1. 易于扩展和维护:如果你有很多不同的行为或配置选项,并且你经常需要添加新的选项,那么使用选项模式会比直接在结构体中暴露这些配置更容易。你可以为每个选项创建一个新的类型,然后将这些类型组合到一个结构体中。这样,你可以在不破坏现有代码的情况下添加新的选项。
  2. 更好的封装:通过将具体实现封装在选项中,而不是直接在结构体中实现,可以更好地保护对象的内部状态。这也有助于实现依赖倒置和更灵活的设计。
  3. 更灵活的配置:选项模式允许你在运行时动态地改变对象的行为。例如,你可以创建一个具有不同行为的 LeakyLimiter 对象用于不同的场景。
  4. 更好的文档和注释:由于选项模式通常要求为每个选项创建单独的类型,这使得代码更加清晰和易于理解。每个选项都有自己的类型,这有助于编写更好的文档和注释。
  5. 链式调用:如你所注意到的,选项模式确实可以支持链式调用。这使得代码更加简洁和易于阅读。当然,不直接在结构体中暴露可修改的函数也可以提供更高的安全性。
  6. 更好的错误处理:如果每个选项都有自己的类型,那么在配置对象时,你就可以更容易地检查选项的有效性,并在必要时提供默认值。

在你的例子中,使用选项模式并没有提供上述所有优点,但确实有助于更好地组织代码,使其更容易扩展和维护。尤其是当你需要为 LeakyLimiter 添加更多配置选项时,使用选项模式会比直接在结构体中添加更多字段更有优势。

 类似资料:
  • 问题内容: 我正在寻找提高某些SQL性能的方法,当前CTE正在脚本中多次使用和引用。我会使用表变量来获得改进吗?(因为代码在函数内,所以不能使用临时表)。 问题答案: 您实际上必须进行性能测试-没有“是/否”答案。根据安迪·利文(Andy Living)上面链接到的文章,CTE只是查询或子查询的简写。 如果您在同一函数中两次或多次调用它,则填充表变量然后加入该表变量或从中选择表变量可能会获得更好的

  • 问题内容: 关门了 。这个问题是基于观点的。它当前不接受答案。 想要改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 正如我在标题中提到的,我很想知道您(作为经验丰富的开发人员)对DAO模式的使用有何看法,特别是在Web应用程序中。您发现了哪些优势,而又讨厌使用它的后果? 问题答案: 我所见过的DAO的问题在于,它们通常一直都在处理完整的对象。这会

  • 问题内容: 我目前正在尝试创建一个数据库,其中很大一部分数据是临时的。在通读了许多技术后(大多数涉及6nf归一化),我遇到了Anchor Modeling 。 我正在开发的模式非常类似于Anchor Modeling模型,特别是因为用例(时间数据+未知未知数)是如此相似,以至于我很想完全拥抱它。 我遇到的两个最大问题是,我无法找到详细说明这种方法的负面影响,也找不到对我需要了解的将其用于生产战争故

  • 主要内容:1.优缺点,2.使用注意事项,3.适用场景,4.应用场景1.优缺点 优点: 在单例模式中,活动的单例只有一个实例,对单例类的所有实例化得到的都是相同的一个实例。这样就 防止其它对象对自己的实例化,确保所有的对象都访问一个实例 单例模式具有一定的伸缩性,类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。 提供了对唯一实例的受控访问。 由于在系统内存中只存在一个对象,因此可以 节约系统资源,当 需要频繁创建和销毁的对象时单例模式无疑可以提高系统

  • 问题内容: 以下是CodeIgniter数据库配置中的参数之一 您建议我将此设置为什么? 如果将其设置为FALSE,是否会对性能产生重大影响? 将其设置为TRUE可能会引起什么潜在的问题? 问题答案: 只需查找持久连接的一般最佳实践即可。我的建议。 默认情况下,请勿 如果你有: 生产中的专用Web服务器和数据库硬件 并正确调整了Web服务器和数据库 并具有准确的类似于生产的测试环境 仍然认为您的性

  • 本文向大家介绍什么是smarty? Smarty的优点是什么?相关面试题,主要包含被问及什么是smarty? Smarty的优点是什么?时的应答技巧和注意事项,需要的朋友参考一下 Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。