redux 中有 OOP 的地方吗?

2024-01-24

我已经使用面向对象编程实践 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 技术。但看起来还是很奇怪。我无法保留我的对象,因为如果存储发生变化(例如,获取更多数据),我的对象可能会变得陈旧。如果我的对象是嵌套的,但我的存储是标准化的,我会在需要它们时实例化它们(从选择器),并确保不要保留它们......


答案是它是possible但非常不鼓励而且不惯用。

React 确实依赖于类和单级继承React.Component实现具有生命周期的有状态组件,但官方不鼓励您在组件中进行更高级别的继承。

Redux 是围绕函数式编程原则构建的。由于多种原因,我们鼓励您将状态保留为纯 JS 对象和数组,并使用纯函数访问/操作它。

我当然见过许多库试图在 Redux 之上添加 OOP 层(例如其方法转变为操作创建器和缩减器的类)。那些work,但肯定违背了 Redux 的整体精神。

我实际上使用了一个名为的库Redux-ORM https://github.com/tommikaikkonen/redux-orm, which does允许您定义充当商店中普通 JS 对象的外观的模型类。然而,与我见过的许多其他库不同,它可以工作withRedux 而不是试图改变 Redux 的行为方式。我在我的博客文章中讨论了 Redux-ORM 的工作原理、我如何使用它以及为什么它仍然相当地惯用实用 Redux,第 1 部分:Redux-ORM 基础知识 http://blog.isquaredsoftware.com/2016/10/practical-redux-part-1-redux-orm-basics/ and 实用 Redux,第 2 部分:Redux-ORM 概念和技术 http://blog.isquaredsoftware.com/2016/10/practical-redux-part-2-redux-orm-concepts-and-techniques/。总的来说,它是帮助管理 Redux 存储中的关系和规范化数据的出色工具。

最后,我目前正在撰写一篇博客文章,该文章将讨论 Redux 所需的实际技术限制(以及原因)以及您的情况intended使用 Redux 与它的用法possible使用 Redux。我希望能在下周左右完成 - 敬请关注http://blog.isquaredsoftware.com http://blog.isquaredsoftware.com .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redux 中有 OOP 的地方吗? 的相关文章

