2009-03-03 8 views

Odpowiedz

42

Technicznie nie ma to znaczenia. require to zwykłe wywołanie metody, a zakres, do którego jest wywoływany, nie wpływa na sposób jego działania. Jedyne umiejscowienie różnic sprawia, że ​​zostanie wykonany, gdy zostanie oceniony jakikolwiek kod, który jest umieszczony.

Praktycznie rzecz biorąc, powinieneś umieścić je na górze, aby ludzie mogli zobaczyć zależność pliku na pierwszy rzut oka. To tradycyjne miejsce.

+0

Czy to oznacza, że ​​możesz uczynić aplikację Ruby bardziej wydajną (mniej pamięci, szybszy czas wykonania - tak, wiem, że wymagania są naprawdę szybkie, ale ...), wykonując tylko wymagane wywołanie metody * jeśli * naprawdę potrzebujesz to? – Ash

+0

@Ash: Nie powiedziałbym, że jest to szczególnie prawdopodobne. Jest to * możliwe *, ale w większości przypadków kara za wykonanie wymaga za każdym razem, gdy metoda zostanie nazwana, przewyższy wszelkie oszczędności, na które możesz liczyć. Zrobiłem to kilka razy, ale tylko w dość dziwnych okolicznościach. – Chuck

+0

@Ash: Co ważniejsze, boli czytelność. Jeśli plik jest tak drogi, aby wymagać, jest to prawdopodobnie problem sam w sobie. Generalnie nie warto szkodzić czytelności. – Chuck

19

u góry.

require 'rubygems' 
require 'fastercsv' 

class MyClass 
    # Do stuff with FasterCSV 
end 
3

W górnej części pliku większość (ale nie wszystkie) języków obsługuje import w ten sposób. Uważam, że jest to o wiele czystsze i łatwiejsze w obsłudze w ten sposób.

myślę, że to ma sens tylko w ten sposób naprawdę ... jak można dostać w połowie drogi w pliku następnie:

class Foo 
    def initialize(init_value) 
    @instance_var = init_value 

# some 500 lines of code later.... 

    end 
end 

class Bar 
# oh look i need an import now! 
require 'breakpoint' 

jak widać, byłoby bardzo trudno je śledzić. Nie wspominając już o tym, że chciałbyś użyć zaimportowanych funkcji wcześniej w swoim kodzie wcześniej, prawdopodobnie musiałbyś wrócić do niego i uwzględnić go ponownie, ponieważ inny import byłby specyficzny dla tej klasy. Zaimportowanie tych samych plików spowodowałoby znaczne obciążenie również w czasie wykonywania.

+0

Nie może zwiększać kosztów ogólnych. Nie jestem pewien co do ruby, ale importowanie innych modułów w Pythonie jest buforowane. –

13

Widzę możliwy powód, dla którego nie umieszczam pliku require w górnej części pliku: gdzie jest on drogi i nie zawsze jest uruchamiany. Jeden przypadek, który występuje, to miejsce, w którym na przykład kod i jego testy znajdują się w tym samym pliku, co jest czymś, co lubię robić od czasu do czasu, szczególnie w przypadku małego kodu biblioteki. Następnie mogę uruchomić plik z mojego edytora i uruchomić testy. W tym przypadku, gdy plik jest inny niż require, nie chcę ładować pliku test/unit.

Coś trochę tak:

def some_useful_library_function() 
    return 1 
end 

if __FILE__ == $0 
    require 'test/unit' 
    class TestUsefulThing < Test::Unit::TestCase 
    def test_it_returns_1 
     assert_equal 1, some_useful_library_function() 
    end 
    end 
end 
9

To naprawdę nie ma znaczenia, gdzie je umieścić, ale jeśli je wewnątrz wyrażenie class lub module, to wygląda na to, co importujesz znajduje się w pliku d klasy require w przestrzeni nazw klasy, co nie jest prawdą: wszystko kończy się w globalnej przestrzeni nazw (lub w jakimkolwiek innym obszarze nazw zdefiniowanym jako w bibliotece).

Lepiej umieścić je u góry, aby uniknąć nieporozumień.

1

Uważam, że instrukcja wymaga należy do klasy. Używanie klas oznacza, że ​​akceptujemy podstawową zasadę OOP, a mianowicie obiekty powinny być tak luźno powiązane, jak to tylko możliwe. Dla mnie oznacza to minimalizację zewnętrznych zależności. Jeśli później przeniesię klasę do jej własnego pliku, nie chcę go łamać, ponieważ nie wyśledziłem wszystkich wymaganych instrukcji, które klasa zużywa.

Nie powoduje żadnych problemów z powieleniem wymaganiami w pliku i upraszcza refaktoryzację, która nieuchronnie będzie miała miejsce przez następnego programistę, który dziedziczy Twój kod.

Powiązane problemy