2

假设我有一个文本框或任何其他形式的输入要求社会安全号码。我确实想指出,SSN 是我现在想到的一个纯粹的例子。此输入最初自然会存储为字符串。

string s = Console.ReadLine();

假设我想要一个验证 SSN 的方法,它可以在我的代码中的所有地方使用。哎呀,我什至可以在尚未由用户输入确定的变量上调用该方法。

这可以接受吗?

public bool IsValidSSN(Object SSN)
{
int mySSN;
    if(Int.Parse(SSN == false)
    {
    mySSN = Convert.toInt32(SSN);
    }
...
}

或者你会坚持我要求一个特定的数据类型,例如

public bool IsValidSSN(int SSN)
{
...
}

因此,我需要在调用方法之前将输入转换为正确的数据类型。

顺便说一句:我不是在问如何做一个正确的 IsValidSSN 代码 :) 我只是想举例说明我所说的意思:我可以接受 Object 数据类型作为参数还是应该尽量避免它?

4

6 回答 6

7

如果您必须接受一个对象,我至少会重载采用强类型参数的方法。然后让对象变体输入这些方法。

public bool IsValidSSN(object ssn) {
  ...
  IsValidSSN(Convert.ToInt32(ssn));
  ...
}

public bool IsValidSSN(int ssn) {
  ...
}
于 2009-06-08T22:37:17.430 回答
2

它完全取决于您的设计以及您希望在哪里进行验证。它实际上从根本上取决于您的整体架构和您的类层次结构。无论哪种方式都没有错。只要确保它是适合您的建筑设计的方式。

于 2009-06-08T22:38:53.777 回答
1

在这种情况下,我认为接受对象没有任何价值。仔细考虑您希望该功能如何工作。(显然你没有,因为你发布的代码不起作用)。我认为您正在计划这样的事情:

if (SSN is string)
    SSN = Convert.toInt32(SSN);
else if (SSN is TextBox)
    SSN = Convert.toInt32(SSN.Value);
else /* etc */

这比:

 bool isValidSSN(int SSN) { /* real valuation code */ }
 bool IsValidSSN(String SSN)  { return isValidSSN(Convert.toInt32(SSN)); }
 bool IsValidSSN(TextBox SSN)  { return isValidSSN(Convert.toInt32(SSN.Value)); }

重载的方法更简单、更快,因为它们更多地决定了从运行时到编译时要做什么。

于 2009-06-08T22:45:35.590 回答
0

在您上面的示例中,创建一个类型化的 IsValidSSN 要容易得多。一般来说,我发现打字可以减少错误和灵活性。

在灵活性至关重要的情况下,使用 Object 可能是最佳选择,但预计会在日志中遇到一些强制转换冲突异常。

对于所有其他情况,请严格输入,或用 python 编写。

于 2009-06-08T22:41:28.593 回答
0

就个人而言,我会开设一个 SSN 课程,并能够询问该 SSN 是否有效。在业务逻辑中拥有代表主体的类很重要。例如,这在很大程度上是您可能对需要更多验证的事情(例如信用卡类)执行的操作。如果您可以避免将对象交给对象并不是最好的,并且将业务逻辑中的主体作为原语处理也是不好的(您的架构使 SSN1 + SSN2 = SSN3 完全有效,即使在业务逻辑中,这是无稽之谈)。

于 2009-06-08T22:44:18.087 回答
0

在这种情况下,我会说这是不可接受的。如果输入有破折号或其他分隔字符(例如:###-##-####)怎么办?您显然无法将值解析为整数,但该值仍然有效。如何使用正则表达式来确保该值是您想要的。

就使用“对象”类型作为参数而言,这在许多情况下是完全有效的。事实上,它在整个 .NET Framework 中都使用过(查看事件委托):

public void Control_MouseOver(object sender, MouseEventArgs e){}

这将是一个简单的装箱/拆箱案例,在 .NET 2.0 之前,这实际上是对变量执行“通用”操作的唯一方法。

你也可以使用泛型来解决这个问题,而不需要强制转换。如果您创建一个实现类似 INumeric (我不知道这是否是实际接口)或 IComparable 的接口,您应该能够以更优雅的方式执行操作:

公共布尔 IsValidSNN(INumeric SSN){}

于 2009-06-08T22:48:17.407 回答