2009-07-31 11 views
5

Powiedz, że piszę moduł mixin, który dodaje funkcjonalność do klasy innej firmy. Oczywiście niektóre metody i zmienne instancji, które chcę udostępnić klasie trzeciej i jej klientom. Stanowią one publiczny interfejs modułu mixin.Jak napisać higieniczny mix Rubin?

Ale chcę, aby niektóre inne metody i zmienne instancji zostały hermetyzowane. Nie chcę, żeby były dostępne dla klasy, w której się mieszam, a w szczególności nie chcę, aby przypadkowo przesłoniły, zaciągnęły cień, zaatakowały lub w inny sposób zakłócały metody lub zmienne instancji klasy mixee - albo te które obecnie mogą istnieć lub te, które mogą zostać utworzone w przyszłości, jeśli strona trzecia modyfikuje klasę, w której się mieszam.

Jakie środki ostrożności należy podjąć, jeśli w ogóle, aby upewnić się, że mój mixin jest "higieniczny" w ten sposób?

Odpowiedz

2

Utwórz oddzielny obiekt, który będzie enkapsulować zmienne funkcji i instancji, a następnie polecenie mixin przekaże metody publicznie dostępne dla tego obiektu. Teraz musisz powiązać tylko jedną instancję ze swoim obiektem. Można nawet tego uniknąć, przechowując w module {Mixee => Delegate} Hash i wykonując odnośnik na początku każdej metody mieszanej.

1

Być może można utworzyć submoduł zawierający wszystkie metody użytkowe.

module Foo 
    module Utils 
    def self.answer 
     42 
    end 
    end 
    def helpme 
    "the answer is #{Utils.answer}" 
    end 
end 
include Foo 
puts helpme