2010-01-25 25 views
1

是否存在与冗余集合检查这里有一个问题?:我应该重复测试参数(例如收集空虚)吗?

SomeMethod() 
{ 
    shapes = GetShapes(); 
    //maybe Assert(shapes.Any())? 
    if(shapes.Any()) 
    { 
     ToggleVisibility(shapes); 
    } 
} 

ToggleVisibility(IEnumerable<Shape> shapes) 
{ 
    //maybe Assert(shapes.Any())? 
    if(shapes.Any()) 
    { 
     //do stuff 
    } 
} 

回答

1

我不认为这里有一个大问题,因为调用Any()不是一个昂贵的操作。

有一个小问题,ToggleVisibility的责任和行为没有被声明。 ToggleVisibility应让呼叫者知道如果形状为空或为空,它将如何表现。最好的方法是通过XML注释,以便它在Intellisense中显示。这会让ToggleVisibility调用者决定他们是否需要检查集合是否为空或为空。

0

如果您要添加的测试和调试,当然,这是很有意义的断言。

在这些情况下,你想知道什么时候事情不像你期望他们总是去的那样。

但是,在生产中,您可能不希望通过调用形状集合中不存在的成员来调用整个应用程序。

0

您可以使用Code Contract库。在这种情况下,您可以在代码中动态配置前置条件(验证传入值),后置条件(验证结果)和不变量(对于特定类必须始终为true的条件)。

0

我认为这里的关键是知道责任。如果你知道每一个地方都会调用ToggleVisibility并且打算总是先检查一下,那么就不用检查ToggleVisibility方法。

就我而言,我会在ToggleVisibility中检查它,因为它使得调用者代码更加清晰,并且如果从50个不同的地方调用ToggleVisibility函数,那么代码就会少得多。

0

我会建议答案是......照常......“取决于”。虽然在IEnumerable上调用Any并不昂贵,但是真的有必要吗?这取决于你计划在你的方法中使用你的收藏。

由于空集合,您的方法是否会引发异常或其他不合需要的异常?你是否用foreach迭代你的集合?如果是这样,那么拥有一个空集合并不一定会造成任何伤害,尽管这可能违反了您的业务规则。试图迭代一个null集合显然是不同的。

您使用GetShapes()作为答案的示例框架。为了扩大我的想法,ToggleVisibility()在空集合上真的是非法的吗?它显然不会做太多,但如果用户突出显示一组空的形状,然后单击切换可见性功能,它会做什么坏事?

0

如果ToggleVisibility(IEnumerable<Shape>)是一个私有方法(因此SomeMethod()必须在同一个库中),那么我肯定会在发布版本中只包含一次检查。支票是以一种方式还是以另一种方式取决于所发生事情的意义。如果集合在正确的执行过程中永远不会是空的,那么可能不需要检查。如果ToggleVisibility(IEnumerable<Shape>)被从十个不同的地方调用,并且它们中的任何一个都可能有一个空集合,那么我肯定会减轻调用者每次执行检查的负担,并且将其坚持在方法本身内部。

如果ToggleVisibility(IEnumerable<Shape>)是公共API的一部分,那么它肯定应该做任何必要的参数验证,因为API的用户可能会做任何事情,并且必须始终检查所有参数。如果该方法的文档指出空集合将被忽略,那么显然,SomeMethod()不需要担心它。否则,SomeMethod()需要做任何事情来验证它传递的集合是否有效,即使这意味着进行了冗余检查。

相关问题