我有几个开发商谁不断把如果null检查

例如:

Run(Order order)
{
  if (order == null) return;
}

在他们的代码,因为他们认为,如果有人在传递的参数为空它们保护它们的类。我想告诉他们的缺陷在他们的逻辑,因为如果有人传入null在这种情况下,最有可能的问题与消费者的代码,而是这个类的抛出异常和故障的快速,它优雅地处理的不良行为消费者和保持隆隆程。

另一个建议是有先决条件或保护类快速失败和抛出异常。任何事情,但忽略了这一事实,消费者可能有一些其他的问题,我帮助掩盖它。

我如何得到乡亲赞赏的是,你的类不应该如此宽容。如果有人不处于良好的数据传递,应该告诉他们。

任何好的文章或建议,以帮助我得到过这个问题?

有帮助吗?

解决方案

如果你的类不能接受null参数,然后做的最好的事情是这样的:

if (arg == null)
    throw new ArgumentNullException();

这是远远优于得到一个NullPointerException更深向下堆栈。在最坏的情况下,你会在某个地方缓存是null而实际上不会引发异常,直到很久以后,看看你有多大的快乐调试问题的然后的。

和如其他人所说,有时合同说null是好的。在这种情况下,具有围绕所述代码的某些部分的保护子句是正确的 - 虽然甚至然后我会说,最佳的设计将是不任选空参数添加的过载

其他提示

这实际上取决于精确的情况。这是很少建议给予一般性的建议,如“不要把null检查你的代码”,你似乎可以说明。类应该定义什么是合法的,哪些合同是没有的。但是,如果合同清楚地表明,传入null是不能接受的,则一个异常确实是一个适当的响应。

至于其他人说,这是远远优于早期的失败比获得生产神秘的问题,因为当它被预期的功能并没有做任何事情。如果函数返回空值参数,如在你的例子)。

即使函数不返回,只是抛出一个NullReferenceException,这是eaiser解决一个bug,当你知道一个参数为空。如果一个函数抛出一个NullReferenceException,你根本不知道发生了什么null或者是谁的错。

我想添加ArgumentNullException需要一个参数的一个原因。

这是更好地写

if(myArg == null) throw new ArgumentNullException("myArg");

比抛出ArgumentNullException没有paramName

这样,如果你有从有五个参数的功能异常,你就会知道其中的参数引起的问题。如果你不能附加一个调试器,这一点尤为重要。 (例如,一个生产Web服务器或最终用户的计算机上)

如果你正在写的功能很多,这可能是一个很大的开销,特别是因为有一个为字符串没有智能感知。我写了一个代码段,以生成这些检查:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Check for null arguments</Title>
            <Shortcut>tna</Shortcut>
            <Description>Code snippet for throw new ArgumentNullException</Description>
            <Author>SLaks</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
                <SnippetType>SurroundsWith</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>Parameter</ID>
                    <ToolTip>Paremeter to check for null</ToolTip>
                    <Default>value</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[if ($Parameter$ == null) throw new ArgumentNullException("$Parameter$");
        $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

在.NET 4.0的代码合同将有望使这种行为更加一致。 该说说代码合同的任何文章,将有助于其在得到的想法,并在未来,这种语法将提供方法。

HTTP ://blogs.msdn.com/bclteam/archive/2008/11/11/introduction-to-code-contracts-melitta-andersen.aspx

我还没有通过它监视,但 eiffel.com具有2个演示(上的的主题幻灯片+音频)设计由合同。这些家伙发明的概念,因此,如果任何人都可以解释这是他们:-)

有时你不能告诉别人,为什么这样的做法是错误的 - 他们必须弄清楚自己。但你可以帮助他们想出导致一些讨厌失败,由于这个问题的一些单元测试那里,让他们调试错误。

如果该方法的合同规定,它的参数不能为空,然后做正确的事情是使其明确,通过使用断言,像这样的:

Debug.Assert( item != null, "Null items are not supported );

可执行文件时使用的调试配置内置这将快速失败,但是,当使用释放构建将呈现零性能下降。

这似乎是一个关于如何最好写代码的问题是可控的。这是我的新的信念,你必须承担你的代码中所有消费者的无知。我已经通过假设我或其他人深的知识会消耗我的代码得到自己陷入麻烦。我唯一会增加抛出异常创建自定义异常以及面包屑留在内部异常。我在给你的开发人员有机会跑下来的问题,尤其是如果它是由于数据的坚信。我花了我大部分时间寻找打破我的代码的数据,如果你能留下线索,您将节省数周一年。

那么首先,你是不正确毫不含糊。你正在拥抱一个非常严重的逻辑错误。您希望您的代码凭借代码假设一切周围发生的一切是正确的是正确的。仿佛正确性是某种神奇的仙尘,你只需要喷无处不在。

所有错误是或一旦被暴露似乎笨。但其检查像这样逗他们出来揭露自己。在此之前,错误是不可见的。而对于足够大且复杂的项目,你不知道谁将会发现错误或在何种条件下它们会被发现。该架构的弹性代码通常有类似这样的检查,所有的地方,并检查返回值其中必须包括误差值,每一个功能。所以,你最终编码“我不能这样做,因为子功能我靠不工作”的语义,实际上是妥善处理。这个最大的价值在于,你通常可以实现的变通或自我意识的调试仪器很容易。 为什么的你想要做这样的事情是因为最困难的错误通常依赖于这两个特性的正确调试。

从开发人员那里了解了一些教训。他们把支票一样,在那里,因为他们不知道为什么有时它们会从功能奇怪的结果。你叫他们幼稚或过于谨慎,因为一个狭窄的一块知识,那你说他们不知道。但是,当你在调试讨厌的东西你要问,为什么你没有在你的代码有这样的检查,而你要结束了寻找,就像天真不能够发现排在首位的bug。

在短:无码是通过假设他们周围环境的坚固性由健壮

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top