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 这个切片就可以了。从而避免修改原有的代码。
总之,开闭原则就允许我们在不修改之前代码的前提下安全的扩展我们的程序。
「其他文章」
- Spring中实现异步调用的方式有哪些?
- 带参数的全类型 Python 装饰器
- 整理了几个Python正则表达式,拿走就能用!
- SOLID:开闭原则Go代码实战
- React中如何引入CSS呢
- 一个新视角:前端框架们都卷错方向了?
- 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案
- 手写编程语言-递归函数是如何实现的?
- 一文搞懂模糊匹配:定义、过程与技术
- 新来个阿里 P7,仅花 2 小时,做出一个多线程永动任务,看完直接跪了
- Puzzlescript,一种开发H5益智游戏的引擎
- @Autowired和@Resource到底什么区别,你明白了吗?
- CSS transition 小技巧!如何保留 hover 的状态?
- React如此受欢迎离不开这4个主要原则
- LeCun再炮轰Marcus: 他是心理学家,不是搞AI的
- Java保证线程安全的方式有哪些?
- 19个杀手级 JavaScript 单行代码,让你看起来像专业人士
- Python 的"self"参数是什么?
- 别整一坨 CSS 代码了,试试这几个实用函数
- 再有人问你什么是MVCC,就把这篇文章发给他!