문제

이것은 정말,정말행하게,그래서 나는 누군가가 나에게 합당한 대한 정당성을 가지 이유로 그들이 있습니다.

용하여 notimplementedexception. 당신은 당신의 다리,오른쪽?

No,나는 가는 저렴한 자가 이 말해서,"hang 에,이 방법은 구현-투를 사용하여 notimplementedexception." 그래,그건 바로,당신은 당신을 구현하는 방법을 던져 사용하여 notimplementedexception(와는 달리 순수 가상 함수 호출에서는 C++에서 이제는 말!).그 동안의 굉장히 재미있는,더 심각한 문제에 내 마음입니다.

제가 궁금한 점에서,존재용하여 notimplementedexception,어떻게 사람이 할 수 있는 아무것도니다.Net?당신이 예상하는 포장마 추상적인 방법으로 호출을 시도 catch 블록에 대비하는 방법을지 않을 수도 있습을 구현할 수 있습니까?를 잡을 경우 이러한 예외가 무엇이 당신이 해야 할까요??

나는 방법을 볼 수 없을 테스트하는 경우에는 방법은 실제로 구현하지 않고 호출니다.이후 호출하는 부작용이 있을 수 있습니다.가 없이 모든 내 검사를 선한 후 실행 알고리즘이 있습니다.하고 실행할 수 있어요 나는 알고리즘을 잡아 NotImplementedExceptions 그리고 어떻게 목록을 다시 내 응용 프로그램 일부를 온전한 상태입니다.

그것은 미친.Mad.다.그래서 질문은 다음과 같습니다: 왜 존재용하여 notimplementedexception?

로 선제 공격은,내가 원하지 않는 사람과 함께 반응하기 때문에"디자이너는 필요에 넣고 자동으로 생성된 코드입니다." 이것은 무서.오히려 자동으로 생성된 코드를 컴파일되지 않을 때까지 당신을 공급하는 구현합니다.예를 들어,자동 생성 구현이 될 수 있을 던져"용하여 notimplementedexception;"어디에 사용하여 notimplementedexception 정의하지 않은!

는 사람이 이제까지 잡아 처리용하여 notimplementedexception?당신은 이제까지 왼쪽으로 사용하여 notimplementedexception 코드에서?그렇다면,이 대표 시한폭탄이(즉,당신은 실수로 왼쪽 그것은 거기),또는 디자인 결함(는 방법하지 않아야 될 구현 및 없을 것이라는)?

내가 의심스러운의 코드 액세스 보안을 통해 보호는 또한...지원되지 않는 이유는 무엇입니까?무엇을?는 경우 그것은 지원하지 않는,왜 그것의 일부 인터페이스?할 수 있는 누군가에서 Microsoft 철자 부적절한 상속?그러나 나는 또 다른 시작을 위한 질문을하지 않으면 내가 너무 남용에 오신것을 환영합니다.

추가 정보:

흥미로운 읽을 수 있습니다.

가 될 것으로 보인 강력한 계약 브래드스 는"용하여 notimplementedexception 은 기능성은 아직 구현되지 않았지만,정말(및 될 것이다).무언가를 수 있는 것과 비슷 시작 으로 구축 하는 경우,클래스를 모든 방법이 있을 던지는 사용하여 notimplementedexception,다음 그들을 끌어와 실제 코드는..."

의 댓글 Jared 파슨스 는 매우 약한 것을 무시:용하여 notimplementedexception:던질 때 이 예외를 유지 않을 구현하는 방법에 대한 다른 이유입니다.

MSDN 도 약한,주제에는 단지 나가겠다는 의지를 표명"이 발생하는 예외는 경우 요청한 메서드 또는 운영이 구현되지 않습니다."

도움이 되었습니까?

해결책

유용한 한 가지 상황이 있습니다 : TDD.

테스트를 작성한 다음 스터브를 만들어 테스트가 컴파일됩니다. 그 스터브는 아무것도하지 않습니다 throw new NotImplementedException();. 이런 식으로 테스트는 기본적으로 실패합니다. 더미 반환 값을 사용하면 오 탐지가 발생할 수 있습니다. 이제 구현이 없기 때문에 모든 테스트가 컴파일되고 실패 했으므로 해당 스텁을 다룹니다.

