Ho una domanda sulle "migliori pratiche" su OOP in C # (ma in qualche modo si applica a tutte le lingue).
Prendi in considerazione la possibilità di avere una classe di libreria con un oggetto che deve essere esposto al pubblico, ad esempio tramite l'accesso alla proprietà, ma non vogliamo che il pubblico (le persone che usano questa classe di libreria) lo cambi.
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
Ovviamente l'approccio migliore è "opzione C", ma pochissimi oggetti hanno la variante ReadOnly (e certamente nessuna classe definita dall'utente ce l'ha).
Se tu fossi l'utente di classe A, ti aspetteresti modifiche a
List<string> someList = ( new A() ).Items;
propagarsi all'oggetto originale (A)? O va bene restituire un clone purché sia stato scritto in commenti / documentazione? Penso che questo approccio al clone potrebbe portare a bug piuttosto difficili da rintracciare.
Ricordo che in C ++ potevamo restituire oggetti const e potevi chiamare solo metodi contrassegnati come const su di esso. Immagino che non ci sia tale caratteristica / modello nel C #? In caso contrario, perché non dovrebbero includerlo? Credo che si chiama const correttezza.
Ma ancora una volta la mia domanda principale riguarda "cosa ti aspetteresti" o come gestire l'opzione A vs B.