Рассмотрим следующий класс
public class Class1
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult()
{
return A + B;
}
}
Чтобы использовать GetComplexResult
, потребитель этого класса должен знать, что нужно установить A
и B
перед вызовом метода. Если GetComplexResult
обращается ко многим свойствам для вычисления его результата, это может привести к неправильным возвращаемым значениям, если потребитель сначала не установит все соответствующие свойства. Таким образом, вы могли бы написать этот класс, как это вместо этого
public class Class2
{
public int A { get; set; }
public int B { get; set; }
public int GetComplexResult(int a, int b)
{
return a + b;
}
}
Таким образом, вызывающий абонент на GetComplexResult
вынужден передать все необходимые значения, гарантируя, что ожидаемое возвращаемое значение будет правильно рассчитано. Но если есть много обязательных значений, список параметров также увеличивается, и это тоже не похоже на хороший дизайн. Также кажется, что это нарушает точку инкапсуляции A
, B
и GetComplexResult
в одном классе. Я даже мог бы испытать желание сделать GetComplexResult
статическим, так как для его работы не требуется экземпляр класса. Я не хочу делать кучу статических методов.
Существуют ли термины для описания этих двух разных способов создания классов? Похоже, у них обоих есть свои плюсы и минусы - что-то, чего я не понимаю, должно сказать мне, что один путь лучше другого? Как юнит-тестирование влияет на этот выбор?