GoFrame
Golang
GolangOOP
api/dao/serviceuser
internal_member_privilegeimport aliascycle import
Golangpackagepackagepackage


GoFrame

二、对象封装设计

在代码分层设计之后,我们尽量地减少封装包的数量、降低包的复杂度,尽可能采用结构化对象的方式来封装代码处理逻辑。




packageobject


1、业务包命名约束

controller/service业务模块名称(大驼峰)分层名称(缩写)+业务模块名称(大驼峰)



controller/service


controller

封装示例:



使用示例:



service

封装示例:



使用示例:



dao
dao

使用示例:



5、对象封装安全

如果各分层中的封装对象都是以" 可变变量 "的形式对外暴露使用,因此存在被修改的安全风险。因此大家注意这些公开的对象不要以指针(也尽量不要以接口实例)方式公开这些对象、不要设置公开属性(建议通过公开方法暴露内部属性)。

以下是一个错误的示例:



以下是一个正确的示例:



三、接口化封装设计

controllerdaoserviceservice

1、对象封装的痛点

GoFrame



serviceNetworkResourceservice
service
GoFrameGoFrameserviceserviceservice

1)原本的对象封装



2)采用接口化封装



接口化只需要两步即可:

  • 增加业务模块的接口定义
  • 将原本对象方法返回的对象指针改为返回接口

3、对象封装到接口切换

serviceserviceResourceNetwork



service
  • 减少业务模块接口化改进引起的改动,降低维护成本
  • 支持从对象封装调用无缝切换到接口调用,调用端无感知

4、接口化设计的成本

可以看到,我们增加一层接口定义,其实也增加了一层代码的维护成本。此外,接口化的代码对于代码调试和定位不太友好,特别是多个层级嵌套的接口而言,想要定位到具体的实现成本较大。对于大部分的项目而言,其实往往不太需要接口化设计。架构设计中常常出现的悲伤故事之一,就是为了设计而设计。

GoFrameservice

四、注意事项

serviceserviceservice/internalserviceservice/internal