关于对象实例化接口,配置信息直接放在接口实现里面会不会更好一些

前面 sms 章节学习的时候就有这个疑惑了,今天想提出来分享讨论一下:
为啥在定义接口的时候,要把接口实现的相关配置当做参数传递进去?

在实现接口的函数中直接获取相应参数配置会不会好一些,调用的人一般不关心后面接口实现部分是怎么做的吧?在mailer实例化的时候已经知道了是 SMTP 实现的,为啥还要再传一个参数过去呢?

下面是教程里面的代码
接口定义:

package mail

type Driver interface {
    // 检查验证码
    Send(email Email, config map[string]string) bool
}

接口实现:

...

// SMTP 实现 email.Driver interface
type SMTP struct{}

// Send 实现 email.Driver interface 的 Send 方法
func (s *SMTP) Send(email Email, config map[string]string) bool {
    ...

    err := e.Send(
        fmt.Sprintf("%v:%v", config["host"], config["port"]),

        smtp.PlainAuth(
            "",
            config["username"],
            config["password"],
            config["host"],
        ),
    )
    ...
}

最后是 mail er 实例调用接口方法:

// NewMailer 单例模式获取
func NewMailer() *Mailer {
    once.Do(func() {
        internalMailer = &Mailer{
            Driver: &SMTP{},
        }
    })

    return internalMailer
}

func (mailer *Mailer) Send(email Email) bool {
    return mailer.Driver.Send(email, config.GetStringMapString("mail.smtp"))
}

期待大家的看法,谢谢!

go
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!