Python基于资源的编程框架
背景介绍
之前的文章我介绍了基于服务的开发模式,但是组件的划分和交互常常会出现一些困扰:
- 组件接口稳定性问题
组件的接口通常会传递一些数据和参数,但是在实际实现时,会发现可能缺失一些数据,需要修改接口定义 - 组件接口复杂性问题
随着接口所需数据变化和增加,接口可能越来越复杂 - 数据共享困难
数据只能通过参数传递,导致如果需要某个组件的数据,必须获取此组件对象,导致了对组件的显式依赖
解决方案及应用场景
之前是基于组件的编程模式,在此基础上可以再尝试一下基于资源(或者数据)的编程模式。在这种模式下,组件只需要专注于功能实现即可,不用担心数据传入传出,组件也可以划分得更细粒度。
除了功能组件之外,另外一个需要做的事情就是做好资源管理,数据管理应用场景示意:
s=Store() # 生成数据存储对象
s.a.b = 100 # 可以采用链式存储数据,方便数据的逻辑上的分类和命名
print(s.a.b) # 输出100
s.a.b = 88 # 可以修改存储的数据
print(s.a.b) # 输出88
s.is_valid(s.a.b.c) # 输出False,没有赋值的数据,被认为是无效的数据
实现源码
'''搞定资源服务'''
class Store:
'''提供链式存储服务'''
def __getattr__(self, name:str)->'Store':
# 当属性不存在时,创建新实例并赋值给当前对象
new_instance = Store()
setattr(self, name, new_instance)
return new_instance
def is_valid(self, value:object)->bool:
'''
判断某个存储值是否是有效的(意思是之前如果没有赋值就直接读取是无效的).
判断的原理是所有未赋值的属性都自动生成Store实例(为了链式属性调用所必须付出的代价)
'''
return not isinstance(value,Store)
以资源为中心模式的优点
- 有利于组件更细粒度分割,不用担心数据传递
- 便于从资源视角全局规划,因为应用程序的目的和核心就是数据处理和信息传递