验证对象初始化

时间:2014-10-20 07:50:45

标签: c# validation oop initialization

我有一个简单的object,如下所示:

public class Product
{
    private readonly string csvData;
    public Product(string _csvData)
    {
        csvData = _csvData;
    }

    public int ProductId { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }
}

这是使用从应用程序用户收到的CSV string创建的 所以对于CSV5,Orange,7pruductId将是5,Name将是橙色等...

我的问题是我需要在初始化CSV之前验证Product,如果出现错误,我需要知道它是什么(返回它?)。
这是我验证CSV的方法(此方法在Product类中找到):

    public string ValidateCSV()
    {
        string[] splitCsv = csvData.Split(',');

        if (splitCsv.Length != 3)
            return "Csv error";

        if (!splitCsv[0].IsNumeric())
            return "Id error";

        return string.Empty;
    }

我的问题是OO initialize Product InitError的首选方法(适当的GetProduct和安全方法)是什么? 我应该添加{{1}}属性并在初始化后检查它吗? 我应该创建一个{{1}}方法吗?

4 个答案:

答案 0 :(得分:4)

首先,我将使用csvData删除构造函数。为什么产品必须知道它来自哪里?它可以是CSV,数据库,XML等。将它作为Product类中的字段是没有意义的。

然后使用单一方法创建ProductFactory(或ProductParser),用CSV创建Product,如果有任何错误,则应抛出异常。当ProductFactory返回产品时,它应该处于有效状态。

答案 1 :(得分:1)

创建两级验证选项:

  1. 使ValidateCSV方法保持静态,以便创建新产品(例如UI)的任何内容都可以在尝试创建产品之前调用该方法。

  2. 然后,分别在构造函数中调用验证,如果失败则抛出异常。

答案 2 :(得分:1)

分隔数据及其表示; CSV只是实际数据的{em>表示(以及为什么不应存储在中的原因){{1 }},ProductIdName值:

Quantiry

答案 3 :(得分:0)

通常你会抛出异常:

public class Product
{
    private readonly string csvData;
    public Product(string _csvData)
    {
        csvData = _csvData;

        ValidateCSV()
    }

    public int ProductId { get; set; }
    public string Name { get; set; }
    public int Quantity { get; set; }

    public void ValidateCSV()
    {
        string[] splitCsv = csvData.Split(',');

        if (splitCsv.Length != 3)
            throw new ArgumentException("CVS should contain 3 values, only contained " + splitCsv.Length);

        if (!splitCsv[0].IsNumeric())
            throw new ArgumentException("The first item should be a number");

        //Possibly populate the class as well if it checks out
        ProductId = int.Parse(splitCsv[0]); // could be combined with the check with something like TryParse
        Name = splitCsv[1];
        Quantity = int.Parse(splitCsv[2]); // We didn't validate this one
    }
}