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