문제

끊임없는 수표를 끊임없이 투입하는 개발자가 몇 명 있습니다.

예를 들어:

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

코드에서 누군가가 무인 매개 변수를 전달하면 수업을 보호한다고 생각합니다. 이 경우 누군가가 NULL을 통과하는 경우 소비자 코드에 문제가있을 가능성이 높기 때문에이 클래스 대신 예외를 던지고 빠르게 실패하기 때문에 논리의 결함을 말하려고합니다. 소비자와 계속 질식합니다.

또 다른 제안은 빠르게 실패하고 예외를 던지는 전제 조건 또는 가드 클래스를 갖는 것입니다. 소비자가 아마도 다른 문제가있을 것이라는 사실을 무시하는 것 외에는 아무 것도없고 나는 그것을 가리는 데 도움이됩니다.

당신의 수업이 그렇게 용서해서는 안된다는 사실을 사람들에게 이해하게하려면 어떻게해야합니까? 누군가가 좋은 데이터를 전달하지 않으면 말해야합니다.

내가이 시점을 가로 질러 도움이되는 좋은 기사 나 제안이 있습니까?

도움이 되었습니까?

해결책

수업이 수락 할 수없는 경우 null 논쟁, 그러면 가장 좋은 방법은 다음과 같습니다.

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

이것은 a를 얻는 것보다 훨씬 바람직합니다 NullPointerException 스택을 더 깊게 아래로 내려갑니다. 최악의 시나리오에서는이를 캐시합니다 null 어딘가에 실제로 예외가 발생하지 않을 때까지는 훨씬 나중에 예외를 유발하지 않으며 문제를 디버깅 할 수있는 재미를 확인하십시오. 그 다음에.

다른 사람들이 말했듯이 때때로 계약은 null 괜찮다. 이 경우 코드의 일부 주위에 가드 조항을 갖는 것이 정확합니다. 그러나 최상의 디자인은 선택적으로 널 인수없이 과부하를 추가하는 것입니다.

다른 팁

실제로 정확한 상황에 달려 있습니다. 당신이 나타내는 것처럼 보이는 것처럼 "코드에 null 검사를 넣지 마십시오"와 같은 일반적인 제안을하는 것은 거의 권장되지 않습니다. 학급의 계약은 합법적 인 것과 그렇지 않은 것을 정의해야합니다. 그러나 계약이 Null을 통과하는 것이 허용되지 않는다는 것을 분명히한다면, 예외는 실제로 적절한 응답입니다.

다른 사람들이 말했듯이, 기능이 예상 할 때 아무것도하지 않았기 때문에 생산에서 신비한 문제를 겪는 것보다 일찍 실패하는 것이 매우 바람직합니다. 함수가 예제에서와 같이 널 인수를 반환하는 경우).

함수가 돌아 오지 않고 단지 던지더라도 NullReferenceException, 논쟁이 무효 였다는 것을 알면 버그를 해결하는 것이 eaiser입니다. 함수가 던지면 a NullReferenceException, 당신은 무엇이 있었는지 전혀 모릅니다 null 또는 그 잘못이었다.

추가하고 싶습니다 ArgumentNullException 이유 때문에 매개 변수를 취합니다.

글을 쓰는 것이 좋습니다

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

던지는 것보다 ArgumentNullException a paramName.

이렇게하면 5 개의 매개 변수를 취하는 함수에서 예외가 있으면 매개 변수 중 어느 것이 문제를 일으킨 지 알 수 있습니다. 디버거를 첨부 할 수없는 경우 특히 중요합니다. (예를 들어, 프로덕션 웹 서버 또는 최종 사용자 머신에서)

많은 기능을 작성하는 경우 특히 문자열에 대한 지능이 없기 때문에 이것은 많은 오버 헤드 일 수 있습니다. 이 점검을 생성하기 위해 코드 스 니펫을 썼습니다.

<?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-endersen.aspx

