gpt4 book ai didi

C# 如何向类的用户指示属性之间的关系?

转载 作者:行者123 更新时间:2023-11-30 20:35:47 26 4
gpt4 key购买 nike

我有一个看起来像这样的类:

public class House
{
public string Address {get; set;}

private int _numberOfBedrooms;
public int NumberOfBedrooms
{
get { return _numberOfBedrooms; }
set
{
_numberOfBedrooms = value;
_groundPlanIsObsolete |= true;
}
}

private int _numberOfBathrooms;
public int NumberOfBathrooms
{
get { return _numberOfBathrooms; }
set
{
_numberOfBathrooms = value;
_groundPlanIsObsolete |= true;
}
}

private bool _groundPlanIsObsolete;
private myFloorPlan _groundPlan;
public myFloorPlan GroundPlan
{ get
{
if(_groundPlanIsObsolete)
_groundPlan = new myFloorPlan(NumberOfBedrooms, NumberOfBathrooms);

_groundPlanIsObsolete &= false;

return _groundPlan;
}
}
}

new myFloorPlan(NumberOfBedrooms, NumberOfBathrooms) 是一个非常冗长的函数。我想尽可能少地调用它。

这是糟糕的设计吗?

我不喜欢我目前的设计,因为从用户的角度来看,不清楚哪些属性会对 GroundPlan 产生影响。这有两个缺点:

  1. 如果其中一个未设置,并且用户尝试获取 GroundPlan 我可以抛出异常,但是有没有一种“更好”的方式让他在做之前知道错误?

  2. 我想鼓励用户在调用 GroundPlan 之前确定房间的数量,以防止频繁的计算量大的更新。

我应该指出这一点吗?

或者这是否应该记录在属性的评论部分?

和:

我该如何指出这一点?

最佳答案

使 House 不可变并使用适当的封装。

您可以在 C# 中轻松地结合不变性和流畅的语法来构建您的对象:

House house = new House();

house = house.AddBedrooms(2);

House 的代码:

class House
{
int _numberOfBedrooms;

public House()
{
}

public House AddBedrooms(int numberOfBedroomsToAdd)
{
House house = new House();

house._numberOfBedrooms = _numberOfBedrooms + numberOfBedroomsToAdd;

return house;
}

//etc...
}

它的工作有点多,但它提供了适当的封装。将 getters/setters 放在域对象上是令人讨厌的。还有更高级的模式将对象的构建拆分为一个构建器,但原理是相同的。然后,您可以在构建器上使用流畅的语法。

关于C# 如何向类的用户指示属性之间的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37588652/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com