4.11 Module 

Module unterscheiden sich dadurch von Klassen, dass man keine Instanz von einem Modul bilden kann und dass keine Klasse von einem Modul erben kann.
Module werden zur Bildung von Namensräumen oder als Mixins genutzt.
Namensräume 

Eindeutige Klassennamen
Manchmal ist es erforderlich, dass wir Klassen in unterschiedlichen Zusammenhängen gleich benennen müssen, die Klassen an sich aber unterschiedlich definiert sind. Diesen Konflikt können wir lösen, indem wir diese Klassen innerhalb eines Moduls definieren. Durch das Modul als Namensraum werden die Klassennamen wieder eindeutig, weil der Aufruf der Klassen über Modulname::Klassenname erfolgt:
module Railsair class Info def name puts "RailsAir" end def home_airport puts "Luxemburg" end end end module PHPAir class Info def name puts "PHPAir" end def city puts "Berlin" end end end info = Railsair::Info.new info.name # => RailsAir
Das heißt, Module dienen dazu, Dinge zusammenzufassen. In einem Modul können mehrere Klassen definiert werden.
Module in Rails |
Überall in Rails trifft man auf Module. Zum Beispiel erben die Model-Klassen von der Klasse Base , die in dem Modul ActiveRecord definiert ist: ActiveRecord::Base . |
Mixins 

Zusätzliche Methoden
Es gibt zwei Möglichkeiten, einer Klasse zusätzliche Methoden zur Verfügung zu stellen: entweder über Vererbung oder über Mixins. Jede Klasse kann maximal von einer weiteren Klasse erben. Das heißt, sollten weitere Methoden weiterer Klassen benötigt werden, können wir das über Mixins lösen.
Mixin bedeutet, dass die Methoden des Moduls in eine Klasse hineingemischt werden. Die Methoden des Moduls stehen dann den Objekten der Klassen, die das Modul inkludieren, so zur Verfügung, als ob sie innerhalb der Klasse definiert wären.
Vorteil
Ein Vorteil von Mixins ist, dass auf diese Art und Weise Methoden innerhalb mehrerer Klassen verwendet werden können. In unserem Beispiel sollen die beiden Klassen Customer und Book eine Methode rating_stars nutzen können. Die Klasse Customer erbt aber von der Klasse Person, der diese Methode nicht zur Verfügung stehen soll. Das heißt, wir können dieses Problem lösen, indem wir die Methode rating_stars in einem Modul definieren, das sowohl von der Klasse Customer als auch von der Klasse Book inkludiert wird:
module Rateable attr_accessor :raWenn Sie, wie im ersten Beispiel gezeigt, einen Hash erzeugen?ting def rating_stars '*' * @rating unless @rating.nil? end end class Person attr_accessor :name end class Customer < Person attr_accessor :cutomer_nr include Rateable end class Book attr_accessor :title, :author include Rateable end customer = Customer.new customer.name = "Lee" customer.rating = 3 puts customer.rating_stars # => *** book = Book.new book.title = "Ruby On Rails" book.rating = 5 puts book.rating_stars # => *****
Mixins in der Klasse Array |
Die Klasse Array enthält zum Beispiel scheinbar die Methode map . Dabei handelt es sich aber um eine Methode des Moduls Enumerable , das von der Klasse Array inkludiert wird und auch von weiteren Klassen inkludiert werden kann. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.