Ho una classe che devo chiamare uno o due metodi molte volte uno dopo l'altro. I metodi attualmente restituiscono void
. Stavo pensando, sarebbe meglio averlo restituito this
, in modo che i metodi possano essere annidati? o è considerato molto molto pessimo? o se cattivo, sarebbe meglio se restituisse un nuovo oggetto dello stesso tipo? O cosa ne pensi? Per fare un esempio ho creato tre versioni di una classe di vipera:C#: restituisce "questo" per l'annidamento del metodo?
// 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); }
}
Il primo può essere utilizzato in questo modo:
var a = new Adder();
a.Add(4);
a.Remove(1);
a.Add(7);
a.Remove(3);
Gli altri due possono essere utilizzati in questo modo:
var a = new Adder()
.Add(4)
.Remove(1)
.Add(7)
.Remove(3);
Dove l'unica differenza è che a
nel primo caso è il new Adder()
mentre nel secondo è il risultato dell'ultimo metodo.
Il primo che trovo rapidamente diventa ... fastidioso per scrivere più e più volte. Quindi mi piacerebbe usare una delle altre versioni.
Il terzo funziona in modo simile a molti altri metodi, come molti metodi String e metodi di estensione IEnumerable. Immagino che abbia il suo lato positivo in quanto puoi fare cose come var a = new Adder(); var b = a.Add(5);
e poi averne uno che era 0 e uno che era 5. Ma allo stesso tempo, non è un po 'costoso creare nuovi oggetti tutto il tempo? E quando morirà il primo oggetto? Quando il primo metodo restituisce un po '? O?
In ogni modo, mi piace quello che restituisce this
e pensare userò quello, ma io sono molto curioso di sapere cosa gli altri pensano di questo caso. E ciò che è considerato la migliore pratica.
Sei di terza classe non fa quello che hai detto che fa. Dovresti aggiungere o sottrarre da Numero e trasferirlo nel nuovo Adder (...) come numero intero separato. – Samuel
oh, buona cattura! grazie =) – Svish