在Ruby中,由于可以包含多个mixin,但只能扩展一个类,因此mixin似乎比继承更受欢迎.

我的问题:如果你写的代码必须经过扩展/包含才能有用,为什么你要把它变成一个类?或者换句话说,你为什么不把它变成一个模块呢?

我只能想到一个你想要一个类的原因,那就是如果你需要实例化这个类.然而,在ActiveRecord::Base的情况下,您从未直接实例化它.那么,它不应该是一个模块吗?

推荐答案

我在100篇(顺便说一句,这本书很棒)中读到了这个话题.作者在解释方面比我做得更好,所以我将引用他的话:


没有任何一条规则或公式总能产生正确的设计.但是保持一个

  • Modules don’t have instances.因此,实体或事物通常是最好的

  • A class can have only one superclass, but it can mix in as many modules as it wants.如果

在一个例子中总结这些规则,下面是你不应该做的:

module Vehicle 
... 
class SelfPropelling 
... 
class Truck < SelfPropelling 
  include Vehicle 
... 

相反,你应该这样做:

module SelfPropelling 
... 
class Vehicle 
  include SelfPropelling 
... 
class Truck < Vehicle 
... 

第二个版本对实体和属性进行了更加简洁的建模.卡车

Ruby相关问答推荐

为什么 rdoc 注释似乎以两个井号/井号符号开头?

ruby:比较两个单词并从中提取不常见的字母

安全导航运算符的使用是否应该在两种情况下进行单元测试(对象存在 + 对象无)?

Ruby:拆分,然后删除前导/尾随空格?

使用 Ruby 将文件从一个目录复制到另一个目录

如何在 Ruby 中生成子进程?

Ruby 中的字符串是可变的吗?

如何正确截断表格?

如何将参数传递给 array.map 快捷方式?

Ruby 中的 main是什么?

Vagrant - 如何拥有特定于主机平台的配置步骤

我如何需要特定版本的 ruby​​ gem?

Ruby 多维数组

RSpec allow/expec vs expect/and_return

如何使用 RVM 更新 Ruby 解释器?

了解 Ruby 的加载路径

如何在 Ruby 的 IRB 中启用自动完成

Ruby 异常 - 为什么是else?

如何使用#{variable}在Ruby中格式化带有浮点数的字符串?

将浮点数舍入到Ruby中最接近的整数