随机推荐

  • 绘制给定预先计算的计数和箱的直方图

    我有一些数据x我传递给numpy histogram x 获取计数和 bin 边缘 然后我将它们保存到文件中 稍后 我想加载此数据并绘制直方图 I have counts 20 19 40 46 58 42 23 10 8 2 bin ed
  • 在 R 中拟合非线性 Langmuir 等温线

    我想在 R 中为以下数据拟合等温模型 最简单的等温模型是此处给出的 Langmuir 模型型号在页面底部给出 http www alfisol com IFS IFS 003 LMMpro Langmuir php 下面给出了我的 MWE
  • 使用 Visual Basic 自动登录表单

    我需要使用 Visual Basic 10 0 创建一个自动登录表单应用程序 代码如下 table cellpadding 0 cellspacing 0 border 0 height 100 tr td width 50 height
  • 在 iPhone 中创建基于时间的提醒应用程序

    我正在开发基于时间的提醒应用程序 用户在其中输入他的提醒和提醒时间 问题是如何不断地将当前时间与用户定义的时间进行比较 任何示例代码都会有很大帮助 因为我被困在这一点上 将当前时间与用户定义的时间进行比较并不是正确的设计模式 UIKit 提
  • 导航组件防止在后按时重新创建片段

    我在项目中使用 Jetpack 导航组件 其中包含单个活动和一些片段 我有一个带有从服务器端填充的列表的片段 我打电话getDataFromServer on the onViewCreated然后 当用户单击某个项目时 会显示一个新片段
  • 在 Excel 中将超链接转换为 HTML 代码

    我的 Excel 文件中有一列超链接 我想将它们转换为各自的 HTML 代码 a href http www example com Link Name a 我找到了仅提取链接 作为文本 的方法 但我需要将整个 HTML 代码作为文本来替换
  • 如何在.NET 中解析 UDP 数据包?

    如何在 NET 中解析 UDP 数据包 我使用 PCap Net 捕获数据包 在本例中为 UDP 数据包 我可以通过 PcapDotNet packets Ethernet IpV4 Udp 从 PCap net 对象访问这些数据包 我如何
  • Jquery 列表框更改事件不会在键盘滚动时触发

    我有一个 HTML 表单上的简单列表框和这个非常基本的 jQuery 代码 Toggle visibility of selected item selCategory change function prashQs addClass hi
  • 在设备的默认浏览器中打开链接。人行横道 Android 应用程序

    我正在使用 HTML 和 JavaScript 创建适用于 Android 设备的应用程序 我正在使用 Crosswalk 15 44 384 12 将其捆绑到 Android 应用程序中 这几乎创建了一个内置 Web 浏览器的 Andro
  • 可以嵌套 HTML 表单吗?

    是否可以像这样嵌套 HTML 表单
  • 是否可以使用egrep来匹配某个范围内的数字?

    有没有办法grep egrep两组数字之间 egrep SomeText 19999 22000 some file txt 它不返回值 我预计 SomeText 19999 ffuuu SomeText 20001 ffuuu SomeT
  • shell pipeline 如何处理无限循环

    每当我需要限制 shell 命令输出时 我都会使用 less 对结果进行分页 cat file with long content less 它工作得很好 但我很好奇的是 即使输出永远不会结束 less 仍然有效 请考虑将以下脚本放在inf
  • 使用谷歌翻译 API 的值无效 (400)

    我的要求有什么问题吗 我有俄语字符串 string 我想用 google API 将其翻译为乌克兰语 我对字符串进行编码 q urlencode string 我请求谷歌API 作为回应 我得到 error errors domain gl
  • 在 ng-view 上滚动时,无尽滚动在 AngularJS 中不起作用

    我正在使用类似的代码this http jsfiddle net vojtajina U7Bz9 在 AngularJS 中创建无限滚动效果 我尝试通过移动可滚动容器的内容 在本例中为ul 到一个单独的 html 文件 然后使用 ng vi
  • ios:显示可变长度、多行文本的最佳方式

    我计划从文本文件加载多段落内容并将其显示在用户界面上 我将从几个文本文件之一加载 并且不会提前知道文本的长度 我的第一个想法是在 UIScrollView 中使用 UILabel 然而 似乎 UILabel 不能根据它包含的行数进行扩展 它
  • 如何在d3.js的Pack Layout中插入饼图?

    大家好 我想在我的包布局中添加饼图 而不是简单的圆圈 假设这是我的饼图数据和饼图布局 var data 2 3 4 5 var 弧 d3 svg arc outerRadius 50 innerRadius 0 var 饼 d3 layou
  • 就数据挖掘和可视化工具支持而言,日志事件的最佳 XML 格式是什么?

    我们希望能够从 Java 应用程序创建日志文件 该文件适合稍后通过工具进行处理 以帮助调查错误并收集性能统计数据 目前 我们使用传统的 日志内容 可能会或可能不会被展平为文本形式并附加到日志文件中 但这最适合人类读取的少量信息 经过仔细考虑
  • c strcmp 源代码

    int strcmp const char s1 const char s2 int ret 0 while ret unsigned char s1 unsigned char s2 s2 s1 s2 if ret lt 0 ret 1
  • 如何避免 ReactJS 中的 jQuery 调用

    我知道 JQuery 是 ReactJS 中的一种代码味道 因为它遍历整个 DOM 来完成它的工作 但是 我发现有些地方很难不使用它 这是一个例子 如果可能的话 我想找到一种更好的方法 我只是想根据字段是否填充来显示或隐藏 div 上的消息
  • redux 中有 OOP 的地方吗?

    我已经使用面向对象编程实践 25 年了 并在过去 5 年里尝试转向函数式编程 但当我尝试做一些复杂的事情时 我的想法总是倾向于 OOP 尤其是现在 ES6 支持像样的OOP 语法 这是我构建东西的自然方式 我现在正在学习 Redux 并且我