Articles

Ruby: Load vs. Require vs. Include

Als Anfänger in allem ist es wichtig, nicht nur zu üben, was auch immer Sie gerade anfangen, sondern auch die Arbeit von Menschen zu studieren fortgeschritten auf dem Gebiet. Als jemand, der relativ neu in der Programmierung ist, lese ich gerne Code von Programmierern auf jeder Ebene, nur um verschiedene Ansätze für ähnliche Probleme zu entdecken.

Ein eklatanter Unterschied, den ich zwischen meinem Code und dem Code fortgeschrittener Programmierer bemerkte, ist die Dateistruktur und die Anzahl der Dateien, aber wenn Sie ein Label darauf setzen wollen, praktizierten sie die Trennung von Bedenken, und ich war es nicht. Ich wusste, dass dies ein wichtiges Konzept in der Computerprogrammierung war, aber um ehrlich zu sein, das, was mich beim Üben von SoC am meisten stolperte, war, dass ich mich einfach nicht wohl fühlte mit Load, Require und Include — aka, die Dinge, die Dateien in Ihrem Programm miteinander verknüpfen und SoC so viel einfacher zu implementieren machen.

Werfen wir einen Blick hinter die Kulissen dieser drei Methoden und wie sie Ihre Programme auf die nächste Stufe bringen können.

Include

Dieser ist ziemlich einfach. Wenn Sie mehrere Klassen mit ähnlichen Methoden geschrieben haben, können Sie diese Methoden in ein Modul extrahieren. Sobald die Methoden in das Modul geschrieben sind, können Sie dieses Modul in eine der Klassen „einschließen“, die diese Methoden möglicherweise aufrufen müssen. Sie müssen diese Methoden nicht herumhängen lassen. Unten finden Sie ein kurzes Beispiel, wie Sie es aufschreiben würden:

class Chocolate
include IceCream
endclass Vanilla
include IceCream
endmodule IceCream
def ice_cream
end
end

Jetzt haben beide Klassen Zugriff auf die ice_cream Methode durch Verwendung von include .

Load

Während include demonstriert, wie wir die Funktionalität einer anderen Ruby-Klasse verwenden können, wollen wir sehen, wie load eine ähnliche Funktionalität hat, nur anstatt Klassen anzugeben, geben wir Dateien aus unserem Projektverzeichnis an. Diese und unsere nächste Methode, require , ermöglichen es einem Programm, eine Trennung von Bedenken mit nur wenigen zusätzlichen Zeilen am Anfang Ihrer Datei (en) zu haben.

Die Grundidee bei SoC besteht darin, einen Aspekt Ihres Programms so einzukochen, dass es wirklich nur eine Sache tut. Wir tun dies, wenn wir Code so umgestalten, dass unsere Methoden und Funktionen nur eine Sache tun. Das gleiche gilt für unsere Dateien.

Bei load ist zu beachten, dass die Datei, die Sie übergeben, tatsächlich jedes Mal geladen wird, wenn sie aufgerufen wird. Wenn Sie also über eine Funktionsbibliothek verfügen, die Sie verwenden möchten, denken Sie daran, dass jedes Mal, wenn die abhängige Datei aufgerufen wird, die an load übergebene Datei ebenfalls geladen wird. Wenn sich eine Datei in Ihrer App/ Ihrem Programm aus irgendeinem Grund dynamisch ändert und als Abhängigkeit von anderen Dateien verwendet wird, sollten Sie die Verwendung von load . Andernfalls kann load aufgrund der Häufigkeit, mit der die Datei geladen wird, negative Auswirkungen auf die Leistung Ihrer App haben.

Require

Require ähnelt sehr load , aber der Hauptunterschied besteht darin, dass require die übergebene Datei nur einmal lädt und sich dann daran erinnert, dass die Datei geladen wurde. Aus diesem Grund ist require die beliebteste Option, wenn Sie Bibliotheken von Drittanbietern in Ihrem Programm oder Ihrer Anwendung verwenden. Moment mal, Bibliotheken von Drittanbietern? Diese klingen wie … Edelsteine! Das stimmt! Sobald Sie ein Juwel in Ihrem Verzeichnis installiert oder in Ihrer Gemfile angegeben haben, müssen Sie dieses Juwel nur noch oben in der Datei mit der Funktionalität dieses Edelsteins „anfordern“. Es ist ein Kinderspiel.

Nun, ich weiß, require könnte wie ein bisschen Rubinmagie klingen, also lasst uns den unbesungenen Helden in all dem ausgraben: $LOAD_PATH.

$LOAD_PATH ist eine globale Variable, die mit Ruby geliefert wird. Wenn Sie IRB von Ihrem Terminal laden und $LOAD_PATH eingeben, erhalten Sie etwas, das folgendermaßen aussieht:


Es ist nur ein Array von absoluten Pfaden. Und wenn Sie ein Juwel installieren, fügt Ruby die absoluten Pfade dieser Edelsteinbibliotheken zu Ihrem $LOAD_PATH . Das macht mehr Sinn, oder? Ruby kann einfach die Funktionalität aufrufen, die require anfordert, da es bereits den absoluten Pfad hat, um es in $LOAD_PATH zu speichern .

Ich hatte gehofft, diesen Beitrag als Mittel zu nutzen, um mehr darüber zu erfahren, warum wir diese Methoden verwenden und wie sie uns helfen, bessere Entwickler zu werden. Wenn Sie mehr darüber erfahren möchten, „wie“ diese Methoden funktionieren, sind möglicherweise zusätzliche Untersuchungen erforderlich.