Rails问题:关心还是不关心

2020-09-18 03:08:04

如果您曾经使用过Ruby on rails,您可能会遇到。

关注点的概念。每当您启动新的Rails项目时,都会收到一个。

应用程序/控制器/关注点和应用程序/模型/关注点目录。但是什么是。

担心什么?为什么Rails社区的人有时会说他们的坏话呢?

Rails关注点是扩展ActiveSupport::关注点模块的任何模块。你。

可能会问-关注点与模块有什么不同?主要的区别是

Rails关注点允许您使用一些魔术,如下所示:

#app/型号/关注点/trashable.rb。

可转换模块。

扩展ActiveSupport::Concerns。

包含的DO

作用域:EXISTING,->;{WHERE(TRASHED:FALSE)}。

作用域:垃圾,->;{WHERE(垃圾:TRUE)}。

端部。

定义垃圾。

UPDATE_ATTRIBUTE:已废弃,TRUE。

端部。

端部

你看这个词也包括在内。这是在铁轨上撒了一点碳水化合物。

一个Ruby模块。ActiveSupport::Concerns为您做了什么,它允许您将。

要在包含的块内计算的代码。例如,您希望。

从您的模型中提取垃圾逻辑。附带的允许您。

按照我们所做的操作,稍后将您的模型的关注点包括在内,如下所示:

在这一点上很方便也很天真,对吧?模特瘦了一点,

垃圾现在可以在其他型号中重复使用,而不仅仅是我们的Song型号。

嗯,事情可能会变得复杂。让我们潜入水中找出答案吧。

在我们进一步深入到担忧的深处之前,让我们对它们进行另一种解释。

当您看到Include SomeModule或Extended AnotherModule时,这些称为混合。

Mixin是一组可以添加到其他类中的代码。而且,正如我们都从

Ruby文档中,模块是。

方法和常量的集合。所以我们在这里做的事情包括。

将具有方法和常量的模块放入不同的类中,以便它们可以使用它们。

这正是我们对Trasable问题所做的。我们提取了共同的逻辑。

将模型对象回收到模块中。此模块稍后可以包含在。

其他地方。因此,Mixin不仅是Ruby和Rails中使用的设计模式。

但是,无论它在哪里使用,人们要么喜欢它,认为它好,要么讨厌它

认为它很容易失控地旋转。

为了更好地理解这一点,我们将讨论使用。

他们。希望通过这样做,我们可以了解何时或是否要。

使用关注点。

当您决定将某些内容提取到某个关注点(如Trasable关注点)时,您可以

现在,您可以访问包含Trasable的所有功能。这。

带来巨大的力量,但正如理查德·施尼曼在他的博客中所说。

主题是“强大的力量带来强大的编写复杂代码的能力”。

他的意思是使你可能依赖的代码复杂化,这是。

应该是你关心的问题。

可转换模块

扩展ActiveSupport::Concerns。

包含的DO。

作用域:EXISTING,->;{WHERE(TRASHED:FALSE)}。

作用域:垃圾,->;{WHERE(垃圾:TRUE)}。

端部。

定义垃圾

UPDATE_ATTRIBUTE:已废弃,TRUE。

端部。

端部。

关注的逻辑依赖于垃圾字段存在的事实。

无论是在哪里,只要有这个顾虑就行。对吗?没什么大不了的,这就是我们之后想要的。

全。但是,我所看到的是,人们会忍不住想要吸引其他的东西。

从模型到关注。来描绘一幅这是如何发生的图画,

让我们假设Song模型有另一个特色方法-Authors:

1个。

2个。

3个。

4.。

5个。

6个

7个。

8个。

9个。

10个。

11个。

12个。

13个。

14.

15个。

16个。

17.。

18岁。

19个。

20个。

21岁。

22

23个。

课堂歌曲;应用程序记录(<;ApplicationRecord)。

包括可传输。

HAS_MANY:作者。

定义专题作者(_A)。

作者。位置(特色:真)

端部。

#...。

端部。

类相册应用程序记录(<;ApplicationRecord)。

包括可传输

HAS_MANY:作者。

定义专题作者(_A)。