나는 결코 사용하지 않기 때문에 NotImplementedException 다른 상황에서는 아니요 NotImplementedException 항상 테스트가 실패하기 때문에 릴리스 코드로 전달됩니다.

당신은 어디에서 그것을 잡을 필요가 없습니다. 좋은 API는 예외를 설명합니다. 그것들은 당신이 찾아야 할 것입니다.

편집 : 나는 그들을 찾기 위해 FXCOP 규칙을 작성했습니다.

이것은 코드입니다.

using System;
using Microsoft.FxCop.Sdk;

/// <summary>
/// An FxCop rule to ensure no <see cref="NotImplementedException"/> is
/// left behind on production code.
/// </summary>
internal class DoNotRaiseNotImplementedException : BaseIntrospectionRule
{
    private TypeNode _notImplementedException;
    private Member _currentMember;

    public DoNotRaiseNotImplementedException()
        : base("DoNotRaiseNotImplementedException",
               // The following string must be the assembly name (here
               // Bevonn.CodeAnalysis) followed by a dot and then the
               // metadata file name without the xml extension (here
               // DesignRules). See the note at the end for more details.
               "Bevonn.CodeAnalysis.DesignRules",
               typeof (DoNotRaiseNotImplementedException).Assembly) { }

    public override void BeforeAnalysis()
    {
        base.BeforeAnalysis();
        _notImplementedException = FrameworkAssemblies.Mscorlib.GetType(
            Identifier.For("System"),
            Identifier.For("NotImplementedException"));
    }

    public override ProblemCollection Check(Member member)
    {
        var method = member as Method;
        if (method != null)
        {
            _currentMember = member;
            VisitStatements(method.Body.Statements);
        }
        return Problems;
    }

    public override void VisitThrow(ThrowNode throwInstruction)
    {
        if (throwInstruction.Expression != null &&
            throwInstruction.Expression.Type.IsAssignableTo(_notImplementedException))
        {
            var problem = new Problem(
                GetResolution(),
                throwInstruction.SourceContext,
                _currentMember.Name.Name);
            Problems.Add(problem);
        }
    }
}

그리고 이것은 규칙 메타 데이터입니다.

<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="Bevonn Design Rules">
  <Rule TypeName="DoNotRaiseNotImplementedException" Category="Bevonn.Design" CheckId="BCA0001">
    <Name>Do not raise NotImplementedException</Name>
    <Description>NotImplementedException should not be used in production code.</Description>
    <Url>http://stackoverflow.com/questions/410719/notimplementedexception-are-they-kidding-me</Url>
    <Resolution>Implement the method or property accessor.</Resolution>
    <MessageLevel Certainty="100">CriticalError</MessageLevel>
    <Email></Email>
    <FixCategories>NonBreaking</FixCategories>
    <Owner></Owner>
  </Rule>
</Rules>

이것을 만들려면 다음을 위해 필요합니다.

  • 참조 Microsoft.FxCop.Sdk.dll 그리고 Microsoft.Cci.dll

  • 메타 데이터를 부르는 파일에 넣습니다 DesignRules.xml 어셈블리에 임베디드 리소스로 추가하십시오.

  • 어셈블리의 이름을 지정하십시오 Bevonn.CodeAnalysis. 메타 데이터 또는 어셈블리 파일에 대해 다른 이름을 사용하려면 두 번째 매개 변수를 기본 생성자로 변경하십시오.

그런 다음 결과 어셈블리를 FXCOP 규칙에 추가하고 귀중한 코드에서 저주받은 예외를 가져 오십시오. 던질 때 알 수없는 사례를보고하지 않는 코너 케이스가 있지만 실제로 그러한 Cthulhian 코드를 작성하면 희망이 없다고 생각합니다. 정상적인 용도의 경우, 즉 throw new NotImplementedException();, 그것은 효과가 있으며 그것이 중요한 전부입니다.

다른 팁

