C'è un'altra cosa che potresti voler prendere in considerazione oltre al semplice fattore di velocità.
Il codice stesso. Ed è manutenibilità.
- Questo tipo di caricamento lento rende il codice più lento da scrivere o più difficile da capire e modificare?
- Rende l'architettura più complessa che deve essere?
Seguono alcuni esempi.
if (_AllCustomers == null) {
_AllCustomers = ExpensiveDataCall();
}
return _AllCustomers; // Was: _Customers, not sure if by design.
Ora, pensa a uno scenario in cui hai già letto l'attributo AllCustomers una volta e poi hai apportato alcune modifiche che potrebbero riguardare tali dati. In che modo il chiamante ottiene un nuovo elenco di clienti se ne avesse bisogno?
Può in qualche modo forzare l'annullamento di _AllCustomers
per far sì che il ExpensiveDataCall()
si ripeta? Dovrebbe sapere anche che i dati di _AllCustomers potrebbero essere vecchi ormai?
Puoi sempre creare un metodo aggiuntivo RefreshAllCustomersData()
o simile, ma che aggiunge la complessità del tuo codice.
Questo, ovviamente, potrebbe non essere un problema nella tua applicazione. Dipende dall'architettura generale. E anche se lo fosse, la soluzione per l'aggiornamento potrebbe essere molto adatta. È ancora qualcosa da considerare.
Anche scenari più semplici, come quello a cui realmente ti interessava, potrebbero creare un sovraccarico aggiuntivo per un programmatore, se non per l'applicazione stessa.
if (_Customer == null) {
_Customer = new Customer;
}
return _Customer;
Cosa succede se un programmatore, facendo una lezione, dimentica accidentalmente di verificare la presenza di null e creare un nuovo oggetto, e restituisce solo null? Probabilmente non ci vorranno troppi secondi per accorgersene, ma potrebbe.
Quando si tratta di stili di codifica, questa è un'altra cosa da ricordare e applicare a ogni classe simile. Avere, ad esempio, solo un paio di classi di modelli che seguono questa convenzione, potrebbe essere fonte di confusione.
Inoltre, ci sono un paio di linee extra che forse potresti fare senza . Almeno, fino al punto in cui si esegue l'applicazione con il profiler e si noti che l'aggiunta di un caricamento lazy in determinate aree migliora davvero le prestazioni in modo evidente. Meno codice significa che c'è meno da leggere e meno da capire.
Tuttavia, come nel primo esempio, dipende anche la praticità di questo. Se sai che hai dei colpevoli delle prestazioni che vanno via facendo il pigro caricamento su alcune classi spesifiche, provaci.
È ancora utile misurare l'impatto che stanno facendo prima di prendere una decisione. E ogni volta che formi una solida convenzione, resta fedele ad essa.
tl; dr: mentre il caricamento lento è uno strumento utile per migliorare le prestazioni, non è sempre necessario. Questo perché ci sono anche altri fattori da considerare. Vale a dire, manutenibilità del codice.