Articles

Ruby: Load vs. Require vs. Include

Come principiante in qualsiasi cosa, è importante non solo praticare qualunque cosa tu stia iniziando, ma anche studiare il lavoro di persone più avanzate nel campo. Come qualcuno relativamente nuovo alla programmazione, mi piace leggere il codice dai programmatori a qualsiasi livello, solo per scoprire diversi approcci a problemi simili.

Una clamorosa differenza che ho notato tra il mio codice e il codice di più i programmatori avanzati è la struttura di file e il numero di file, ma se vuoi mettere un’etichetta su di esso, essi praticavano la Separazione delle Preoccupazioni, e io non lo ero. Ho saputo che questo era un concetto importante nella programmazione dei computer, ma, ad essere onesti, la cosa di intervento me la maggior parte in pratica SoC è che semplicemente non ero agio usando Carico, Richiedono, e Comprendono, aka, le cose che il link al file del programma, e fare SoC in modo molto più facile da implementare.

Diamo un’occhiata dietro le quinte a questi tre metodi e come possono portare i tuoi programmi al livello successivo.

Include

Questo è abbastanza semplice. Se sono state scritte diverse classi che condividono metodi simili, è possibile estrarre tali metodi in un modulo. Una volta che i metodi sono stati scritti nel modulo, è possibile “includere” quel modulo in una qualsiasi delle classi che potrebbero dover chiamare tali metodi. Non c’è bisogno di tenere quei metodi in giro. Di seguito è riportato un breve esempio di come lo scriveresti:

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

Ora entrambe le classi hanno accesso al metodo ice_creamattraverso l’uso di include.

Load

Mentreinclude dimostra come possiamo usare la funzionalità use di un’altra classe Ruby, vediamo comeload ha una funzionalità simile, solo che invece di specificare le classi, stiamo specificando i file dalla nostra directory di progetto. Questo, e il nostro metodo successivo,require , consentono a un programma di avere una separazione delle preoccupazioni con solo poche righe extra nella parte superiore dei file.

L’idea di base con SoC è di ridurre un aspetto del tuo programma in modo che faccia davvero solo una cosa. Lo facciamo quando rifattorizziamo il codice in modo che i nostri metodi e funzioni facciano solo una cosa. Lo stesso vale per i nostri file.

La cosa da ricordare con load è che il file che stai passando verrà effettivamente caricato ogni volta che viene chiamato. Quindi, se hai una libreria di funzionalità che speri di usare, ricorda che ogni volta che il file dipendente viene chiamato il file passato a load è anche, beh, caricato. Se per qualsiasi motivo un file nella tua app / programma sta cambiando dinamicamente e viene utilizzato come dipendenza da altri file, dovresti considerare l’utilizzo di load . In caso contrario,load potrebbe avere effetti negativi sulle prestazioni della tua app a causa del numero di volte in cui il file viene caricato.

Require

Require è molto simile a load, ma la differenza principale è che require caricherà il file passato solo una volta, e quindi ricorderà che il file è stato caricato. Per questo motivo,require è l’opzione più popolare quando si utilizzano librerie di terze parti nel programma o nell’applicazione. Aspetta un attimo, librerie di terze parti? Sembrano gems gemme! Esatto! Una volta installata una gemma nella tua directory o specificata nel tuo Gemfile, devi solo “richiedere” quella gemma nella parte superiore del file usando la funzionalità di quella gemma. E ‘ un gioco da ragazzi.

Ora, so cherequire potrebbe sembrare un po ‘ di Ruby magic, quindi dissotterriamo l’eroe non celebrato in tutto questo:$LOAD_PATH.

$LOAD_PATH è una variabile globale fornita con Ruby. Se carichi IRB dal tuo terminale e digiti $LOAD_PATH, otterrai qualcosa che assomiglia a questo:


È solo una serie di percorsi assoluti. E quando installi una gemma, Ruby aggiunge i percorsi assoluti di quelle librerie di gemme al tuo $LOAD_PATH. Che ha più senso giusto? Ruby può semplicemente chiamare la funzionalitàrequire sta richiedendo poiché ha già il percorso assoluto per memorizzarlo in$LOAD_PATH .

Speravo di usare questo post come un mezzo per esplorare più del perché dovremmo usare questi metodi e come ci aiutano a diventare sviluppatori migliori. Se sei interessato a più del” come ” funzionano questi metodi, potrebbero essere necessarie ulteriori ricerche.