상당히 일반적인 사용 사례, 작동하지만 부분적으로 완료된 API를 지원하기 위해 있습니다. 개발자가 내 API를 테스트하고 평가하고 싶다고 말합니다. WashDishes() 적어도 내 컴퓨터에서 작동하지만 아직 코딩하지 않았습니다. DryDishes(), 물론 PutAwayDishes(). 조용히 실패하거나 비밀 오류 메시지를 제공하는 대신 그 이유를 분명히 할 수 있습니다. DryDishes() 작동하지 않습니다. 아직 구현하지 않았습니다.

자매 예외 NotSupportedException 공급자 모델에 주로 의미가 있습니다. 많은 식기 세척기는 건조 기능이 있으므로 인터페이스에 속하지만 할인 식기 세척기는이를 지원하지 않습니다. 나는 그것을 통해 그것을 알릴 수 있습니다 NotSupportedException

몇 가지 의견에 흩어져 있기 때문에 이것에 대한 내 견해를 한곳에서 요약하겠습니다.

  1. 너는 사용한다 NotImplementedException 인터페이스 멤버가 아직 구현되지 않았지만 그럴 것임을 나타냅니다. 이를 자동화 된 장치 테스트 또는 QA 테스트와 결합하여 여전히 구현 해야하는 기능을 식별합니다.

  2. 기능이 구현되면 NotImplementedException. 기능이 제대로 작동하는지 확인하기 위해 새로운 장치 테스트가 작성되었습니다.

  3. NotSupportedException 일반적으로 특정 유형에 맞지 않는 기능을 지원하지 않는 제공 업체에 사용됩니다. 이 경우 특정 유형은 예외를 던지고 클라이언트는이를 잡아서 적절하게 처리합니다.

  4. 둘 다 이유 NotImplementedException 그리고 NotSupportedException 프레임 워크에 존재하는 것은 간단합니다. 이들로 이어지는 상황은 일반적이므로 프레임 워크에서이를 정의하는 것이 합리적이므로 개발자가 계속 재정의 할 필요가 없습니다. 또한 클라이언트는 어떤 예외를 포착 해야하는지 쉽게 알 수 있습니다 (특히 단위 테스트의 맥락에서). 자신의 예외를 정의해야한다면, 어떤 예외를 잡을 것인지, 최소한의 비생산적인 시간 싱크대, 그리고 자주 부정확한지 알아 내야합니다.

NotimplementedException이 존재하는 이유는 무엇입니까?

NotimplementedException은 아직 무언가가 준비되지 않았다고 말하는 좋은 방법입니다. 준비되지 않은 이유는 Method의 저자에게 별도의 질문입니다. 생산 코드에서는이 예외를 포착 할 가능성이 거의 없지만, 만약 당신이 한 일이 일어난 일을 즉시 볼 수 있으며, 왜 방법이 호출되었지만 아무런 일이 발생하지 않았는지 알아내는 것이 "임시"결과를 받고 얻는 것보다 훨씬 낫습니다. "재미있는"부작용.

NotimplementedException이 Java의 UnsupportEdoperationException과 동일합니까?

.NET은 지원하지 않았습니다

알고리즘을 실행하고, 알 수있는 exceptions를 잡아야하고, 일부 애플리케이션을 제정신 상태로 롤백하는 방법

좋은 API에는 가능한 예외를 설명하는 XML 메소드 문서가 있습니다.

나는 지원되지 않은 예고도 매우 의심 스럽다 ... 지원되지 않습니까? 뭐? 지원되지 않으면 인터페이스의 일부입니까?

수백만의 이유가있을 수 있습니다. 예를 들어 새 버전의 API를 도입 할 수 있으며 오래된 방법을 지원하고 싶지 않습니다. 다시 말하지만, 설명 예외를보고 문서화를 파헤 치거나 제 3 자 코드를 디버깅하는 것이 훨씬 낫습니다.

NotimplementedException 예외의 주요 용도는 생성 된 스터브 코드입니다. 예를 들어, Visual Studio는 본문과 함께 인터페이스의 메소드/속성을 명시 적으로 구현합니다.

답장 NotImplementedException - 이것은 몇 가지 용도로 사용됩니다. 예를 들어, 유닛 테스트가 불완전한 작업을 위해 잠길 수있는 단일 예외를 제공합니다. 그러나 그것은 실제로 말하는 것을 실제로 수행합니다. 이것은 단순히 거기에 있지 않습니다 (아직). 예를 들어, "모노"는 MS Libs에 존재하지만 아직 쓰여지지 않은 방법을 위해이 곳에 버립니다.

