così ho preso in una discussione con un collega nel corso di un pezzo di codice:Dovrei usare un campo o la proprietà all'interno della classe per impostare i valori
public sealed class NewObject
{
private string _stuff = string.Empty;
public string Stuff
{
get { return GetAllStuff(); }
}
private string GetAllStuff()
{
//Heavy string manipulation of _stuff
}
public NewObject(string stuffToStartWith)
{
_stuff = stuffToStartWith;
}
public static NewObject operator +(NewObject obj1, NewObject obj2)
{
if (obj1 == null)
throw new ArgumentNullException();
if (obj2 == null)
throw new ArgumentNullException();
NewObject result = new NewObject(string.Empty);
result._stuff = String.Concat(obj1._stuff, obj2._stuff);
return result;
}
}
L'argomento era finita l'override dell'operatore. Il mio collaboratore ritiene che non sia la migliore pratica di programmazione per impostare i valori dei campi privati ovunque tranne il costruttore. La soluzione proposta dal mio collega di lavoro era quella di refactoring il nome della proprietà Stuff
a AllStuff
e aggiungere una proprietà, Stuff
, che ha un accesso get
E set
e utilizzare la nuova proprietà Stuff
nell'override dell'operatore. Assomigli a questo:
public static NewObject operator +(NewObject obj1, NewObject obj2)
{
if (obj1 == null)
throw new ArgumentNullException();
if (obj2 == null)
throw new ArgumentNullException();
NewObject result = new NewObject(string.Empty);
result.Stuff = String.Concat(obj1.Stuff, obj2.Stuff);
return result;
}
Non sono d'accordo. Sento che il primo modo è migliore poiché mantiene la proprietà di sola lettura al di fuori della classe. La mia domanda è, qual è la migliore pratica per la progettazione orientata agli oggetti?
@cyber: Penso che questo sia più una questione dell'OP non essere del tutto chiaro. Mi sembrava che il suo collaboratore sostenesse di non modificare una variabile privata direttamente al di fuori del costruttore o dell'implementazione della proprietà. Non penso che sostenesse di mantenere i valori uguali per la vita dell'oggetto. –