我已经使用面向对象编程实践 25 年了,并在过去 5 年里尝试转向函数式编程,但当我尝试做一些复杂的事情时,我的想法总是倾向于 OOP,尤其是现在 ES6 支持像样的OOP 语法,这是我构建东西的自然方式。
我现在正在学习 Redux 并且我理解了(参见如何将方法放到 Redux 状态的对象上? https://stackoverflow.com/questions/32352982/how-to-put-methods-onto-the-objects-in-redux-state)禁止将类实例放入您的减速器中;在普通减速器状态之上进行计算的推荐方法是使用选择器(例如,通过重新选择)。当然,React 建议组合而不是继承(https://facebook.github.io/react/docs/composition-vs-inheritance.html https://facebook.github.io/react/docs/composition-vs-inheritance.html, React redux oop 类 https://stackoverflow.com/questions/38889463/react-redux-oop-classes).
但是,React/Redux 生态系统中是否有适合具有方法和继承的类对象的位置呢?
我想,为了回答我自己的问题,OOP 类鼓励在同一位置添加数据属性和对数据的操作,这对于可读性很好,但不太适合纯函数和不可变数据。
如果我要使用 OOP,我是否需要放弃让我的实例持续存在并维持状态任意时间的想法?就像,每次我想使用一个时,我都会从存储数据中实例化它,使用我想要的任何方法,然后扔掉它?这可能会消除很多使用 OOP 类的动力。但如果我保留实例,我会很头疼让它们与商店同步。
那么,当我想使用方法时总是使用选择器以及当我想使用继承时总是使用组合的答案是吗?具体来说,我的意思是存储和操作 Redux 存储中保存的数据以供 React 组件使用时。如果是的话,它应该放在哪里?连接到选择器?像我建议的那样立即丢弃?
为了清楚起见,添加我的用例:我的数据基本上是一个巨大的图表:许多具有大量属性的对象以及对象之间的大量关系。它是只读的,但很复杂。我的对象被称为“概念”。
在做出(可能是愚蠢的)迁移到 Redux 的决定之前,我使用类来构造和表示概念、概念集以及概念之间的关系。我的类包括用于获取概念集的异步 API 逻辑、有关每个概念的信息以及有关每个概念相关的其他概念的信息。如果用户选择向下钻取,类将递归地获取并实例化新的概念集。 Redux 文档推荐嵌套数据的扁平、规范化结构(http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html)这对于存储来说可能是明智的,但我的 OOP 模型非常适合遍历图形和其他内容的部分。我很难理解如何使用选择器和不可变状态,这些状态可能涉及嵌套、可能带有循环,或者需要对更多数据进行异步调用。
我成功使用了https://redux-observable.js.org/ https://redux-observable.js.org/对于 api 的东西。
也许@Sulthan 的答案是正确的:我应该随意在我的 Redux 应用程序中使用 OOP 技术。但看起来还是很奇怪。我无法保留我的对象,因为如果存储发生变化(例如,获取更多数据),我的对象可能会变得陈旧。如果我的对象是嵌套的,但我的存储是标准化的,我会在需要它们时实例化它们(从选择器),并确保不要保留它们......