0

这是多么糟糕的实践?我的教授目前要求我这样做,这与我被告知的一切背道而驰。谁能给我举个例子,为什么你不应该以这种方式验证?(在asp网页的get/set方法中使用正则表达式)

更多信息:

这是他希望我们做的代码: 在属性中:

public String FName
{
    get
    {
        return _fName;
    }
    set
    {
        if (validateName(value.ToString()))
            _fName = value;
    }
}

我调用的方法:

public static bool validateName(String name)
    {
        bool isGood = true;

        Regex regex = new Regex("^[A-Z]");
        if (!regex.IsMatch(name))
            isGood = false;

        return isGood;
    }
4

5 回答 5

1

In reply to your update, I'd find that really annoying, for example:

var a = new yourObject();
a.FirstName = 123;

What my code doesn't know is that I've failed validation so I haven't changed the first name property at all!

Edit:

Your can also simplify your validation method:

public static bool validateName(String name)
{
    Regex regex = new Regex("^[A-Z]");
    return regex.IsMatch(name)
}
于 2012-10-23T19:12:10.060 回答
1

一般来说,它并不好,正如验证一样,也假定失败

所以问题是:

  • 您打算如何处理constructor代码执行期间的故障。?

  • 如果你得到一个例外constructor怎么办?之后对象的状态是什么?

这就是为什么一般来说这是一个不好的做法。遵循的好方法是:

  1. 构造对象
  2. 运行验证

但这些是指南,您可以根据自己的方便自由地制动它们。所以为了捍卫你的教授,应该说,他问这个:

  1. 或者带给你一些想法
  2. 或者教你一些东西

因此,请按照他的方式尝试理解他为什么要求以这种方式编写代码。

于 2012-10-23T18:55:43.300 回答
1

I agree with your instructor.

In general, you should validate a value in any place it is possible to set it prior to "accepting" it. The general rule is that whatever method that attempts to set the value should receive immediate feedback when it attempts to set it.

For your example, I would place the validator inside of the setter of your FName public property, and if your constructor also accepts a FName value, then simply call the FName setter within your constructor to fully encapsulate the behavior of the property, be it validation behavior or any other business rules that the property implements:

public class User
{
    public User(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            if (!IsValid(value))
                // throw / handle appropriately
            else
                _firstName = value;
        }
    }
}

Also: stay away from abbreviations! Do not use FName; use FirstName.

于 2012-10-24T00:08:56.743 回答
1

这取决于验证的含义,保护子句在构造函数中是很常见的做法,例如

if(param1 == null) 
     throw new ArgumentNullException("param1");

它有助于确保您的对象处于一致的状态以供以后使用(防止您在使用时进行检查)。

您还可以在属性(您的情况似乎是什么)和方法上使用保护子句,以确保您的对象始终处于一致状态。

于 2012-10-23T19:04:52.950 回答
0

构造函数的目的是将值分配给类型的成员。按照惯例,验证不是构造函数的责任。
任何信息的验证都取决于您正在构建的应用程序的业务。如果您正在创建一个模块化应用程序,其中每个组件都用于特定目的,那么最好创建一个单独的类或一组类(取决于应用程序的大小)来执行所有业务验证。必须根据对数据施加的验证规则来调用此类验证。

于 2012-10-23T18:59:37.453 回答