Tengo una clase que tengo que llamar uno o dos métodos muchas veces después de la otra. Los métodos actualmente devuelven void
. Estaba pensando, ¿sería mejor devolverlo this
, para que los métodos se puedan anidar? ¿o eso se considera muy, muy, muy malo? o si es malo, ¿sería mejor si devuelve un objeto nuevo del mismo tipo? ¿O qué piensas? Como ejemplo he creado tres versiones de una clase sumador:C#: ¿Devolviendo 'esto' para el método de anidar?
// Regular
class Adder
{
public Adder() { Number = 0; }
public int Number { get; private set; }
public void Add(int i) { Number += i; }
public void Remove(int i) { Number -= i; }
}
// Returning this
class Adder
{
public Adder() { Number = 0; }
public int Number { get; private set; }
public Adder Add(int i) { Number += i; return this; }
public Adder Remove(int i) { Number -= i; return this; }
}
// Returning new
class Adder
{
public Adder() : this(0) { }
private Adder(int i) { Number = i; }
public int Number { get; private set; }
public Adder Add(int i) { return new Adder(Number + i); }
public Adder Remove(int i) { return new Adder(Number - i); }
}
La primera de ellas se puede utilizar de esta manera:
var a = new Adder();
a.Add(4);
a.Remove(1);
a.Add(7);
a.Remove(3);
Los otros dos se puede utilizar de esta manera:
var a = new Adder()
.Add(4)
.Remove(1)
.Add(7)
.Remove(3);
Donde la única diferencia es que a
en el primer caso es el new Adder()
mientras que en el último es el resultado del último método.
Lo primero que encuentro es que rápidamente se vuelve ... molesto para escribir una y otra vez. Entonces me gustaría usar una de las otras versiones.
El tercero funciona como muchos otros métodos, como muchos métodos String y métodos de extensión IEnumerable. Supongo que tiene su lado positivo porque puedes hacer cosas como var a = new Adder(); var b = a.Add(5);
y luego tener una que era 0 y una que era 5. Pero al mismo tiempo, ¿no es un poco caro crear nuevos objetos todo el tiempo? ¿Y cuándo morirá el primer objeto? Cuando el primer método devuelve un tipo de? ¿O?
De todos modos, me gusta el que devuelve this
y creo que usaré eso, pero tengo mucha curiosidad por saber qué piensan los demás acerca de este caso. Y lo que se considera la mejor práctica.
Eres de tercera clase y no haces lo que dijiste que hace. Agregaría o restaría de Number y lo pasaría a un nuevo Adder (...) como un entero por separado. – Samuel
¡oh, buena captura! thanks =) – Svish