나는 그것을 보지 못했지만 eiffel.com에는 두 가지 프레젠테이션이 있습니다 주제에 대한 (슬라이드+오디오) 계약에 의한 디자인. 이 사람들은 가지고 있습니다 발명 개념, 그래서 누군가가 그것을 설명 할 수 있다면 그것들입니다 :-)

때때로 당신은 사람들에게 왜 이런 연습이 잘못되었는지 말할 수 없습니다. 그들은 스스로 그것을 알아 내야합니다. 그러나이 문제로 인해 불쾌한 실패를 일으키는 단위 테스트를 통해 도착하여 오류를 디버깅하게함으로써 그들이 거기에 도착할 수 있습니다.

이 방법의 계약이 그 주장이 무효가되어서는 안된다고 지정하면, 옳은 일은 다음과 같은 어설 션을 사용하여 명시 적으로 만드는 것입니다.

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

디버그 구성을 사용하여 실행 파일을 구축 할 때 빠르게 실패하지만 릴리스 구성을 사용하여 구축 될 때는 성능 저하가 발생합니다.

이것은 관리 가능한 Best Write 코드에 대한 질문 인 것 같습니다. 코드의 모든 소비자에 대한 무지를 가정해야한다는 것은 저의 새로운 믿음입니다. 나는 저 또는 깊은 지식을 가진 사람이 내 코드를 소비한다고 가정함으로써 곤경에 빠졌습니다. 예외를 던지기에 추가 할 유일한 것은 맞춤형 예외를 만들고 내면의 예외로 빵 부스러기를 남겨 두는 것입니다. 개발자에게 특히 데이터로 인한 문제를 해결할 수있는 기회를 제공한다고 강력하게 믿습니다. 나는 대부분의 시간을 내 코드를 깨뜨리는 데이터를 찾기 위해 대부분의 시간을 보냅니다. 힌트를 남길 수 있다면 1 년 안에 몇 주를 절약 할 수 있습니다.

우선, 당신은 명백하게 부정확합니다. 당신은 매우 진지한 논리적 오류를 수용하고 있습니다. 주변에서 일어나는 모든 일이 정확하다고 가정하면 코드가 올바르게 코드가 올바르게되기를 원합니다. 마치 정확성이 모든 곳에서 스프레이 해야하는 일종의 마법의 픽시 먼지 인 것처럼

모든 버그는 노출되면 바보처럼 보입니다. 그러나 그 점검은 그들 자신을 노출시키기 위해 그들을 괴롭히는 점을 확인합니다. 그때까지 버그는 보이지 않습니다. 그리고 크고 복잡한 프로젝트의 경우 누가 버그를 찾을 것인지 또는 어떤 조건을 찾을 것인지 모릅니다. 탄력성을 위해 구조되는 코드는 일반적으로 모든 곳에서 이와 같은 점검을 가지고 있으며 오류 값을 포함 해야하는 모든 함수의 반환 값을 확인합니다. 그래서 당신은 "내가 의존하는 서브 기능이 작동하지 않기 때문에"그것을 할 수 없습니다. " 이것의 가장 큰 가치는 일반적으로 작업 주변을 구현하거나 자체 인식 디버그 계측을 매우 쉽게 구현할 수 있다는 것입니다. 가장 어려운 버그는 일반적으로 두 가지 속성에 의존하여 제대로 디버깅하기 때문입니다.

개발자로부터 몇 가지 교훈을 배우십시오. 그들은 때때로 기능에서 이상한 결과를 얻는 이유를 모르기 때문에 거기에 그런 점검을했습니다. 당신은 그들이 가지고 있지 않은 좁은 지식 때문에 순진하거나 지나치게 조심스럽게 부릅니다. 그러나 당신이 불쾌한 것을 디버깅 할 때 당신은 왜 코드에 그러한 점검이 없는지 궁금해 할 것이며, 버그를 처음에 발견 할 수없는 순진한 것처럼 보일 것입니다.

요컨대 : 주변 환경에 대한 견고성을 가정하여 코드는 강력 해지지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top