2013-08-15 11 views
9

Zwykle umieszczam większość moich instrukcji require u góry pliku. Podczas czytania kodu źródłowego Poltergeist, zauważyłem następująceJakie są zalety używania `require` w module zamiast u góry?

module Capybara 
    module Poltergeist 
    require 'capybara/poltergeist/utility' 
    require 'capybara/poltergeist/driver' 
    require 'capybara/poltergeist/browser' 
    # more requires 
    end 
end 

Actual source

Jakie są zalety korzystania z require ten sposób?

Odpowiedz

6

Zaletą w tym przypadku jest to, że moduł Capybara::Poltergeist istnieje, zanim te moduły będą wymagane. Ponieważ moduły te rozszerzają moduł Capybara::Poltergeist, jest to po prostu sposób na zapewnienie, że nie zostaną załadowane, zanim moduł będzie faktycznie dostępny. Umieszczenie instrukcji require po definicji modułu miałoby taki sam efekt.

Rozważmy następujący:

# foobar.rb 
require './bar_module' 

module Foo 
    module Bar 
    end 
end 

# bar_module.rb 
module Foo::Bar 
    def baz 
    "hi!" 
    end 
end 

Taka konfiguracja nie powiedzie się, ponieważ nie zagnieżdżony składnia Foo::Bar będą oczekiwać Foo do już istniejących w chwili moduł ten jest nazywany. Zmieniając pierwszy plik do:

module Foo 
    module Bar 
    require './bar_module' 
    end 
end 

wymagać będzie działać, ponieważ Foo::Bar będzie istnieć do czasu, bar_module zaczyna robić swoje rzeczy.

W tym konkretnym przypadku, to nie ma większego praktycznego skutku, ponieważ Duch używa zagnieżdżonego modułu składni (module Foo; module Bar) zamiast zawalonej składni (module Foo::Bar), ale jest to dobra praktyka, która zasadniczo wyznacza „To wymaga tego spodziewać moduł istnieje ".

2

Nie wiem, jaka jest przewaga w twoim przykładzie.

Czasami używam require w definicji metody.

Robię to dla metod, które są rzadko używane, ale wymagają dużych bibliotek. Zaleta: duża biblioteka jest ładowana tylko wtedy, gdy jest naprawdę potrzebna.

require sprawdza, czy biblioteka jest już załadowana. Nie mam więc problemu z podwójnym ładowaniem biblioteki.

+0

Czy nie lepiej zastosować metodę autoload zamiast wstawiania żądania w metodzie? Myślę, że byłoby to bardziej eleganckie rozwiązanie, ponieważ ładowałem je tylko wtedy, gdy było to potrzebne podczas rozmowy –

Powiązane problemy