Diferencia entre una clase y un módulo
Vengo de Java y ahora trabajo más con Ruby.
Una característica del idioma con la que no estoy familiarizado es module
. Me pregunto qué es exactamente a module
y cuándo se usa uno, y por qué usar a module
en lugar de a class
.
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║ ║ class ║ module ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated ║ can *not* be instantiated ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage ║ object creation ║ mixin facility. provide ║
║ ║ ║ a namespace. ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass ║ module ║ object ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods ║ class methods and ║ module methods and ║
║ ║ instance methods ║ instance methods ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance ║ inherits behaviour and can║ No inheritance ║
║ ║ be base for inheritance ║ ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion ║ cannot be included ║ can be included in classes and ║
║ ║ ║ modules by using the include ║
║ ║ ║ command (includes all ║
║ ║ ║ instance methods as instance ║
║ ║ ║ methods in a class/module) ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension ║ can not extend with ║ module can extend instance by ║
║ ║ extend command ║ using extend command (extends ║
║ ║ (only with inheritance) ║ given instance with singleton ║
║ ║ ║ methods from module) ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
La primera respuesta es buena y ofrece algunas respuestas estructurales, pero otro enfoque es pensar en lo que estás haciendo. Los módulos tratan de proporcionar métodos que puede usar en múltiples clases; considérelos como "bibliotecas" (como vería en una aplicación Rails). Las clases tratan sobre objetos; Los módulos tratan sobre funciones.
Por ejemplo, los sistemas de autenticación y autorización son buenos ejemplos de módulos. Los sistemas de autenticación funcionan en múltiples clases a nivel de aplicación (los usuarios se autentican, las sesiones administran la autenticación, muchas otras clases actuarán de manera diferente según el estado de autenticación), por lo que los sistemas de autenticación actúan como API compartidas.
También puede usar un módulo cuando haya compartido métodos entre varias aplicaciones (nuevamente, el modelo de biblioteca es bueno aquí).
Me sorprende que nadie haya dicho esto todavía.
Dado que el autor de la pregunta tenía experiencia en Java (y yo también), aquí hay una analogía que ayuda.
Las clases son simplemente como clases de Java.
Los módulos son como clases estáticas de Java. Piensa en Math
las clases en Java. No crea una instancia y reutiliza los métodos en la clase estática (por ejemplo Math.random()
).
Básicamente, no se puede crear una instancia del módulo. Cuando una clase incluye un módulo, se genera una superclase proxy que proporciona acceso a todos los métodos del módulo, así como a los métodos de la clase.
Un módulo puede estar incluido en varias clases. Los módulos no se pueden heredar, pero este modelo "mixin" proporciona un tipo útil de "herencia múltiple". Los puristas de OO no estarán de acuerdo con esa afirmación, pero no permitan que la pureza se interponga en la realización del trabajo.
(Esta respuesta originalmente estaba vinculada a http://www.rubycentral.com/pickaxe/classes.html
, pero ese vínculo y su dominio ya no están activos).