Redux是否使用经过消毒的上帝物体图案?


15

在学习Redux时,我想到了上帝对象模式(或反模式)-两者都有一个大对象,其中包含所有应用程序数据和操作它们的方法。但是Redux施加了一些约束,例如使Object不可变以及事件纯函数保持严格的签名。

因此,问题来了,Redux是否使用了经过清理的God对象版本?还是与Javascript不是经典的强类型OOP有关?


2
简短的回答:不。长答案(实际上是一个应该导致答案的问题):数据库是一类吗?或文件系统如何?还是缓存?这些都是上帝的样式吗?
code4life

IMO是的。关于Redux的第一句话是:“随着JavaScript单页面应用程序的需求变得越来越复杂,我们的代码必须比以往任何时候都管理更多的状态。” -这意味着您必须将应用程序的状态作为一个Blob进行管理。我认为这是Web应用程序特有的问题,是由用于实施Web应用程序的可怜的/从未为此设计的框架造成的。
n13

@ n13:仅仅因为它可以从一个集中的位置访问并不意味着它是一个庞大的blob。例如,以集中方式(DbContext)访问我的数据库,但其内部数据又细分为较小的部分(表,模式)。
扁平的

@Flater具有很多细分的大块仍然是一个大块。一个普通的旧OO模型在需要知道的基础上划分所有数据,这意味着每个对象仅处理非常少量的状态/数据,并且一切都非常简单。您也可以将所有内容存储在一个巨大的全局结构中,但是您不这样做,因为这是不良的软件设计。软件
101。– n13

@ n13您可以将逻辑分为子类(隐藏的或不隐藏的),既可以遵循文字说明和良好实践的意图,又可以集中对逻辑的访问。这与使用微服务而不是单个api的观点相同。尽管微服务是一种选择,但这并不意味着“正常” REST API因此是不好的做法。
扁平的

Answers:


6

什么是上帝的对象?从维基百科:

程序的全部[包含上帝的对象]的大部分功能都被编码为一个“全知”的对象,该对象保留了有关整个程序的大多数信息,还提供了用于处理此数据的大多数方法。由于该对象拥有大量数据并需要许多方法,因此它在程序中的作用类似于上帝(无所不知和无所不包)。

Redux存储仅包含一个数据对象,仅需要2或3个方法。在这方面,很难想象将其视为上帝的对象。绝对不是 “全知”。

现在,如果您的减速器根本没有分解,如果所有逻辑都在一个函数中,那么可能符合条件,但是将减速器分解为一堆较小的块以避免这种情况很简单。


我想,如果所有的减压器OP想知道一起,再加上商店,算作一个“上帝对象”。
user949300 '18

1
程序的所有模型类都一起算作上帝对象吗?
Daniel T.

我会争辩说,在传统的OOP中,它们并非都基于相同的“所有”数据进行操作,因此,并非如此。
user949300

减速器也不是都对相同的“所有”数据进行操作。单个reducer等效于单个model类。reducer的数据等效于类的字段,操作等效于类的方法(即,每个case语句等效于特定的方法。)
Daniel T.

2

IMO,以上问题不应该出现。函数式编程概念与OOPS中的概念不具有可比性,它们只是解决同一问题的不同方式。 在此处输入图片说明


5
您是否只是为这个问题制作了这张表格图片?我认为它更适合作为文本,这样它加载的速度更快,并且可以通过屏幕阅读器进行观察
Phoenix,

OOP是否还鼓励单向数据流?除非您认为OOP只是可以互相引用的类的概念,否则不是双向引用通常表示设计缺陷的正确设计。
Steven Jeuris

您在OOP和FP下提到的大多数内容甚至与第一列中的问题说明都没有任何关系。例如,功能组合只会使人们更难理解状态结构及其变化
滑雪

看来您更喜欢FP,但在我看来,您的回答有点证实了我的感觉,即它是上帝的对象。像OMG一样,我的状态是如此复杂,因为我将整个程序的整个状态视为一件大事。是的,那很复杂。在OOP中,逻辑对象模型可以更新,这根本不是什么大问题。如果它异步发生,那也很好。视图反映了对象的状态,并且在实践中非常简单。
n13

0

第一页清楚地表明Redux解决了特定于单页Web应用程序的问题:

随着对JavaScript单页应用程序的需求变得越来越复杂,我们的代码必须管理比以往更多的状态。(来自Redux-动机)

我自己的翻译是-Web应用程序和用于创建Web应用程序的框架是混乱的,当它们在浏览器中运行时,它们面临着一系列独特的问题,这些问题只是在Web应用程序之外不会出现的。

不要误会我的意思-我并不是说Web应用程序很糟糕,也不是框架很糟糕。只是毫无疑问,网页和整个范式从来没有考虑到应用程序的设计。一些网络应用程序的运行非常出色-例如,我喜欢Google Docs,它比同类本地应用程序要好。

但是Redux只是一种工具,用于管理当您不得不处理因创建在浏览器中运行的Web应用程序而引起的限制和问题时出现的问题。

对于iOS应用程序或任何本机应用程序,这没有任何意义。对象模型可轻松处理异步更改和用户交互。您将永远知道发生了什么。呈现不同的状态不是问题,并且可以通过MVC和更新事件自动执行。

您再也不会遇到像Web应用程序那样的情况。

**如果您的架构不好,那么,什么也救不了您,甚至Redux也没有;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.