답장 NotSupportedException - 모든 것을 사용할 수있는 것은 아닙니다. 예를 들어, 많은 인터페이스가 "이렇게 할 수 있습니까?"쌍을 지원합니다. / "이 작업을 수행". "당신은 이것을 할 수 있습니까?" 거짓을 반환하면, "이 일을하는 것이"는 완벽하게 합리적입니다. NotSupportedException. 예일 수도 있습니다 IBindingList.SupportsSearching / IBindingList.Find() 등.

Microsoft의 대부분의 개발자는 NotimplementedException이 적절한 디자인 패턴에 익숙합니다. 실제로는 상당히 일반적입니다.

좋은 예는 a 복합 패턴, 많은 객체가 객체의 단일 인스턴스로 취급 될 수 있습니다. 구성 요소는 상속 된 리프 클래스 (적절하게)의 기본 추상 클래스로 사용됩니다. 예를 들어, 파일 및 디렉토리 클래스는 매우 유사한 유형이기 때문에 동일한 추상 기본 클래스에서 상속 될 수 있습니다. 이런 식으로, 그들은 단일 객체로 취급 될 수 있습니다 (예를 들어 UNIX와 같은 파일과 디렉토리에 대해 생각할 때 의미가 있습니다. 예를 들어 모든 것이 파일입니다).

따라서이 예에서는 디렉토리 클래스에 대한 getFiles () 메소드가 있지만 파일 클래스는이 메소드를 구현하지 않습니다. 대신 파일에 디렉토리가하는 방식에 어린이가 없기 때문에 NotimplementedException이 나타납니다.

이것은 .NET에 국한되지 않습니다. 많은 OO 언어와 플랫폼 에서이 패턴을 만날 것입니다.

가능한 모든 예외를 포착해야한다고 생각하는 이유는 무엇입니까? 모든 방법 호출을 랩핑합니까? catch (NullReferenceException ex) 도?

스터브 코드 던지기 NotImplementedException 자리 표시 자입니다. 해제 할 경우 버그가되어야합니다. NullReferenceException.

내가 생각하는 이유는 많은 이유가 있 MS 추가 사용하여 notimplementedexception 하는 프레임워크:

  • 로 편익;때문에 많은 개발자들이 그것을 필요로하는 동안 개발,왜 모든 사람들 롤 자신?
  • 그래서 그 도구에 의지할 수 있는 존재를;예를 들어,Visual Studio 의"인터페이스 구현을"명령을 생성하는 방법을 명세서는 던져 사용하여 notimplementedexception.지 않은 경우 프레임워크에 있는 것이 가능하지 않거나,적어도는(예를 들어,그것을 생성할 수 있는 코드를 컴파일하지 않을 때까지 당신 자신의 추가 사용하여 notimplementedexception)
  • 을 격려하는 일관하는"표준적인"

Frankodwyer 의 생각 사용하여 notimplementedexception 잠재적으로 timebomb.내가 말하는 것이 어떤 미완성된 코드 timebomb 지만,용하여 notimplementedexception 훨씬 쉽게 해체보다는 대안입니다.예를 들어,당신은 당신의 구축 서버는 검사에 대한 소스 코드의 모든 사용에 있어서 이 클래스고 보고서로 그들을 경고합니다.하려면 정말 금지,그것도 추가할 수 있습하는 훅이 귀하의원-제어 시스템을 방지하는 체크인의 코드입니다.

확실히,당신 자신의 롤 사용하여 notimplementedexception,에서 제거할 수 있습니다 최종 구축하지 않다는 것을 확인하는 시간이 폭탄을 남아 있습니다.하지만 이에만 사용하는 경우에 당신의 자신의 구현을 지속적으로 전체 팀과는지 확인해야 합니다 잊지 마세요 당신이 그것을 제거하기 전에 릴리스입니다.또한,당신은 당신을 찾을 수 있습니는 당신을 제거할 수 없습니다;어쩌면 거기에 몇 가지 허용된 사용,예를 들어에서 테스트 코드는 발송되지 않습니다.

