在Ruby中使用mixin代替继承

在Ruby中使用mixin代替继承,ruby,oop,Ruby,Oop,我正在用Ruby编写一些工资单软件,它将被美国和加拿大的公司使用(将来可能会在其他地方扩展)。显然,对于某些类,如Employee,将有一些共享功能,但也有很多不同之处。例如,某些监管数据和业务逻辑只需在一个国家或另一个国家使用 由于一家公司在这个应用程序中只能包含一种类型的员工(即一家公司的员工只能是加拿大人或美国人),因此我考虑在运行时使用mixin添加不同的功能,而不是创建一个可能变得极其麻烦的继承层次结构。Employee类并不是唯一一个在国家之间存在差异的类,因此,在运行时动态扩展所有

我正在用Ruby编写一些工资单软件,它将被美国和加拿大的公司使用(将来可能会在其他地方扩展)。显然,对于某些类,如Employee,将有一些共享功能,但也有很多不同之处。例如,某些监管数据和业务逻辑只需在一个国家或另一个国家使用

由于一家公司在这个应用程序中只能包含一种类型的员工(即一家公司的员工只能是加拿大人或美国人),因此我考虑在运行时使用mixin添加不同的功能,而不是创建一个可能变得极其麻烦的继承层次结构。Employee类并不是唯一一个在国家之间存在差异的类,因此,在运行时动态扩展所有my类以包含区域功能似乎会有所帮助


这是组织我的应用程序的有效方法,还是有一些缺点

这听起来像是一个非常好的模块用例。请注意,尽管Ruby的标准库中也有,但您可以简单地使用它将某些消息转发到通用employee对象。在对需求了解如此之少的情况下,总是很难推荐一些东西


如果您想阅读更多关于mixin的内容,Russ Olsen的《雄辩的Ruby》有一个很好的章节(第16章,“将模块用作mixin”)。我不建议仅仅为了这个就买这本书,但不管怎样,这本书还是不错的读物。我不确定,在那本书的某个地方,甚至似乎有一个与你试图做的事情有些相似的例子(不同的背景,相同的原则)

一般来说,在大多数情况下,我觉得最好使用mixin而不是继承。继承是一种非常特殊的关系,通常似乎比它所传递的力量更复杂。通常,继承似乎需要更多地处理基类,而不是看起来更健康。当需要一个新的子类时,基类倾向于使用一个或多个子类的特殊逻辑来增长。我发现mixin更易于重用,因为它们往往更小,更专注于一个问题