Así que se metió en una discusión amistosa con un compañero de trabajo a través de una pieza de código:¿Debo usar un campo o propiedad dentro de la clase para establecer los valores
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;
}
}
El argumento era sobre la anulación del operador. Mi compañero de trabajo siente que no es la mejor práctica de programación establecer valores de campos privados en ninguna parte que no sea el constructor. La solución propuesta por mi compañero de trabajo fue refactorizar el nombre de la propiedad Stuff
al AllStuff
y agregar una propiedad, Stuff
, que tiene un acceso get
Y set
y usar la nueva propiedad Stuff
en la anulación del operador. Para que se vea así:
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;
}
I disagree. Creo que la primera forma es mejor, ya que mantiene la propiedad solo de lectura fuera de la clase. Mi pregunta es, ¿cuál es la mejor práctica para el diseño orientado a objetos?
@cyber: Creo que esto es más una cuestión de que el OP no está del todo claro. Me pareció que su compañero de trabajo abogaba por no cambiar una variable privada directamente fuera del constructor o la implementación de la propiedad. No creo que defendiera mantener los valores iguales para la vida del objeto. –