GoFrame 框架設(shè)計-接口化與泛型設(shè)計

2022-03-29 15:40 更新

一、基本介紹

接口化是更高層次的抽象??蚣芙M件的設(shè)計盡可能使用了接口化,而不是盡可能提供具體實現(xiàn)。接口化設(shè)計的最大的好處,是允許使用者自定義實現(xiàn),來替換組件底層的接口層,以實現(xiàn)很強的靈活性和擴展性。

二、組件接口化

?GoFrame?框架的核心組件均采用了接口化設(shè)計,舉個例子,如下圖展示了部分組件的接口化實現(xiàn)概覽:

image2022-1-23_15-16-28

大部分的組件,使用了?Adapter?作為自身接口層的名字,通過?SetAdapter?方法來設(shè)置當前的接口實現(xiàn),通過?GetAdapter?方法獲取當前組件的接口實現(xiàn)對象。此外,為了提高易用性,組件都會提供一些默認的?Adapter?實現(xiàn),可供使用者選擇。拿?gsession?組件舉例:

image2022-1-23_15-19-4

底層接口采用了?Storage?進行定義,并提供了?File/Memory/Redis/RedisHashTable?四種實現(xiàn)供選擇,默認實現(xiàn)為?File?。

三、接口化與泛型

組件的接口化設(shè)計可擴展性是很高的,但是在具體落地的時候需要結(jié)合泛型來實現(xiàn)更靈活的使用。同樣拿?gsession?組件舉例,參數(shù)的返回均采用了泛型,在業(yè)務(wù)使用時根據(jù)需要再轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)類型。

提高參數(shù)靈活性、簡化使用復雜度

在不使用泛型的情況下,我們的接口要么提供各種類型的方法、要么使用interface{}類型返回,使用的復雜度都比較高。統(tǒng)一通過泛型的數(shù)據(jù)類型返回,使得參數(shù)類型更加靈活,極大地降低了使用復雜度。

image2022-1-23_15-27-44

泛型支持轉(zhuǎn)換為各種類型:

image2022-1-23_15-31-46根據(jù)業(yè)務(wù)場景需要轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)類型。類型轉(zhuǎn)換使用了框架統(tǒng)一的類型轉(zhuǎn)換組件,底層會優(yōu)先使用斷言進行類型識別,以保證轉(zhuǎn)換的效率。

image2022-1-23_15-30-41

統(tǒng)一使用方式、屏蔽底層影響

針對于一些復雜類型的接口化場景,接口的底層實現(xiàn)上可能會存在外部存儲的情況、更會產(chǎn)生序列化/反序列化操作,可能會改變/丟失數(shù)據(jù)類型。使用泛型將能夠通過統(tǒng)一的使用方式屏蔽底層實現(xiàn)的影響。例如以下示例,無論底層?Session?實現(xiàn)如何變化,上層使用均通過泛型的?Scan?方法轉(zhuǎn)換為目標對象。

image2022-1-23_15-53-11

四、注意事項

雖然框架提供了泛型設(shè)計,但是并不推薦在業(yè)務(wù)中廣泛使用泛型。業(yè)務(wù)層的數(shù)據(jù)結(jié)構(gòu)設(shè)計,包括接口和業(yè)務(wù)模型數(shù)據(jù)結(jié)構(gòu),應(yīng)當是準確的、確定的。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號