新聞中心
一個(gè)軟件實(shí)體,如類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉。 簡(jiǎn)單地說(shuō):就是當(dāng)別人要修改軟件功能的時(shí)候,使得他不能修改我們?cè)写a,只能新增代碼實(shí)現(xiàn)軟件功能修改的目的。

專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)奇臺(tái)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
作為程序員先上代碼,比如我們想實(shí)現(xiàn)一個(gè)權(quán)限校驗(yàn)的功能。我們可能這樣寫:
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"))
}
}上面的方法,基于用于的認(rèn)證方式 jwt、basic 或者 applicationKey ,然后分別去做權(quán)限的校驗(yàn)。感覺(jué)也沒(méi)有啥問(wèn)題,常規(guī)操作。
但如果我們此時(shí)想擴(kuò)展一下,新增一個(gè)校驗(yàn),就必須改動(dòng)這里的代碼。于是利用開(kāi)閉原則,我們改一下代碼:
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
}
}我們將所有的驗(yàn)證方法放到一個(gè)切片里面存儲(chǔ),然后在統(tǒng)一的地方遍歷選擇合適的認(rèn)證方式。
這樣改動(dòng)后,如果新增一個(gè)校驗(yàn)方式,我們只需要注冊(cè)到 providers 這個(gè)切片就可以了。從而避免修改原有的代碼。
總之,開(kāi)閉原則就允許我們?cè)诓恍薷闹按a的前提下安全的擴(kuò)展我們的程序。
網(wǎng)頁(yè)標(biāo)題:SOLID:開(kāi)閉原則Go代碼實(shí)戰(zhàn)
文章地址:http://www.dlmjj.cn/article/dhsojdi.html


咨詢
建站咨詢
