1
10
将一个类分解成模块,虽然很诱人(因为在Ruby中很容易做到),但这很少是正确的答案。我通常认为分解模块的诱惑是代码告诉我它希望拆分成更紧密关注的类的方式。如果一个类太大,你想把它分成多个文件,那么它肯定违反了单一责任原则。 编辑:详细介绍一下 为什么 将代码分解成模块是一个坏主意:它会让读卡器/维护人员感到困惑。类应该表示一个集中度很高的概念。当您需要滚动数百行来查找长类文件另一端使用的实例方法的定义时,这已经够糟糕了。更糟糕的是,当您遇到一个实例方法调用并且必须在另一个文件中查找它时。 |
2
3
在完成了avdi所说的操作之后,在将任何内容放入模块之前,我会先完成以下操作:
如果1的答案是“否”,2的答案是“是”,那么imho表示最好有一个类,而不是一个模块。 此外,我认为将属性放入模块在概念上是错误的,因为类从不与任何其他类共享其属性或实例变量,换句话说,它们的内部状态。类的属性只属于该类。 业务逻辑确实属于类本身,如果A类的业务逻辑与C类有一些共同的职责,那么需要将其提取到一个基类中,以使其清晰化,而不仅仅是将其放入模块中。 |
3
1
虽然包含不同的模块可以工作,但通常比简单地在多个地方重新打开类更麻烦。 有一种宝石(非常简单),你可以用它来使它尽可能漂亮: concerned_with 示例(来自自述文件)
|
4
0
标准的成语似乎是
而foo.rb应该是
这是标准的习惯用法,它对于让你把事情搞得一团糟非常有效。不要对实例方法执行类方法。这些通常都是相当武断的区别,你最好把处理类似主题的代码放在一起。这将最小化为任何给定的更改必须触摸的文件数。 注意:Rails可能会被这样的嵌套模型弄糊涂,至少如果所有的东西都是类的话。我认为将所有嵌套文件作为模块会更好,但您必须看到。我仍然建议这样做,因为这是Ruby社区使用的常规习惯用法,但是您可能必须避免在Rails模型中同时使用foo.rb和foo/目录(如果这是您所讨论的类的话)。 |
5
0
我喜欢用红宝石的 鸭子打字 接近接口,它基本上允许您向任何对象发送任何消息,然后评估如何处理它。 这种方法允许我坚持AVDI提到的相同模式,保持类的小和简洁——只负责一件事。 Ruby的好处在于,您可以将职责委托给其他简洁的类,而不必将任何逻辑混淆在一起。例如:
这里我们有我的dog类,它有很多与dog相关的方法。它们都是特定于狗的,所以可以在这里愉快地居住。但是,如果这些方法变得有点复杂,调用其他方法,或者这只狗学习了一系列新的技巧,就会有问题!所以我可以把它们分成自己的类,然后把责任委托给那些类,比如:
所以现在,这个dog类真的开始表现得像一个与dog相关行为的接口,而这些技巧不再与之耦合。这将使测试更容易,因为可以实例化一个技巧对象并更一般地测试它,而不需要一只狗(因为它们不总是听)。 现在,我们可以有一个将责任委托给这个技巧类的cat类-尽管,那将是一个聪明的cat! 现在您还可以单独使用tricks类——这是封装单个行为的强大功能,它是自己的类。您甚至可以进一步分离这些行为-但只有作为开发人员的您知道这是否值得! |
Stilian · 存储库设置中没有Github页面部分 2 年前 |
Kellen · 查看$卷展栏功能列表 2 年前 |
Akshit Thakur Ak · 我怎样才能把铁轨停下来? 2 年前 |
johncssjs · 将数组转换为每个元素的嵌套哈希 2 年前 |
solidsnake99 · Rails db:如何绕过验证 2 年前 |