SOLID:開閉原則Go程式碼實戰

語言: CN / TW / HK

一個軟體實體,如類、模組和函式應該對擴充套件開放,對修改關閉 。 簡單地說:就是當別人要修改軟體功能的時候,使得他不能修改我們原有程式碼,只能新增程式碼實現軟體功能修改的目的。

作為程式設計師先上程式碼,比如我們想實現一個許可權校驗的功能。我們可能這樣寫:

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 這個切片就可以了。從而避免修改原有的程式碼。

總之,開閉原則就允許我們在不修改之前程式碼的前提下安全的擴充套件我們的程式。