SOLID:开闭原则Go代码实战

一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。 简单地说:就是当别人要修改软件功能的时候,使得他不能修改我们原有代码,只能新增代码实现软件功能修改的目的。

专注于为中小企业提供网站设计、成都网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业奇台免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

作为程序员先上代码,比如我们想实现一个权限校验的功能。我们可能这样写:

type PermissionChecker struct {
}

func (c *PermissionChecker) HasPermission(ctx *gin.Context, name string) bool {
var permissions []string
switch ctx.GetString("authType") {
case "jwt":
permissions = c.extractPermissionsFromJwt(ctx.Request.Header)
case "basic":
permissions = c.getPermissionsForBasicAuth(ctx.Request.Header)
case "applicationKey":
permissions = c.getPermissionsForApplicationKey(ctx.Query("applicationKey"))
}

}

上面的方法,基于用于的认证方式 jwt、basic 或者 applicationKey ,然后分别去做权限的校验。感觉也没有啥问题,常规操作。

但如果我们此时想扩展一下,新增一个校验,就必须改动这里的代码。于是利用开闭原则,我们改一下代码:

type PermissionChecker struct {
providers []PermissionProvider
}

func (c *PermissionChecker) HasPermission(ctx *gin.Context, name string) bool {
var permissions []string
for _, provider := range c.providers {
if ctx.GetString("authType") != provider.Type() {
continue
}

permissions = provider.GetPermissions(ctx)
break
}
}

我们将所有的验证方法放到一个切片里面存储,然后在统一的地方遍历选择合适的认证方式。

这样改动后,如果新增一个校验方式,我们只需要注册到 providers 这个切片就可以了。从而避免修改原有的代码。

总之,开闭原则就允许我们在不修改之前代码的前提下安全的扩展我们的程序。

网站名称:SOLID:开闭原则Go代码实战
URL网址:http://www.shufengxianlan.com/qtweb/news28/122878.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联