作者。位置(特色:真)。

端部。

#...。

端部

为了更好地说明,我添加了一个也包含Trasable的相册模型。

然后假设我们想要通知歌曲和专辑的特色作者。

当他们被扔进垃圾桶的时候。人们会忍不住把这个逻辑放在里面。

人们的担忧是这样的:

1个。

2个

3个。

4.。

5个。

6个。

7个。

8个。

9个。

10个

11个。

12个。

13个。

14.。

15个。

16个。

17.。

18岁

可转换模块。

扩展ActiveSupport::Concerns。

包含的DO。

作用域:EXISTING,->;{WHERE(TRASHED:FALSE)}。

作用域:垃圾,->;{WHERE(垃圾:TRUE)}。

端部

定义垃圾。

UPDATE_ATTRIBUTE:已废弃,TRUE。

通知(特色作者)(_A)。

端部。

定义通知(作者)。

#...

端部。

端部。

就在这里,事情开始变得有点复杂了。因为我们有。

在我们的Song模型之外丢弃逻辑,我们可能会忍不住把通知放入。

可转移的担忧。在那里,发生了一些“不对劲”的事情。这个。

特写作者取材于宋代模式。好的,让我们假设这个通过了。

拉式请求审核和配置项检查。

然后,在接下来的几个月里,设置了一个新的要求,其中。

开发者需要改变我们为歌曲呈现特色作者的方式。为。

例如,一个新的要求想要只显示来自欧洲的特色作者。

自然,开发人员会找到特色作者的定义和编辑位置。

他们。

1个

2个。

3个。

4.。

5个。

6个。

7个。

8个。

9个

10个。

11个。

12个。

13个。

14.。

15个。

16个。

17.

18岁。

19个。

课堂歌曲;应用程序记录(<;ApplicationRecord)。

包括可传输。

HAS_MANY:作者。

定义专题作者(_A)

作者。其中(特写:TRUE)。地点(地区:';欧洲';)。

端部。

#...。

端部。

类相册应用程序记录(<;ApplicationRecord)。

包括可传输

HAS_MANY:作者。

#...。

端部。

这在我们展示作者的任何地方都很有效,但是在我们部署到生产中之后,

来自世界其他地方的人们不会再收到关于

他们的歌。在使用关注点时很容易犯这样的错误。这个。

上面的示例是一个简单的、人为的示例,但是它们是“在。

“荒野”可能是超级棘手的。

这里的风险在于,关注点(Mixin)非常了解它得到的模型。

包括在。这就是所谓的循环依赖。歌曲和专辑。

依赖Trasable进行垃圾处理,Trasable依赖于这两者进行垃圾处理。

特色作者定义(_A)。同样的道理也适用于这样一个事实,即一块垃圾田地

需要在这两个模型中都存在,才能使Trasable关注点正常工作。

这就是为什么一个无关紧要的俱乐部可能会反对,而支持关注者。

俱乐部反对。我想说,Trasable的第一个版本是我想要的。

在我的代码库里。让我们看看如何使用以下工具制作第二个版本。

更好的通知。

回过头来看我们的Trasable with Notification,我们必须为此做点什么。

在使用关注点时会发生的另一件事是,我们往往会把事情弄得过于干燥。

出于演示目的,让我们尝试对现有模型执行此操作,方法是创建。

另一个令人担忧的问题(在这一点上请容忍我):

课堂歌曲;应用程序记录(<;ApplicationRecord)

包括可传输。

包括可授权的。

#...。

端部。

类相册应用程序记录(<;ApplicationRecord)。

包括可传输

包括可授权的。

#...。

端部。

我们把所有东西都弄干了,但现在对特写作者的要求来自。

欧洲并没有得到满足。更糟糕的是,现在可以解决的问题是。

模型依赖于Authorable。搞什么鬼?。我的问题是什么时候

一段时间前我在处理人们的担忧。很难追踪到哪里。

方法来自于。

我对所有这些问题的解决方案是使Feature_Authors与。

模特越多越好。Notify方法不应该是Trasable的一部分。

一点也不担心。每个型号都应该自己处理这一点,特别是在以下情况下。