실제로 실제로는 이유가 없습니다 잡다 NotimplementedException. 히트하면 앱을 죽이고 매우 고통스럽게해야합니다. 이를 수정하는 유일한 방법은 그것을 포착하는 것이 아니라 소스 코드를 변경하는 것이 아니라 (호출 된 메소드 구현 또는 호출 코드를 변경)입니다.

두 가지 이유 :

  1. 개발 중에 방법이 튀어 나와서 코드 작성이 완료되지 않았다는 것을 개발자에게 상기시켜주는 예외를 던졌습니다.

  2. 설계별로 상속 된 기본 클래스 또는 인터페이스의 하나 이상의 메소드를 구현하지 않는 서브 클래스 인터페이스를 구현합니다. (일부 인터페이스는 너무 일반적입니다.)

이것은 나에게 잠재적 인 지뢰밭처럼 들립니다. 먼 과거에 나는 한때 몇 년 동안 논스톱을 실행하고 하루에 걸쳐 떨어진 레거시 네트워크 시스템에서 일했습니다. 우리가 문제를 추적했을 때, 우리는 명확하게 완료되지 않았고 결코 작동하지 않았던 코드를 발견했습니다. 이 특정 코드 경로는 전에는 본 적이 없다는 것이 분명했습니다.

머피의 법칙에 따르면, 비슷한 일은 알림 지출의 경우에만 일어날 것을 간청하고 있다고 말합니다. 요즘 TDD 등에 부여 된 것은 출시 전에 수령해야하며, 적어도 출시 전에 해당 예외에 대한 코드를 Grep 할 수 있지만 여전히 가능합니다.

테스트 할 때는 모든 사례의 적용 범위를 보장하기가 어렵고, 이는 시간 문제를 컴파일 할 수있는 일에 대한 실행 시간 문제를 만들어 작업을 어렵게 만드는 것처럼 들립니다. (비슷한 종류의 '기술 부채'에는 'Duck Typing'에 크게 의존하는 시스템이 있으며, 매우 유용하다는 것을 인정합니다).

COM Interop의 경우이 예외가 필요합니다. e_notimpl입니다. 링크 된 블로그는 다른 이유도 보여줍니다

던지기 NotImplementedException IDE가 컴파일 스터브 코드를 생성하는 가장 논리적 인 방법입니다. 인터페이스를 확장하고 Visual Studio를 가져와 스터브 할 때처럼.

당신이 약간의 c ++/com을했다면, 그것이 알려진 것을 제외하고도 존재했습니다. E_NOTIMPL.

유효한 사용 사례가 있습니다. 인터페이스의 특정 메소드를 작업하는 경우 코드를 컴파일하여 디버그하고 테스트 할 수 있습니다. 논리에 따르면 인터페이스에서 메소드를 제거하고 비 컴파일 스터브 코드를 주석해야합니다. 이것은 매우 근본 주의적 접근법이며, 그것이 장점이 있지만, 모든 사람이 그것을 준수하거나 준수하지 않아야합니다. 게다가, 대부분의 시간은 인터페이스가 완료되기를 원합니다.

NotimplementedException이 아직 준비되지 않은 방법을 잘 식별하면 하루가 끝나면 누르는 것만 큼 쉽습니다. Ctrl+Shift+F 그것들을 모두 찾기 위해, 나는 또한 정적 코드 분석 도구가 그것을 선택할 것이라고 확신합니다.

당신은 코드를 배송하기위한 것이 아닙니다 NotImplementedException 예외. 사용하지 않으면 코드를 더 좋게 만들 수 있다고 생각하면 소스 품질을 향상시키기 위해 할 수있는 생산적인 작업이 더 있습니다.

NotimplementedException

요청 된 방법이나 작업이 구현되지 않으면 예외가 발생합니다.

.NET 코어에 정의 된 단일 예외로 만들면 더 쉽게 찾아서 근절 할 수 있습니다. 모든 개발자가 자신의 것을 만들어야하는 경우 ACME.EmaNymton.NotImplementedException 그들 모두를 찾기가 더 어려울 것입니다.

지원되지 않은 예고

호출 된 방법이 지원되지 않으면 예외가 발생합니다.

