在设置端口号的应用中,我想将可分配给端口号的值限制在49152和65535(含)之间。
我编写了一些测试方法,测试超出此范围的任何内容都会导致测试失败。它们确实失败了(正如预期的那样,因为代码还没有考虑到这一点)。
所以我的问题是:将强制无效值的代码放到有效值的最佳位置是什么 - 这里:
public int Port
{
get
{
return port;
}
set
{
port = value;
}
}
如:
public int Port
{
get
{
return port;
}
set
{
if ((value < 49152) || (value > 65535))
{
value = 55555;
}
port = value;
}
}
......或其他地方?
答案 0 :(得分:15)
将强制无效值的代码置于有效值的最佳位置是什么?
最好的地方是无处。强制将无效值强制为随机有效值是隐藏调用者中的错误。调用者可以提前知道他们尝试设置的值是否有效,因此如果他们做错了就会崩溃。抛出异常,不要忽略错误并猜测它们的含义。
答案 1 :(得分:12)
你可以在你的setter中放置验证逻辑,但是如果验证失败,你应该让别人知道。
即:
private static int minimumPortNumber = 49152;
private static int maximumPortNumber = 65535;
public int Port
{
get
{
return port;
}
set
{
if ((value < minimumPortNumber) || (value > maximumPortNumber))
{
throw new ArgumentOutOfRangeException("port", string.Format("The port number is out of range. It must be between {0} and {1}", minimumPortNumber, maximumPortNumber));
}
port = value;
}
}
答案 2 :(得分:2)
这是围绕字段使用包装器方法而不是直接暴露它们的最大好处之一。所以我肯定会说,是的。