Diciamo che sto progettando oggetti business attorno a un database poco ottimizzato che non ha alcuna possibilità di cambiare.
Ho un oggetto Person con una proprietà ShippingAddress . Il ShippingAddress è molto costoso da caricare e si trova in una tabella separata, e una minoranza di pagine lo usa. Ci sono momenti in cui migliaia di oggetti Person devono essere caricati su una singola pagina, quindi mangiare la performance non è un'opzione. Questo rende pigro il caricamento ideale di ShippingAddress per questa situazione.
Tuttavia, dal punto di vista della logica aziendale / consumatore / firma non vi è alcun motivo per cui ShippingAddress debba essere diverso dalla proprietà Nome caricata con entusiasmo. Per questo motivo, ho deciso di rendere la firma di proprietà pubblica di ShippingAddress come una stringa regolare mentre il suo campo di backing privato è Lazy di C #. La domanda è, come devo impostarla? Ho creato due opzioni che mantengono la separazione della logica di accesso ai dati:
L'opzione 1 , utilizzando il metodo di set di stile java sovraccarico, mi sembra migliore OO e più coerente da una prospettiva interna poiché sfrutto l'overloading dei metodi:
Lazy<string> _address;
public string Address { get { return _address == null ? null : _address.Value; } }
public void SetAddress(Func<string> address)
{
_address = new Lazy<string>(address);
}
public void SetAddress(string address)
{
SetAddress(() => address);
}
L'opzione 2 sembra molto migliore / coerente dal punto di vista del consumatore, ma i due metodi di impostazione sembrano molto disgiunti in un modo che mi dà fastidio:
Lazy<string> _address;
public string Address
{
get { return _address == null ? null : _address.Value; }
set { SetAddress(() => value); }
}
public void SetAddress(Func<string> address)
{
_address = new Lazy<string>(address);
}
Qualcuno con più esperienza di me (la maggior parte di voi presumo) che usa la classe pigra di C # ha qualche idea su quale sia il migliore e perché?