Ruby: Load vs. Require vs.Include
als beginner in alles is het belangrijk om niet alleen te oefenen waar je aan begint, maar ook om het werk te bestuderen van mensen die meer gevorderd zijn in het veld. Als iemand die relatief nieuw is in programmeren, lees ik graag code van programmeurs op elk niveau, alleen maar om verschillende benaderingen van soortgelijke problemen te ontdekken.
Een oog springende verschil merkte ik tussen mijn code en de code van de meer geavanceerde programmeurs is bestandsstructuur en het aantal bestanden, maar als je wilt om een etiket op, ze waren het beoefenen van Scheiding van belangen, en ik niet. Ik wist dat dit een belangrijk concept in het programmeren van computers, maar, eerlijk is eerlijk, het ding struikelen mij het meest in het beoefenen van de SoC is dat ik het gewoon niet comfortabel gebruik van de Belasting, Eisen, en Zijn — aka, de dingen die koppelen van bestanden in uw programma samen, en maken SoC dus veel gemakkelijker te implementeren.
laten we eens een kijkje nemen achter de schermen bij deze drie methoden en hoe ze uw programma ‘ s naar het volgende niveau kunnen brengen.
Include
Deze is vrij eenvoudig. Als u meerdere klassen hebt geschreven die soortgelijke methoden delen, kunt u deze methoden extraheren in een Module. Zodra de methoden zijn geschreven in de module, je zou kunnen “opnemen” die module in een van de klassen die nodig zijn om een beroep te doen op deze methoden. Je hoeft die methoden niet te laten hangen. Hieronder is een kort voorbeeld van hoe je het uit zou schrijven:
class Chocolate
include IceCream
endclass Vanilla
include IceCream
endmodule IceCream
def ice_cream
end
end
nu hebben beide klassen toegang tot de ice_cream
methode door gebruik van include
.
Load
terwijl include
laat zien hoe we gebruik kunnen maken van functionaliteit van een andere Ruby Klasse, laten we eens kijken hoe load
heeft een soortgelijke functionaliteit, alleen in plaats van het specificeren van klassen, specificeren we bestanden uit onze project directory. Dit, en onze volgende methode, require
, stellen een programma in staat om een scheiding van zorgen te hebben met slechts een paar extra regels bovenaan je bestand(en).
Het basisidee van SoC is om een aspect van je programma samen te stellen zodat het eigenlijk maar één ding doet. We doen dit wanneer we refactor code, zodat onze methoden en functies slechts één ding doen. Hetzelfde geldt voor onze dossiers.
wat je moet onthouden met load
is dat het bestand dat je doorgeeft daadwerkelijk wordt geladen elke keer dat het wordt aangeroepen. Dus, als je een bibliotheek met functionaliteit hebt die je hoopt te gebruiken, onthoud dan dat elke keer dat het afhankelijke bestand wordt genoemd, het bestand dat wordt doorgegeven aan load
ook geladen is. Als Om welke reden dan ook een bestand in uw app/programma dynamisch verandert, en wordt gebruikt als een afhankelijkheid van andere bestanden, moet u overwegen om load
te gebruiken . Anders kan load
nadelige effecten hebben op de prestaties van uw app vanwege het aantal keren dat het bestand wordt geladen.
Require
Require lijkt veel op load
, maar het belangrijkste verschil is dat require het doorgegeven bestand slechts één keer zal laden, en dan onthouden dat het bestand is geladen. Om deze reden is require
de populairste optie wanneer u bibliotheken van derden gebruikt in uw programma of toepassing. Wacht even, bibliotheken van derden? Dat klinkt als … edelstenen! Dat klopt! Zodra u een edelsteen in uw directory installeert of in uw Gemfile opgeeft, hoeft u alleen dat edelsteen bovenaan het bestand te “vereisen” met behulp van de functionaliteit van dat edelsteen. Het is een makkie.
nu Weet ik dat require
klinkt als een beetje Ruby magic, dus laten we de onbekende held in dit alles opgraven: $LOAD_PATH
.
$LOAD_PATH
is een globale variabele die wordt geleverd met Ruby. Als je IRB van je terminal laadt en $LOAD_PATH
intypt , krijg je iets dat hierop lijkt:
Het is gewoon een array van absolute paden. En wanneer je een gem installeert, voegt Ruby de absolute paden van die gem bibliotheken toe aan je $LOAD_PATH
. Dat klinkt logischer, toch? Ruby kan eenvoudig de functionaliteit require
opvragen omdat het al het absolute pad heeft om het op te slaan in $LOAD_PATH
.
ik hoopte dit bericht te gebruiken als een middel om meer te onderzoeken waarom we deze methoden zouden gebruiken en hoe ze ons helpen om betere ontwikkelaars te worden. Als u geïnteresseerd bent in meer van de “hoe” deze methoden werken, extra onderzoek kan worden… vereist.