当前位置:  开发笔记 > 程序员 > 正文

是否存在参数验证可能被视为冗余的情况?

如何解决《是否存在参数验证可能被视为冗余的情况?》经验,为你挑选了1个好方法。

我在公共方法中做的第一件事就是在它们有机会被使用,传递或引用之前验证每个参数,然后在它们中的任何一个违反合同时抛出异常.我发现这是一个非常好的练习,因为它可以让你在犯规被提交的那一刻抓住犯罪者然后,我常常写一个非常简单的getter/indexer,例如:

private List m_items = ...;

public Item GetItemByIdx( int idx )
{
    if( (idx < 0) || (idx >= m_items.Count) )
    {
        throw new ArgumentOutOfRangeException( "idx", "Invalid index" );
    }

    return m_items[ idx ];
}

在这种情况下,index参数直接与列表中的索引相关,而且我知道事实(例如文档)列表本身将完全相同并将抛出相同的异常.我应该删除此验证还是最好不要理会?

我想知道你们的想法,因为我现在正在重构一个大项目,我发现了很多像上面这样的案例.

提前致谢.



1> Henk Holterm..:

考虑,这不仅仅是品味问题

if (!File.Exists(fileName)) throw new ArgumentException("...");            
var s = File.OpenText(fileName);

这看起来与您的示例类似,但有几个原因(并发,访问权限)OpenText(),即使FileNotFound错误,该方法仍然可能失败的原因.因此,Exists-check只是给人一种安全和控制的虚假感觉.

这是一个思维定型的东西,当你编写GetItemByIdx方法时,它可能看起来很明智.但是如果你随机查看一段代码,通常会有很多假设你可以在继续之前检查.一遍又一遍地检查它们是不切实际的.我们必须有选择性.

因此,在像GetItemByIdx这样的简单传递方法中,我会反对冗余检查.但是,只要该函数添加了更多功能,或者如果有一个非常明确的规范说明了有关idx的内容,那么参数就会转变.

根据经验,当明确定义的条件被破坏并且该条件与当前级别相关时,应该抛出异常.如果条件属于较低级别,则让该级别处理它.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有