Ho una domanda sulle "migliori pratiche" su OOP in C # (ma si applica a tutte le lingue).
Considera di avere una classe di libreria con oggetto che deve essere esposto al pubblico, ad esempio tramite accessor di proprietà, ma non vogliamo che il pubblico (le persone che usano questa classe di librerie) lo cambino.
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 della classe A, ti aspetteresti cambiamenti in
List<string> someList = ( new A() ).Items;
si propagano nell'oggetto originale (A)? O è giusto restituire un clone a condizione che sia stato scritto così nei commenti / documentazione? Penso che questo approccio al clone potrebbe portare a bug piuttosto difficili da tracciare.
Ricordo che in C ++ potevamo restituire oggetti const e si poteva solo chiamare metodi contrassegnati come const su di esso. Immagino che non ci siano tali caratteristiche / pattern nel C #? Se no, perché non dovrebbero includerlo? Credo che sia chiamato const correctness.
Ma di nuovo la mia domanda principale riguarda "cosa ti aspetti" o come gestire l'opzione A vs B.