他们倾向于通知不同的子组。让我们看看如何不那么痛苦地做这件事:

1个。

2个。

3个。

4.。

5个。

6个。

7个。

8个

9个。

10个。

11个。

12个。

13个。

14.。

15个。

16个

17.。

18岁。

19个。

20个。

21岁。

22。

23个。

24个

25个。

26岁。

27。

28。

29个。

30个。

31。

32位

33。

34个。

35岁。

36。

37。

38。

39.。

40岁

41。

四十二。

四三。

44。

#个问题。

可转换模块。

扩展ActiveSupport::Concerns

包含的DO。

作用域:EXISTING,->;{WHERE(TRASHED:FALSE)}。

作用域:垃圾,->;{WHERE(垃圾:TRUE)}。

端部。

定义垃圾。

UPDATE_ATTRIBUTE:已废弃,TRUE。

端部

端部。

模块可授权性。

HAS_MANY:作者。

#其他与不同模型的作者相关的有用方法。

#如果没有,那就抛开担忧吧。

端部

型号数量。

课堂歌曲;应用程序记录(<;ApplicationRecord)。

包括可传输。

包括可授权的。

定义专题作者(_A)。

作者。其中(特写:TRUE)。地点(地区:';欧洲';)

端部。

#...。

端部。

类相册应用程序记录(<;ApplicationRecord)。

包括可传输。

包括可授权的

定义专题作者(_A)。

作者。位置(特色:真)。

端部。

#...。

端部

像这样的担忧是可控的,并不太复杂。我跳过了通知。

我之前描述过的功能,因为那可以改天再讨论。

对于Rails的创建者Basecamp来说,涉及其他问题的担忧似乎。

就像推特上的DHH说明的那样,非常好。

刚才:

通过查看代码屏幕截图,您可以在。

要么敬畏,要么震惊。我觉得这里没有中间人。如果我有机会编辑。

这段代码,我会把它想象成“最后关注点老板之战”。但是笑话。

另外,有趣的是,这里有评论说。

那要看是哪一种了。请看一下:

#...

Include Subscribable#取决于可读性。

包括事件编号取决于可记录项目。

#...。

放上这样的评论可能会很有帮助,但它仍然是为做这件事而设置的。

一些粗略的东西,特别是如果您是代码库的新手。是新的,而不是新的

了解代码的所有“问题”肯定会让您陷入困境。

关注度呈螺旋式下降。

类似这样的内容是DHH在一个。

在讨论中发表评论。

里面的一条回复推文问道,使用这个代码库的人应该怎么做?

与这样的担忧进行互动。DHH回应说,他们没有太多。

书面文档,他们很少雇佣,所以他们的团队对这些非常熟悉。

但是有一个经验丰富的团队,他们非常了解代码库,这是。

使用它们是奇怪的,也不是很有力。我想这更多的是一种感觉。

不管用不用它们。您是否更习惯使用多个继承,而不是模块。

提供,还是你更喜欢构图?你说了算。

正如我们已经看到的,关注点只不过是提供一些有用语法的模块

提取和干燥您的代码的糖。如果您在您的。

腰带,也许你不应该马上伸手去解决问题。行为类似于。

处理文件附件和我们在示例中显示的垃圾处理逻辑。

可能是提取到模块(关注点)中的很好的候选者。

希望你在处理事情时能看到可能的好事和坏事。

一般的关注点和模块。请记住,没有十全十美的代码。在.中。

最后,你怎么知道什么是好的,什么是坏的,如果你不这样做的话

尝试并有可能失败还是成功?

没有十全十美的解决方案,我希望您能够理解Rails的关注点。

在博客帖子里做的事情。像往常一样,运用你的判断力,并意识到。

赞成与反对。

附注:如果你想在Ruby Magic帖子刚出版时就阅读它们,请订阅我们的Ruby Magic时事通讯,千万不要错过任何一篇帖子!

尼古拉是一名工程师和作家,在诺维萨德生活和工作,通过博客和谈话向人们传播知识。他喜欢主要用JavaScript和Ruby构建令人惊叹的东西。