1

假设你有一张班级照片:

class Photo
{
  public string Title {get; set;}
  public string FileExtension {get; set;}
  public void Save() 
  { 
    // Save to backing store here 
  }
}

这将是检查值是否设置正确的最佳位置。在属性设置器或 Save 方法中。

编辑:如果它是一个更新方法怎么办?如果照片是通过 PhotoManager 添加的,使用像 PhotoManager.Add(Photo p) 这样的方法,那么这是进行验证的最佳位置。

亲切的问候,

4

6 回答 6

2

如果这些是唯一的选项,那么在属性设置器中。关注点分离表明Save应该进行保存,而不是其他任何事情。

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

于 2009-03-02T12:25:41.430 回答
2

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

于 2009-03-02T12:27:15.840 回答
1

这取决于,你什么时候有足够的数据来检查正确性:如果 FileExtension 的正确性不依赖于 Title 的值,并且 Title 的正确性不依赖于 FileExtension 的值,你可以检查它们里面的每一个二传手。

但是如果其中一个依赖于另一个的值,并且您不知道 setter 的执行顺序是什么,则只有在同时获得 Title 和 FileExtension 时才需要检查它们。这可以在 Save 中,或者在一些新的 Check 方法中。

此外,也许在保存之前,您必须检查是否设置了 Title 和 FileExtenstion。

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

  • 检查 Title 的正确性:在 Title.set
  • 检查 FileExtension 的正确性:在 FileExtension.set
  • 检查 Title.set 和 FileExtension.set 是否已执行:在 Save
  • 在 Save

关于更新方法:我知道您收到了一个已经设置了 Title 和 FileExtenstion 的 Photo 对象。在这种情况下,您必须决定是否相信 Title 和 FileExtension 已经由设置它们的人在照片中进行了检查。如果您信任它,您不必更改我上面的建议中的任何内容。但是,如果您不信任,那么您还必须在 Save 中检查 Title 的正确性和 FileExtension 的正确性(或者,再次,在一些新的 Check 方法中)。

于 2009-03-02T12:57:13.427 回答
0

这么少的细节很难说。如果您认为对象在更新时处于无效状态是有效的,那么我会说您必须在 Save 方法中进行验证。

于 2009-03-02T12:26:21.990 回答
0

如果我正确理解了您的问题,您可以简单地使用private boolean Validate(title, fileExtension)从设置器和存储方法中调用的方法来完成。如果这个验证是假的,你可以抛出一个Exception并从那里处理它。

于 2009-03-02T12:26:22.923 回答
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;
}
于 2009-03-02T12:29:55.833 回答