假设我有一个包含以下三个属性的类。

public class Travel
{
  public int MinAirportArrival { get; set; }
  public int MinFlightTime { get; set; }
  public int TotalTravelTime { get; set; }
}


TotalTravelTime必须至少为MinAirportArrival和MinFlightTime的总和,但如果中途停留或类似情况也可能更大。

对我来说很明显,我可以将逻辑放在TotalTravelTime的设置器中。

我的问题是关于MinFlightTime和MinAirportArrival的更改。期望首先增加TotalTravelTime是正确的吗?如果其中一个会使总和大于TotalTravelTime,则不引发异常?

我还有其他选择以合理的方式控制它吗?

我是否应该将其留给负责保存状态以检查类中有效属性的对象?我可能还有其他逻辑。

编辑
如果有多余的时间,我不会在任何地方存储任何数量的东西,因此这不仅仅是添加一些属性的问题。只是为了澄清此类,只是我所面临问题的一​​个人为例子,但我认为它与问题非常吻合。

最佳答案

框架设计指南建议属性不应相互依赖。
总是应该可以以任意顺序设置多个属性的值。

以下是所看到的选项:


在这种情况下:

public class Travel
{
  public int MinAirportArrival { get; set; }
  public int MinFlightTime { get; set; }
  public int AdditionalTravelTime { get; set; }
  public int TotalTravelTime
  {
    get { return MinAirportArrival + MinFlightTime + AdditionalTravelTime; }
  }
}


这利用了以下效果:可以从其他三个值中重构TotalTravelTime,而这三个值可以分别设置而无需依赖。
通常情况下的解决方案是接受任何值并在例如将实例发送到存储时验证值。

public class Travel
{
  public int MinAirportArrival { get; set; }
  public int MinFlightTime { get; set; }
  public int TravelTime { get; set; }
  public void Save()
  {
    // validate TravelTime > MinAirportArrival + MinFlightTime
  }
}

另一种选择是使属性为只读,并提供一种批量更新属性值的方法。

public class Travel
{
  public int MinAirportArrival { get; private set; }
  public int MinFlightTime { get; private set; }
  public int TravelTime { get; private set; }
  public void UpdateTimes(
    int minAirportArrival, int minFlightTime, int travelTime)
  {
    // validate travelTime > minAirportArrival + minFlightTime
    MinAirportArrival = minAirportArrival;
    MinFlightTime = minFlightTime;
    TravelTime = travelTime;
  }
}

另外,您可以使Travel对象不可变,并使用构造函数,工厂方法或可变的生成器对象创建实例。

构造函数:

public class Travel
{
  public Travel(int minAirportArrival, int minFlightTime, int travelTime)
  {
    // validate travelTime > minAirportArrival + minFlightTime
  }
  public int MinAirportArrival { get; }
  public int MinFlightTime { get; }
  public int TravelTime { get; }
}


工厂方法:

public class Travel
{
  public static Travel CreateTravel(
    int minAirportArrival, int minFlightTime, int travelTime)
  {
    // validate travelTime > minAirportArrival + minFlightTime
    return new Travel(minAirportArrival, minFlightTime, travelTime);
  }
  private Travel(int minAirportArrival, int minFlightTime, int travelTime);
  public int MinAirportArrival { get; }
  public int MinFlightTime { get; }
  public int TravelTime { get; }
}


建造者类别:

public class TravelBuilder
{
  public int MinAirportArrival { get; set; }
  public int MinFlightTime { get; set; }
  public int TravelTime { get; set; }
  public Travel BuildTravel()
  {
    // validate TravelTime > MinAirportArrival + MinFlightTime
    return new Travel(MinAirportArrival, MinFlightTime, TravelTime);
  }
}


在.NET框架中可以找到所有这三个选项的示例。

10-02 16:08
查看更多