假设我们有一个“汽车”类,它具有不同的数据(制造商、型号、颜色、制造日期、注册日期等)。该类没有获取数据的方法,但它知道从另一个对象获取数据(通过构造函数发送,我们简称为 DS)。- 需要更新更改时也是如此。
方法 getColor() 将像这样实现
if(! this->loaded('color')){
this->askDS('color') // this will do the necesarry work to generate a request to DS
}
return this->information('color');
到目前为止还没有什么特别的。没有我想知道它是否有名称的部分,或者是否有库/框架已经这样做了。
DS 有一个基于需要数据的类动态注册的方法列表。对于汽车,我们有:
- 输入:汽车序列号,输出:用于读取数字以提取原始值的方法
- 输入:汽车原始颜色值,输出:颜色代码
- 输入:汽车颜色代码、制造商、年份、模式,输出:人类可读的颜色(例如海军蓝)
现在,DS或任何方法都没有使用命令从序列号开始并返回蓝色的有序列表,但如果可以从一组数据构建一个方法链,它可以按顺序运行它们并获得所需的数据。
对于我们上面的示例,DS 按顺序运行 1、2、3,并将所有方法产生的数据注入(inject)到需要它的类对象中。
现在,如果汽车需要注册信息,我们可以使用方法 (4) 通过 API 请求从警察数据库中获取该信息。
因此,给定: - 一种模型(类/对象) - 采用固定输入列表(对象属性)并给出固定输出列表(对象属性)的方法列表 - 一个类 DS,它可以粘合方法并运行模型所需的方法,以从属性 A(串行)到属性 B(人类可读颜色),而模型或 DS 没有预配置的方法来获取此数据,但发现它是需要。
它有名称还是已经在某处实现了?
我已经实现了一个非常基本的原型(prototype),它工作得很好,我认为这个实现方法有一些有用的特性:
如果您有一组执行 sql 查询的方法,然后您的应用程序切换到使用 api,您只需要更改方法而不必触及应用程序的任何其他部分
当寻找解决对象“需要”的方法链时,您可以找到一个方法链,运行它,如果它失败,继续寻找基于当前可用数据的另一个方法列表 -所以如果一条数据有多个来源,它可以尝试多个版本
从上面的段落开始,我可以从一个只有用于数据检索的 sql 查询的应用程序开始 - 当我发现应用程序的一部分使 sql server 过载时,我可以添加一个方法来从缓存中检索数据成本低于数据库(或多层缓存,每个都有不同的成本)
我可能会以与缓存相同的方式在混合中添加业务日志,并根据用户位置/选项呈现不同的数据
这需要更少的整体编码,并将数据源与对象分离,使每个部分更容易模拟/测试
要加快速度,需要为已发现的方法链提供缓存解决方案,因为为每个模型类型匹配数十万个方法会非常耗时,但我认为这并不难做到- 只需在找到它们时将所有找到的链和一些元数据存储在内存中,以便能够从任何时间点恢复搜索 - 当您更新方法时,只需清除缓存,对第一个请求进行性能打击
谢谢你的时间
最佳答案
您所描述的听起来有点迂回Dependency Injection .引用:
"Passing the service to the client, rather than allowing a client to build or find the service, is the fundamental requirement of the pattern."
根据您使用的语言,应该有几个可用的依赖注入(inject)框架/库。
关于algorithm - 尝试确定数据注入(inject)方法是否已有名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41779033/