检查房产价值的最佳地点

时间:2009-03-02 12:22:27

标签: oop class-design

假设你有一个班级照片:

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添加照片,那么这是进行验证的最佳位置。

亲切的问候,

6 个答案:

答案 0 :(得分:2)

如果这些是唯一选项,那么在属性设置器中。 Separation of concerns要求Save应该保存,而不是其他任何内容。

此外,这就是物业之美。它们看起来像字段,但它们可以在后备字段中获取和设置值后具有增强的逻辑。

答案 1 :(得分:2)

不要让你的实例陷入无效状态:在setter中验证,这就是它的用途。

答案 2 :(得分:1)

这取决于您何时有足够的数据来检查正确性:如果FileExtension的正确性不依赖于Title的值,并且Title的正确性不依赖于FileExtension的值,则可以检查每个他们在二传手中。

但如果其中一个取决于另一个的值,并且您不知道执行者的执行顺序是什么,则只有在同时获取它们时才必须检查Title和FileExtension。这可以是保存,也可以是一些新的Check方法。

另外,也许在做Save之前你必须检查是否设置了Title和FileExtenstion。

因此,总而言之,您可能需要进行以下检查:

  • 检查标题的正确性:在Title.set
  • 检查FileExtension的正确性:在FileExtension.set
  • 检查Title.set和FileExtension.set是否已执行:保存
  • 检查Title和FileExtesion的“co-correcntess”:保存

关于更新方法:我知道您收到一个已设置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;
}