Я пришел с Java, и теперь я больше работаю с Ruby.
Одна из особенностей языка, с которой я не знаком, - это module
. Мне интересно, что такое module
и когда вы его используете, и зачем использовать module
поверх class
?
Я пришел с Java, и теперь я больше работаю с Ruby.
Одна из особенностей языка, с которой я не знаком, - это module
. Мне интересно, что такое module
и когда вы его используете, и зачем использовать module
поверх class
?
Первый ответ хорош и дает некоторые структурные ответы, но другой подход - подумать о том, что вы делаете. Модули касаются предоставления методов, которые вы можете использовать в нескольких классах - подумайте о них как о "библиотеках" (как вы видели в приложении Rails). Классы посвящены объектам; модули относятся к функциям.
Например, системы аутентификации и авторизации являются хорошими примерами модулей. Системы аутентификации работают на нескольких классах приложений (пользователи проходят аутентификацию, сеансы управляют аутентификацией, многие другие классы будут действовать по-разному на основе состояния auth), поэтому системы аутентификации действуют как общие API-интерфейсы.
Вы также можете использовать модуль, если у вас есть общие методы для нескольких приложений (опять же, модель библиотеки здесь хороша).
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║ ║ 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) ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
Я удивлен, что кто-то еще этого не сказал.
Так как искатель пришел с фона Java (и так сделал я), здесь есть аналогия, которая помогает.
Классы просто похожи на классы Java.
Модули похожи на статические классы Java. Подумайте о классе Math
в Java. Вы не создаете экземпляр, и вы повторно используете методы в статическом классе (например, Math.random()
).
В принципе, модуль не может быть создан. Когда класс включает модуль, создается прокси-суперкласс, который обеспечивает доступ ко всем методам модуля, а также к методам класса.
Модуль может быть включен несколькими классами. Модули не могут быть унаследованы, но эта модель "mixin" обеспечивает полезный тип "множественного наследования". Пуристы OO не согласятся с этим утверждением, но не допускают, чтобы чистота мешала выполнению этой работы.
(Этот ответ первоначально был связан с http://www.rubycentral.com/pickaxe/classes.html
, но эта ссылка и ее домен больше не активны.)
Module
в Ruby в какой-то степени соответствует абстрактному классу Java - имеет методы экземпляра, классы могут наследовать от него (через include
, ребята Ruby называют это "mixin" ), но не имеют экземпляров. Существуют и другие незначительные отличия, но этой информации достаточно, чтобы вы начали.
источник (вы можете узнать характеристики модуля оттуда)
Модуль представляет собой набор методов и констант. Методы в модуле могут быть методами экземпляра или модульными методами. Методы экземпляров отображаются как методы в классе при включении модуля, а методы модуля - нет. И наоборот, модульные методы могут быть вызваны без создания инкапсулирующего объекта, в то время как методы экземпляра могут отсутствовать.
Нижняя строка: модуль является перекрестком между классом static/utility и mixin.
Микшины являются многоразовыми фрагментами "частичной" реализации, которые могут быть объединены (или составлены) в сочетании и соответствуют моде, чтобы помочь создавать новые классы. Конечно, эти классы могут иметь собственное состояние и/или код.
Класс
Когда вы определяете класс, вы определяете схему для типа данных. данные удержания класса, имеют метод, который взаимодействует с этими данными и используется для создания объектов.
Модуль
Модули - это способ группировки методов, классов и констант.
Модули дают вам два основных преимущества:
= > Модули предоставляют пространство имен и предотвращают конфликты имен. Пространство имен помогает избежать конфликтов с функциями и классами с тем же именем, которые были написаны кем-то другим.
= > Модули реализуют средство mixin.
(в том числе модуль в Klazz дает примеры доступа Klazz к модулю методы. )
(расширяйте Klazz с Mod, предоставляя классу Klazz доступ к методам Mods.)