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,就把這篇文章發給他!