修改Circle类的Radius属性后如何同步更新Circumference属性
问题原因
当前Circumference属性仅在Circle类构造时计算一次,后续修改Radius属性时没有触发周长的重新计算逻辑,因此会出现后续两条断言失败的问题。同时你的代码没有对Radius的负值输入做全局校验,仅在构造函数中处理了负值场景,直接给Radius赋负数时会直接存储负数,也不符合你的测试预期。
解决方案
推荐两种实现方式,你可以按需选择:
方案1:使用计算属性实现(推荐,实现最简单,适合当前轻量计算场景)
将Circumference改为动态计算的只读属性,每次读取时基于当前Radius实时计算结果,同时给Radius属性增加负值校验逻辑,修改后的完整Circle类代码如下:
public class Circle { public double X { get; set; } public double Y { get; set; } // 给Radius增加负值校验,设值小于0时自动存0 private double _radius; public double Radius { get => _radius; set => _radius = value < 0 ? 0 : value; } // 动态计算周长,每次读取时基于最新Radius计算结果 public double Circumference => _radius * 2 * Math.PI; public Circle(double x, double y, double radius) { X = x; Y = y; Radius = radius; // 直接赋值即可,setter会自动处理负值 } }
方案2:修改Radius时同步更新周长存储值(适合计算逻辑复杂、读取频率远高于修改频率的场景)
用后台字段存储周长值,每次修改Radius时同步重新计算并更新周长字段:
public class Circle { public double X { get; set; } public double Y { get; set; } private double _radius; private double _circumference; public double Radius { get => _radius; set { _radius = value < 0 ? 0 : value; // Radius修改时同步更新周长 _circumference = _radius * 2 * Math.PI; } } public double Circumference => _circumference; public Circle(double x, double y, double radius) { X = x; Y = y; Radius = radius; } }
两种方案都可以让你的三条单元测试断言全部通过。
内容的提问来源于stack exchange,提问作者jonasPamm
相关产品推荐
相关产品推荐

