Als ich zum ersten Mal dem Prinzip der Objektorientierung begegnete welches besagt 'Bevorzuge Komposition der Vererbung' fand ich dieses auf Anhieb einleuchtend. Obwohl Polymorphismus im Fall von einer 'is a'-Beziehung und einer noch nicht zu tiefen Klassenhierarchie sicher nahe liegend ist und eine perfekte Lösung darstellt, gibt es trotzdem viele Fälle wo eine solche Kopplung zu weit geht. (Und wir womöglich sogar das LSP verletzen würden!)
Module in Ruby sind für solche Situationen natürlich geradezu prädestiniert da sie uns erlauben, solche Beziehungen mit Mixins abzubilden. Mit Modulen kann in Ruby zudem auch das Konzept der Mehrfachvererbung implementiert werden.
Nun hatte ich aber diese Woche die Anforderung, Klassen über Module mit Methoden zu erweitern und nicht Instanzen. Aufgrund der Art wie Ruby das Schlüsselwortes 'self' handhabt, lassen sich Klassenmethoden nicht ganz so einfach wie Instanzmethoden 'hineinmixen'.
Aber wie immer mit Ruby war Hilfe nicht weit und die Dokumentation führte zu der Methode 'included(othermod)'. Mit diesem Callback können nun auch Klassen mit Methoden erweitert werden ohne dass die Syntax vom Client her angepasst werden müsste:
module Mixin
def self.included other_module
other_module.extend ClassMethods
end
module ClassMethods
def bar?
true
end
end
end
class Foo
include Mixin
end
puts Foo.bar? #=> true
No comments:
Post a Comment