예를 들어, 호출 된 기능을 지원하지 않는 스트림을 읽고, 찾거나, 쓰려는 시도가있을 때.

예를 들어 반복자를 생성합니다 (사용 yield 키워드) IS-A IEnumerator, 하지만 IEnumerator.Reset 방법이 던져집니다 NotSupportedException.

ECMA-335에서 CLI 사양, CLI 라이브러리 유형, System.notimplementedException, 비고 섹션 :

"이 표준의 다른 곳에 지정된 다수의 유형과 구조는 커널 프로파일에만 부합하는 CLI 구현에 필요하지 않습니다. 예를 들어, 부동 소수점 기능 세트는 부동 소수점 데이터 유형 시스템으로 구성됩니다. System.Double. 이들에 대한 지원이 구현에서 생략되면 부동 소수점 데이터 유형을 포함하는 서명을 참조하려는 모든 시도는 유형 시스템을 제외하고는 추후 외지를 나타냅니다. "

따라서 예외는 최소한의 적합성 프로파일 만 구현하는 구현을위한 것입니다. 최소 필수 프로파일은 커널 프로파일 (ECMA -335 4th Edition -Partition IV, 섹션 3 참조)입니다. 여기에는 BCL이 포함되어 있기 때문에 예외는 다른 위치가 아닌 "Core API"에 포함 된 이유입니다.

예외를 사용하여 수립 방법을 표시하거나 구현이없는 디자이너 생성 방법은 예외의 의도를 오해하는 것입니다.

이 정보가 MS의 CLI 구현을위한 MSDN 문서에 포함되지 않은 이유는 저를 넘어선 것입니다.

나는 NotimplementedException (주로 당신의 견해에 동의합니다)에 대해 보증 할 수는 없지만 직장에서 사용하는 핵심 라이브러리에서 핵심 정보를 광범위하게 사용했습니다. 예를 들어 DatabaseController를 사용하면 지원되는 유형의 데이터베이스를 작성한 다음 아래의 데이터베이스 유형에 대해 너무 많이 돌보지 않고도 나머지 코드 전체에서 DatabaseController 클래스를 사용할 수 있습니다. 상당히 기본적인 것들? 지원되지 않은 예는 편리한 곳 (그리고 아직 존재하지 않으면 내 자신의 구현을 사용했을 때)는 두 가지 주요 인스턴스입니다.

1) 응용 프로그램을 다른 데이터베이스로 마이그레이션하는 경우가 종종 발생하는 경우가 거의 없거나 필요하지 않습니다. 불신*t. 더 나가십시오.

2) 동일한 데이터베이스, 다른 드라이버의 가장 최근 예는 WinXP에서 Win7 X64로 업그레이드 된 액세스 지원 응용 프로그램을 사용하는 클라이언트가시기였습니다. 64 비트 제트 드라이버가 아니기 때문에 IT Guy는 대신 AccessDatabaseEngine을 설치했습니다. 앱이 충돌했을 때 로그에서 쉽게 볼 수있었습니다. DB.Connect는 신속하게 해결할 수있었습니다. 최근의 또 다른 예는 액세스 데이터베이스에서 트랜잭션을 사용하려는 프로그래머 중 하나였습니다. 액세스는 거래를 지원하더라도 라이브러리는 액세스 거래를 지원하지 않습니다 (이 기사의 범위를 벗어난 이유). 외상을 받았지만, 당신의 시간입니다!

3) 일반 함수 나는 간결한 "경험에서"예제를 생각할 수 없지만 이메일에 첨부 파일을 추가하는 함수와 같은 것을 생각하면 JPEGS와 같은 몇 가지 공통 파일을 가져갈 수 있기를 원합니다. 다양한 스트림 클래스에서 파생 된 모든 것, 사실상 ".ToString"메소드가있는 모든 것. 후자의 경우, 가능한 모든 유형을 설명 할 수는 없으므로 일반적인 유형을 설명 할 수는 없습니다. 사용자가 우리의 CrazyDataTypeForCortainingProprietarySpreadSheetData를 통과하면 반사를 사용하여 ToString 방법의 존재를 테스트하고 지원하지 않는 데이터 유형에 대한 지원 부족을 나타냅니다.

