SOLID:开闭原则Go代码实战

开发 前端
我们将所有的验证方法放到一个切片里面存储,然后在统一的地方遍历选择合适的认证方式。这样改动后,如果新增一个校验方式,我们只需要注册到 providers 这个切片就可以了。从而避免修改原有的代码。总之,开闭原则就允许我们在不修改之前代码的前提下安全的扩展我们的程序。

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

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

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 这个切片就可以了。从而避免修改原有的代码。

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

责任编辑:武晓燕 来源: 今日头条
相关推荐

2017-10-24 15:28:27

PHP代码简洁SOLID原则

2011-07-04 17:59:03

开闭原则

2020-05-14 09:15:52

设计模式SOLID 原则JS

2012-03-15 11:15:13

Java设计模式

2022-07-15 09:01:15

React对象编程

2021-02-11 08:59:37

SOLID模块倒置原则

2022-03-24 09:44:54

TypeScriptSOLID

2024-09-30 11:51:07

2011-09-01 11:27:27

数据库调整开闭原则

2024-07-11 16:32:13

代码Java

2023-10-09 18:52:14

SOLIDJava

2024-02-23 09:31:30

开闭原则架构业务

2014-07-21 09:22:40

GoAPI

2011-12-02 10:19:24

CSS

2018-10-06 21:51:37

代码SOLID编程

2011-06-03 15:06:30

CSS

2013-10-21 17:54:00

代码重构修改

2011-06-03 15:21:51

CSS

2018-10-07 23:03:22

数据应用Web

2013-02-27 10:11:06

代码审查ThoughtBot
点赞
收藏

51CTO技术栈公众号