У меня есть класс, который я должен вызывать один или два метода много раз друг за другом. Методы в настоящее время возвращают void
. Я думал, было бы лучше, чтобы он возвращал this
, чтобы методы могли быть вложенными? или это считается очень, очень, очень плохо? или, если плохо, было бы лучше, если бы он возвратил новый объект того же типа? Или что вы думаете? В качестве примера я создал три версии класса сумматора:
// 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); }
}
Первый может использоваться следующим образом:
var a = new Adder();
a.Add(4);
a.Remove(1);
a.Add(7);
a.Remove(3);
Два других можно использовать следующим образом:
var a = new Adder()
.Add(4)
.Remove(1)
.Add(7)
.Remove(3);
Если единственное отличие состоит в том, что a
в первом случае - это new Adder()
, а во втором - результат последнего метода.
Первое, что я нахожу, это быстро становится ... раздражающим, чтобы писать снова и снова. Поэтому я хотел бы использовать одну из других версий.
Третий работает, как и многие другие методы, например, многие методы String и методы расширения IEnumerable. Я предполагаю, что это имеет свою положительную сторону в том, что вы можете делать такие вещи, как var a = new Adder(); var b = a.Add(5);
, а затем иметь одну, равную 0, и одну, равную 5. Но в то же время не слишком дорого ли создавать новые объекты постоянно ? И когда умрет первый объект? Когда первый метод возвращает вид? Или
В любом случае, мне нравится тот, который возвращает this
, и я думаю, что буду его использовать, но мне очень любопытно узнать, что другие думают об этом случае. И что считается лучшей практикой.