如果您曾经使用过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构建令人惊叹的东西。