我有一个简单的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
创建的
所以对于CSV
:5,Orange,7
,pruductId
将是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}}方法吗?
答案 0 :(得分:4)
首先,我将使用csvData
删除构造函数。为什么产品必须知道它来自哪里?它可以是CSV,数据库,XML等。将它作为Product
类中的字段是没有意义的。
然后使用单一方法创建ProductFactory
(或ProductParser
),用CSV创建Product
,如果有任何错误,则应抛出异常。当ProductFactory
返回产品时,它应该处于有效状态。
答案 1 :(得分:1)
创建两级验证选项:
使ValidateCSV方法保持静态,以便创建新产品(例如UI)的任何内容都可以在尝试创建产品之前调用该方法。
然后,分别在构造函数中调用验证,如果失败则抛出异常。
答案 2 :(得分:1)
分隔数据及其表示; CSV只是实际数据的{em>表示(以及为什么不应存储在中的原因){{1 }},ProductId
,Name
值:
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
}
}