NotsupportedException은 어느 정도 중요한 기능이 아니지만 더 큰 프로젝트에서 작업 할 때 더 많이 사용하는 것입니다.

생산 코드 에이 방법이 있다고 가정 해 봅시다.

public void DoSomething()

나중에 끝내고 싶다면 어느 것을 취 하시겠습니까?

public void DoSomething()
{
}

또는

public void DoSomething()
{
    throw new NotImplementedException();
}

나는 확실히 두 번째를 가져갈 것입니다. Elmah 또는 귀하가 가진 모든 오류 로깅 메커니즘 (전체 응용 프로그램에서 측면으로 구현)과 결합합니다. CHATCE가 잡히면 루그/예외 필터링과 함께 비판 오류 이메일 알림을받을 때.

NotimplementedException == 미완성이라는 주장도 정확하지 않습니다. (1) 구현되지 않은 방법의 잡기는 단위 테스트/ 통합 테스트에 맡겨야합니다. 명시 적으로 표현되지 않은 100% 커버리지 (지금해야 할 많은 모의/스터브/코드 생성 도구)가 있다면 걱정은 무엇입니까? (2) 코드 생성. 평범한 간단합니다. 다시 말하지만, 코드를 생성하고 생성 된 코드의 절반 만 사용하면 생성 된 스터브의 나머지 부분에 대해 명확하지 않은 이유는 무엇입니까?

모든 귀중한 입력을 NULL에 대해 확인/처리하지 않으면 코드가 컴파일되지 않아야한다고 말하는 것과 같습니다. (일명 1 조 달러 실수가 아니라면). 언어는 융통성이 있어야하지만 시험/계약은 견고해야합니다.

드물게 인터페이스 수정에 사용하는 경우는 거의 없습니다. 당신이 당신이 준수 해야하는 인터페이스를 준수하지만 특정 방법은 누구에게도 호출되지 않을 것이라고 가정하므로, 명백한 exception을 고수하면 누군가가 그것을 부르면 그들이 뭔가 잘못하고 있다는 것을 알게 될 것입니다.

