上下文:我们正在构建一个复杂的3D"模拟人生"使用React / Alt.js的Web应用程序。用户可以在3D场景(立方体)中添加简单对象,但更多时候他们会添加我们称之为"预制&#34 ;,这是基于几个简单对象(15个立方体构成结构)的组合一些用户的参数(长度,高度,......)。
所以我们有一个包含所有简单对象的ObjectStore和PrefabStore(它只保存用户的参数以生成预制件)。
我们只能在React层中生成这个预制件及其对象(这样预制件渲染始终与商店中预制件的参数同步),但由于技术原因,我们需要所有这些预制件&#39 ;存储层中确实存在的简单对象。换句话说,我们需要在商店中生成预制对象(ObjectStore,因为它存储了简单对象)。
问题是:其中(在商店图层中),何时和 如何生成预制件及其所有依赖对象,以及我们应该在哪里存储生成的对象,知道:
为了帮助理解什么是预制件和一个简单的对象,以及为什么我们需要预制件的对象存在于商店层中,这里有一个我们的应用截图:
我的解决方案:
优点:预制渲染和依赖对象始终与预制数据同步。当预制的参数更新时,React会自动渲染预制并再次生成对象。
缺点:对象确实不存在。它们不在ObjectStore中,因此我无法与它们交互(显示对象列表,生成包含所有对象的文件,......)。
优点:所有对象都存储在自己的商店中。
缺点:更新预制件(移动/旋转/调整大小)时,很难更新所有相关生成的对象,并且在ObjectStore中需要一堆商店lsitener来确保对象与他们所属的预制件同步。
缺点:我不知道如何在两个不同的商店中处理备忘:PrefabStore用于预制对象(仍然具有位置/旋转属性)和ObjectStore用于生成的对象。
答案 0 :(得分:1)
回答这些架构问题很棘手 - 你是自己系统和领域的专家,但无论如何都要进行:
基本流量规则是Store负责在响应Action时改变自己的状态。此外,还有良好的通用代码组织实践,例如具有低耦合和高内聚等等。
一种选择是:
某种Prefab模型对象,它知道参数 单个预制'模板',并有一个生成方法来创建和返回 适当的对象(也许生成方法必须采取一些位置信息或某些东西作为参数)。预制模型可以在单独的代码模块中与任何商店分离。如果你愿意,generate方法可以是一个纯函数,在它自己的模块中。
Prefab Store可以直接存储预制模型(可能最简单),也可以只存储构建它们所需的数据。
Object Store有一个ADD_FROM_PREFAB Action的处理程序,用于查询Prefab存储以获取相应的Prefab模型数据/实例,调用 生成并最终将返回的对象添加到其状态。
用户界面然后只是从ObjectStore渲染场景,而不是预制商店(虽然可能是Prefab商店也用于预制库UI?)
使用这种方法,您可以单独测试预制模型和对象生成,并在您想要的地方重复使用。商店代码也是相当简单的胶水,易于测试。 UI不需要担心渲染部分中的预制件。