codecamp

GoFrame 框架设计-接口化与泛型设计

一、基本介绍

接口化是更高层次的抽象。框架组件的设计尽可能使用了接口化,而不是尽可能提供具体实现。接口化设计的最大的好处,是允许使用者自定义实现,来替换组件底层的接口层,以实现很强的灵活性和扩展性。

二、组件接口化

GoFrame​框架的核心组件均采用了接口化设计,举个例子,如下图展示了部分组件的接口化实现概览:

image2022-1-23_15-16-28

大部分的组件,使用了​Adapter​作为自身接口层的名字,通过​SetAdapter​方法来设置当前的接口实现,通过​GetAdapter​方法获取当前组件的接口实现对象。此外,为了提高易用性,组件都会提供一些默认的​Adapter​实现,可供使用者选择。拿​gsession​组件举例:

image2022-1-23_15-19-4

底层接口采用了​Storage​进行定义,并提供了​File/Memory/Redis/RedisHashTable​四种实现供选择,默认实现为​File​。

三、接口化与泛型

组件的接口化设计可扩展性是很高的,但是在具体落地的时候需要结合泛型来实现更灵活的使用。同样拿​gsession​组件举例,参数的返回均采用了泛型,在业务使用时根据需要再转换为对应的数据类型。

提高参数灵活性、简化使用复杂度

在不使用泛型的情况下,我们的接口要么提供各种类型的方法、要么使用interface{}类型返回,使用的复杂度都比较高。统一通过泛型的数据类型返回,使得参数类型更加灵活,极大地降低了使用复杂度。

image2022-1-23_15-27-44

泛型支持转换为各种类型:

image2022-1-23_15-31-46根据业务场景需要转换为对应的数据类型。类型转换使用了框架统一的类型转换组件,底层会优先使用断言进行类型识别,以保证转换的效率。

image2022-1-23_15-30-41

统一使用方式、屏蔽底层影响

针对于一些复杂类型的接口化场景,接口的底层实现上可能会存在外部存储的情况、更会产生序列化/反序列化操作,可能会改变/丢失数据类型。使用泛型将能够通过统一的使用方式屏蔽底层实现的影响。例如以下示例,无论底层​Session​实现如何变化,上层使用均通过泛型的​Scan​方法转换为目标对象。

image2022-1-23_15-53-11

四、注意事项

虽然框架提供了泛型设计,但是并不推荐在业务中广泛使用泛型。业务层的数据结构设计,包括接口和业务模型数据结构,应当是准确的、确定的。


GoFrame 框架设计-全错误堆栈设计
GoFrame 框架设计-隐式与显式初始化
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

GoFrame 核心组件

GoFrame 核心组件-数据库ORM

GoFrame 模块列表

GoFrame 模块列表-单元测试

GoFrame 模块列表-功能调试

GoFrame WEB服务开发

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }