Ich geriet also in einen freundschaftlichen Streit mit einem Kollegen über ein Stück Code:
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;
}
}
Der Streit drehte sich um die Überschreibung des Betreibers. Mein Kollege ist der Meinung, dass es nicht die beste Programmierpraxis ist, die Werte privater Felder irgendwo anders als im Konstruktor festzulegen. Die von meinem Kollegen vorgeschlagene Lösung bestand darin, den Namen des Stuff
Eigenschaft zu AllStuff
und fügen Sie eine Eigenschaft hinzu, Stuff
die einen get
UND set
Accessor und verwenden Sie den neuen Stuff
Eigenschaft in der Überschreibung des Operators. Damit es so aussieht:
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;
}
Da bin ich anderer Meinung. Ich halte den ersten Weg für besser, da die Eigenschaft außerhalb der Klasse schreibgeschützt bleibt. Meine Frage ist: Welche Methode ist die beste für objektorientiertes Design?