假设你有一个班级照片:
class Photo
{
public string Title {get; set;}
public string FileExtension {get; set;}
public void Save()
{
// Save to backing store here
}
}
哪个是检查值是否设置正确的最佳位置。在property setter或Save方法中。
编辑:如果是Update方法怎么办?如果使用PhotoManager.Add(照片p)等方法通过PhotoManager添加照片,那么这是进行验证的最佳位置。
亲切的问候,
答案 0 :(得分:2)
如果这些是唯一选项,那么在属性设置器中。 Separation of concerns要求Save
应该保存,而不是其他任何内容。
此外,这就是物业之美。它们看起来像字段,但它们可以在后备字段中获取和设置值后具有增强的逻辑。
答案 1 :(得分:2)
不要让你的实例陷入无效状态:在setter中验证,这就是它的用途。
答案 2 :(得分:1)
这取决于您何时有足够的数据来检查正确性:如果FileExtension的正确性不依赖于Title的值,并且Title的正确性不依赖于FileExtension的值,则可以检查每个他们在二传手中。
但如果其中一个取决于另一个的值,并且您不知道执行者的执行顺序是什么,则只有在同时获取它们时才必须检查Title和FileExtension。这可以是保存,也可以是一些新的Check方法。
另外,也许在做Save之前你必须检查是否设置了Title和FileExtenstion。
因此,总而言之,您可能需要进行以下检查:
关于更新方法:我知道您收到一个已设置Title和FileExtenstion的Photo对象。在这种情况下,您必须决定是否相信Title和FileExtension已经在Photo中检查了谁设置了它们。如果您信任它,则无需更改上述提案中的任何内容。但是如果你不信任,那么你还必须在Save中检查Title的正确性和FileExtension的正确性(或者再次,在一些新的Check方法中)。
答案 3 :(得分:0)
用如此细微的细节很难说。如果您认为对象在更新时处于无效状态是有效的,那么我会说您必须在Save方法中进行验证。
答案 4 :(得分:0)
如果我正确理解了你的问题,你可以简单地使用在settor和存储方法中调用的private boolean Validate(title, fileExtension)
方法。如果此验证为false,则可以抛出Exception
并从那里处理它。
答案 5 :(得分:0)
public void Save()
{
try
{
// saving
}
catch(Exception ex)
{
MessageBox(ex.Message); // roughly
}
}
或
public void Save()
{
if(!IsDataValid) // !(String.IsNullOrEmpty(this.Title) && String.IsNullOrEmpty(this.Extension))
{
throw new Exception(); //in fact you need to throw something more concrete
}
// saving
}
我也可以使用:
public string Title { get; private set; }
public string Extension { get; private set; }
public Photo(string title, string extension)
{
this.Title = title;
this.Extension = extension;
}