Ruby: Load vs. Require vs. Include
jako początkujący we wszystkim, ważne jest nie tylko ćwiczenie tego, co możesz zaczynać, ale także studiowanie pracy ludzi bardziej zaawansowanych w tej dziedzinie. Jako ktoś stosunkowo nowy w programowaniu, lubię czytać kod od programistów na każdym poziomie, aby odkryć różne podejścia do podobnych problemów.
jedną z rażących różnic, jaką zauważyłem między moim kodem a kodem bardziej zaawansowanych programistów, jest struktura plików i liczba plików, ale jeśli chcesz umieścić na niej Etykietę, oni ćwiczyli oddzielanie problemów, a ja nie. wiedziałem, że to ważna koncepcja w programowaniu komputerowym, ale szczerze mówiąc, najbardziej mnie potknęło w praktykowaniu SoC, że po prostu nie czułem się komfortowo używając Load, Require i Include — czyli rzeczy, które łączą pliki w twoim programie i sprawiają, że SoC jest o wiele łatwiejszy do wdrożenia.
przyjrzyjmy się za kulisy tych trzech metod i jak mogą one przenieść Twoje programy na wyższy poziom.
Include
ten jest dość prosty. Jeśli napisałeś kilka klas, które mają podobne metody, możesz wyodrębnić te metody do modułu. Gdy metody zostaną zapisane w module, możesz „dołączyć” ten moduł do dowolnej klasy, która może wymagać wywołania tych metod. Nie musisz trzymać tych metod w pobliżu. Poniżej krótki przykład jak byś to napisał:
class Chocolate
include IceCream
endclass Vanilla
include IceCream
endmodule IceCream
def ice_cream
end
end
teraz obie klasy mają dostęp do metodyice_cream
poprzez użycieinclude
.
Load
podczas gdy include
pokazuje, jak możemy użyć funkcji use z innej klasy Ruby, zobaczmy, jak load
ma podobną funkcjonalność, tylko zamiast określać klasy, określamy pliki z naszego katalogu projektu. Ta i nasza następna metoda, require
, umożliwiają programowi oddzielenie problemów za pomocą kilku dodatkowych linii u góry pliku(ów).
podstawową ideą SoC jest sprowadzenie jakiegoś aspektu programu tak, aby naprawdę robił tylko jedną rzecz. Robimy to, gdy refaktorujemy kod tak, że nasze metody i funkcje robią tylko jedną rzecz. To samo dotyczy naszych plików.
rzeczą do zapamiętania za pomocąload
jest to, że plik, który przekazujesz, będzie faktycznie ładowany za każdym razem, gdy zostanie wywołany. Tak więc, jeśli masz bibliotekę funkcjonalności, której chcesz użyć, pamiętaj, że za każdym razem, gdy wywoływany jest zależny plik, plik przekazany do load
jest również, cóż, załadowany. Jeśli z jakiegoś powodu plik w aplikacji / programie zmienia się dynamicznie i jest używany jako zależność od innych plików, powinieneś rozważyć użycie load
. W przeciwnym razie load
może mieć niekorzystny wpływ na wydajność aplikacji ze względu na liczbę załadowań pliku.
Require
Require jest podobne doload
, ale główna różnica polega na tym, że require załaduje przekazany plik tylko raz, a następnie zapamięta, że plik został załadowany. Z tego powodu require
jest bardziej popularną opcją, gdy używasz bibliotek innych firm w swoim programie lub aplikacji. Chwileczkę, biblioteki innych firm? To brzmi jak … klejnoty! Zgadza się! Po zainstalowaniu klejnotu w katalogu lub określeniu go w pliku, musisz tylko „wymagać” tego klejnotu na górze pliku, korzystając z funkcjonalności tego klejnotu. Bułka z masłem.
teraz wiem, że require
może brzmieć jak odrobina magii Ruby, więc odkryjmy w tym wszystkim nieznanego bohatera: $LOAD_PATH
.
$LOAD_PATH
jest zmienną globalną dostarczaną z Rubim. Jeśli załadujesz IRB ze swojego terminala i wpiszesz$LOAD_PATH
, otrzymasz coś podobnego:
to tylko tablica ścieżek absolutnych. A kiedy instalujesz gem, Ruby dodaje ścieżki bezwzględne tych bibliotek gem do $LOAD_PATH
. To ma sens, prawda? Ruby może po prostu wywołać funkcjonalnośćrequire
jest żądana, ponieważ ma już bezwzględną ścieżkę, aby ją zapisać w$LOAD_PATH
.
miałem nadzieję użyć tego postu jako środka do zbadania, dlaczego używamy tych metod i jak pomagają nam stać się lepszymi programistami. Jeśli jesteś zainteresowany bardziej „jak” te metody pracy, dodatkowe badania mogą być … wymagane.