NotimplementedException은 .NET의 일부 메소드에 대해 발생합니다 (구현되지 않았지만 메소드가 존재하는 Code Dom의 Parser C# 참조!)

둘 다 두 가지 일반적인 문제에 대한 해킹입니다.

NotimplementedException은 아키텍처 우주 비행사이며 API를 먼저 기록하고 나중에 코드를 작성하는 개발자를위한 해결 방법입니다. 분명히, 이것은 점진적인 프로세스가 아니기 때문에, 한 번에 모두 구현할 수 없으므로 알 수없는 exception을 던져서 반드시 반드시 척하고 싶어합니다.

NotsupportedException은 C# 및 Java에있는 것과 같은 유형 시스템의 한계를 중심으로 해킹됩니다. 이러한 유형 시스템에서는 사각형 '이'Shape Iff 사각형이 모든 형태 특성 (멤버 함수 + 변수 포함)을 상속한다고 말합니다. 그러나 실제로 이것은 사실이 아닙니다. 예를 들어, 사각형은 사각형이지만 정사각형은 일반화가 아니라 사각형의 제한입니다.

따라서 부모 클래스의 동작을 상속하고 제한하고 싶을 때 제한에 맞지 않는 방법에 대해지지받지 못했습니다.

프로토 타입 또는 미완성 프로젝트는 어떻습니까?

나는 이것이 예외를 사용하는 것이 정말 나쁜 생각이라고 생각하지 않습니다 (이 경우 메시지 상자를 사용하지만).

글쎄, 나는 다소 동의한다. 모든 클래스가 모든 클래스의 모든 비트를 구현할 수있는 방식으로 인터페이스가 이루어졌다면 제 생각에는 분해되어야합니다.

ILIST가 수정 될 수 있거나 수정할 수없는 경우, 수정할 수없는 부분 (Getters, Lookup 등)과 수정 가능한 부품 (세터, 추가, 제거 등)을 위해 두 개로 나뉘어져야합니다.

내 코드에 몇 가지 NotimplementedException이 있습니다. 종종 인터페이스 또는 추상 클래스의 일부에서 나옵니다. 미래에 필요한 몇 가지 방법은 수업의 일원으로 이해되지만 실제로는 필요하지 않으면 시간을 더하고 싶지 않습니다. 예를 들어, 게임의 모든 개별 종류의 통계에 대한 인터페이스가 있습니다. 이러한 종류 중 하나는 MODSTAT이며, 이는 기본 통계 및 모든 수정 자 (예 : 무기, 갑옷, 주문)의 합입니다. 내 STAT 인터페이스에는 변경 된 이벤트가 있지만 MODSTAT는 호출 할 때마다 참조하는 모든 통계의 합을 계산하여 작동합니다. 따라서 통계가 변경 될 때마다 수많은 ModStat.onchange 이벤트가 제기되는 대신 OnChange의 청취자를 추가/제거하려고 시도하면 NotimplementedException이 발생했습니다.

.NET 언어는 생산성에 관한 것이므로 왜 사용하지 않는 것을 코딩하는 데 시간을 보내는가?

다음은 다음과 같습니다. Java에서 인터페이스를 구현할 때마다 Iterator, 당신은 명백한 방법을 무시해야합니다 hasNext() 그리고 next(), 그러나 그러나 또한 있습니다 delete(). USECASES의 99%에서 나는 이것을 필요로하지 않기 때문에 나는 단지 NotImplementedException. 이것은 조용히 아무것도하지 않는 것보다 훨씬 낫습니다.

NotimplementedException은 개발을 촉진하기 위해서만 존재합니다. 인터페이스 구현을 시작한다고 상상해보십시오. 다음 방법으로 이동하기 전에 하나의 방법을 구현할 때 최소한 빌드 할 수 있기를 원합니다. NotimlementedExceptions를 사용하여 명백한 방법을 스터브하는 것은 나중에 쉽게 찾을 수있는 미완성 된 코드를 생활하는 좋은 방법입니다. 그렇지 않으면 고치는 것을 잊을 수있는 것을 빠르게 구현할 위험이 있습니다.

당신이 그것을 사용하고 싶지 않다면 그것을 무시하십시오. 성공한 모든 부분에 성공한 코드 블록이 있지만 그 사이에 실패 할 수 있다면 유일한 옵션은 기지를 잡는 것입니다. Exception 그리고 롤백해야 할 것을 롤백하십시오. 잊다 NotImplementedException. 같은 많은 예외가 발생할 수 있습니다 MyRandomException 그리고 GtfoException 그리고 OmgLolException. 원래 코드를 작성한 후에는 내가 호출 할 수있는 API에서 다른 예외 유형을 던질 수 있습니다. 코드를 쓸 때 존재하지 않은 것. 다른 사람들을 위해 처리하는 방법과 롤백을 알고있는 사람을 다루십시오. catch(Exception). 그것은 매우 간단합니다. 특히 당신이 때때로 당신에게 물건을 강요하는 언어/프레임 워크로 멋진 일을 시도 할 때.

내가 가진 한 가지 예는 직렬화입니다. 데이터베이스에 존재하지 않는 .NET 라이브러리에 속성을 추가했습니다 (예 : 기존의 "멍청한"속성에 대한 편리한 포장지는 FullName 결합되는 속성 FirstName, MiddleName, 그리고 LastName). 그런 다음 이러한 데이터 유형을 XML로 직렬화하여 와이어 위로 전송하려고합니다 (예 : ASP.NET 응용 프로그램에서 JavaScript로)는 직렬화 프레임 워크는 공개 속성 만 두 가지를 직렬화합니다. get 그리고 set 접근자. 나는 당신이 설정할 수 있기를 원하지 않습니다 FullName 그렇다면 나는 그것을 구문 분석해야했고 내가 잘못 구문 분석하고 데이터 무결성이 창 밖으로 나오는 예상치 못한 형식이있을 수 있습니다. 그에 대한 기본 속성 만 사용하는 것이 더 쉽지만 언어와 API가 필요하기 때문에 set 액세서, 나는 던질 것이다 NotImplementedException (나는 몰랐다 NotSupportedException 내가이 스레드를 읽을 때까지, 하나는 작동합니다. FullName 그는 테스트 중에 예외를 만나고 실수를 깨닫게됩니다.

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