请考虑以下内容;我有一个带有X和Y变量的类。类的想法是改变点在X轴和Y轴上的位置。为此,我首先提出了三种方法:
代码为
public class ChangePosition
{
public int X_AxisPosition;
public int Y_AxisPosition;
public ChangePosition(int X_Axis,int Y_Axis)
{
this.X_AxisPosition = X_Axis;
this.Y_AxisPosition = Y_Axis;
}
public void ChangeXAxisPosition(int XValue)
{
X_AxisPosition = XValue;
}
public void ChangeYAxisPosition(int YValue)
{
Y_AxisPosition = YValue;
}
public void ChangeXAxis_YAxisValues(ChangePosition NewLocaltion)
{
if (NewLocaltion == null)
{
X_AxisPosition = default;
Y_AxisPosition = default;
throw new NullReferenceException("Invalid Inputs");
}
ChangeXAxisPosition(NewLocaltion.X_AxisPosition);
}
}
过了一会儿,我重新思考并说为什么我在上面有两个方法(仅适用于两个轴),我可以通过传递此类的对象并将最后一个不需要的Axis设置为零来获得最后一个方法,如以下块所示
public class ChangePosition
{
public int X_AxisPosition;
public int Y_AxisPosition;
public ChangePosition(int XValue, int YValue)
{
X_AxisPosition = XValue;
Y_AxisPosition = YValue;
}
public void ChangeXAxis_YAxisValues(ChangePosition NewLocaltion)
{
if (NewLocaltion == null)
{
throw new NullReferenceException("Invalid Inputs");
}
X_AxisPosition =(NewLocaltion.X_AxisPosition);
Y_AxisPosition =(NewLocaltion.Y_AxisPosition);
}
}
有人可以告诉我最佳实践吗,以前的代码块哪个更好?为什么?
答案 0 :(得分:2)
“位置”或“向量”等实体的最佳做法是使它们不可变-因为其 identity 仅取决于其状态。这意味着用相同的ChangePosition
和X_AxisPosition
初始化的两个Y_AxisPosition
对象是等于。因此,每当您要更改不可变实体的字段时,始终可以简单地替换整个对象。状态相同的两个点可能被视为代码中的不同实体,这可能会给您带来麻烦。
对于您而言,public void ChangeXAxis_YAxisValues(ChangePosition NewLocaltion)
毫无意义,因为只要您可以像这样使用它
someObject.Position.ChangeXAxis_YAxisValues(new ChangePosition(x, y));
你最好写
someObject.Position = new ChangePosition(x, y);
点/位置的常见做法是使用struct
,struct
实际上是可变的,但是其身份用其状态表示(struct
的字段值相同等于,但不是类)。如果不会显着降低性能,最好将其字段设置为readonly
。
因此,请保持简单:
public struct ChangePosition
{
public int X_AxisPosition;
public int Y_AxisPosition;
public ChangePosition(int X_Axis,int Y_Axis)
{
this.X_AxisPosition = X_Axis;
this.Y_AxisPosition = Y_Axis;
}
}
此外,通常您可能会发现对实现+
运算符有用。