Примените изменения к свойству после изменения другого свойства

#c# #unit-testing

Вопрос:

У меня есть модульные тесты для моей программы, и я должен сделать их все успешными

Это один из моих модульных тестов

 double x = 5;  double y = 10;  double radius = 20;  Circle target = new Circle(x, y, radius);  Assert.AreEqual(40 * Math.PI, target.Circumference, 0.01, "Circumference is false");  target.Radius = 0;  Assert.AreEqual(0, target.Circumference, 0.01, "Circumference is at a radius of 0 0");  target.Radius = -10;  Assert.AreEqual(0, target.Circumference, 0.01, "Circumference is at a negativ radius null");  

Первый тест прошел успешно, но следующий-нет. Моя проблема в том, как мне изменить окружность, когда меняется только радиус?

Вот мой круг занятий

 public class Circle {  public double X { get; set; }  public double Y { get; set; }  public double Radius { get; set; }  public double Circumference{ get;}   public Circle(double x, double y, double radius)  {  X = x;  Y = y;  if (radius lt; 0)  {  Radius = 0;  Circumference = 0;  }  else  {  Radius = radius;  Circumference = radius * 2 * Math.PI;  }  }   //...  }  

Комментарии:

1. Напишите код, Circle чтобы пересчитать окружность, когда изменяется одно из базовых значений.

2. Если класс не должен был быть неизменяемым, то ваш конструктор делает слишком много. Поэтому либо сделайте элементы только для чтения, либо переместите логику вычисления в вычисляемые элементы.

Ответ №1:

Гораздо лучше перенести всю логику и проверку из конструктора в свойства.

Таким образом, ваш код не будет нарушен, если кто-то назначит или изменит Radius его напрямую.

Попробуй это

 public class Circle {    private double _radius;  public double X { get; set; }  public double Y { get; set; }  public double Radius  {  get {return _radius;}   set  {  if (value lt;= 0) _radius = 0;  else _radius=value;  }  }  public double Circumference   {   get { return _radius * 2 * Math.PI };   }    public Circle(double x, double y, double radius)  {  X = x;  Y = y;  Radius = radius;  } }