Używając plików klas w języku Ruby, umieszczasz instrukcje "wymagane" na górze pliku lub wewnątrz definicji klasy?Czy instrukcje "wymagaj" Ruby są dostępne w definicji klasy lub poza nią?
Odpowiedz
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.
u góry.
require 'rubygems'
require 'fastercsv'
class MyClass
# Do stuff with FasterCSV
end
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.
Nie może zwiększać kosztów ogólnych. Nie jestem pewien co do ruby, ale importowanie innych modułów w Pythonie jest buforowane. –
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
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ń.
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.
- 1. Jakie narzędzia są dostępne dla refaktoryzacji Ruby?
- 2. Ruby: wyraźne określenie zakresu w definicji klasy
- 3. Jak zdefiniować właściwość Python * poza * definicji klasy?
- 4. Generator dokumentacji PHPDoc na platformie Eclipse lub poza nią?
- 5. Czy metody klasy Ruby są wątkowo bezpieczne?
- 6. Czy wiązania svn ruby są dostępne jako klejnot?
- 7. Kiedy element statycznej klasy constexpr wymaga definicji poza klasą?
- 8. Czy ruby są mocno lub słabo napisane?
- 9. Ruby - :: w nazwie klasy
- 10. Czy dostępne są czyste C# ZeroConf, bonjour lub dns-sd?
- 11. Czy są dostępne dobre arkusze oszukiwania ASP.NET MVC2 lub MVC3?
- 12. Wymagaj ruby gems w kontrolerze szyn
- 13. Czy polecenia raw są dostępne w StackExchange.Redis?
- 14. Czy w CSS dostępne są komentarze wielowierszowe?
- 15. Jakie klasy kolekcji wątków bezpieczne są dostępne w Silverlight 4?
- 16. Czy instrukcje Python Inline są wykonywane dwukrotnie?
- 17. coffeescript klasy nie są dostępne w głównej javascript
- 18. sizeof (* this) w definicji klasy
- 19. Czy są dostępne jakieś dobre geoparsery otwarte?
- 20. Czy jednowierszowe instrukcje "if"/"for" są dobre w stylu Pythona?
- 21. Czy są dostępne jakieś implementacje filtrów Bloomiera?
- 22. Czy dostępne są interfejsy API Sky Map?
- 23. Czy instrukcje wewnątrz lub na zewnątrz pętli?
- 24. Czy są dostępne darmowe alternatywy dla Silktest?
- 25. Czy dostępne są jakieś biblioteki ccTalk?
- 26. Czy są dostępne jakieś godne alternatywy CSLA?
- 27. Duplikat błędu definicji klasy
- 28. Definicje szablonów poza treścią klasy
- 29. Czy są dostępne zaktualizowane książki lub witryny w systemie Windows NT Native API?
- 30. "Wymagaj" w składniku kątowym
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
@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
@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