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 這個切片就可以了。從而避免修改原有的代碼。
總之,開閉原則就允許我們在不修改之前代碼的前提下安全的擴展我們的程序。