edisposable 패턴에서 기본 클래스는 파생 클래스가 배치 된 플래그를 공유하도록 허용해야합니까?

StackOverflow https://stackoverflow.com/questions/1079752

  •  21-08-2019
  •  | 
  •  

문제

현재 처리 패턴이없는 AC# 코드베이스를 수정하려고합니다.

대형 코드베이스이며 코드베이스를 요구하는 리소스이며 낮은 수준에서 관리되지 않은 C ++ 라이브러리를 많이 사용합니다.

나는 처분 패턴을 잘 이해하고 있습니다. 나는 문제에 대한 금 표준 기사라고 생각하는 것을 이해하는 데 시간을 보냈습니다. 조 더피의 처분 기사

코드 복제를 최소화하려고 시도하면서 우리는 일부 처분 도우미 클래스를 고려해 왔으며 내 질문은 다음과 같습니다.

기본 클래스가 표준 처분 패턴을 구현하는 경우 해당 깃발을 공유 할 수 있도록해야합니다. 보호 된 것으로 표시됩니까?

분명히 말하면 상속계 내에 객체 인스턴스가 폐기되었는지 여부를 정의하는 상속계 내에 단일 부울 상태 만 있어야합니까?

MSDN과 위의 링크의 예는 각 레벨에서 플래그를 설정하지만 그 뒤에있는 추론을 설명하지 마십시오. 나는이 문제에 대해 두 가지 생각에 있습니다. 당신의 생각과 이유는 무엇입니까?

도움이 되었습니까?

해결책

나는 그것이 깃발을 공유해서는 안된다고 말할 것입니다. 깃발을 공유하면 더 나은 캡슐화를 방지 할 수있는 실패의 기회가 생깁니다.

예를 들어, 기본 최대 클래스에 재시험 속성이있는 시나리오를 고려하십시오. 후원 필드는 기본 클래스의 Disposing (처분) 메소드에서만 TRUE로 설정됩니다. 이는 폐기 된 재산이 기본 클래스 처분이 호출되는 경우에만 사실을 반환 할 수 있음을 의미합니다 (물론 악한 반사). 이를 통해 기본 클래스는 시행 가능한 계약을 제공 할 수 있습니다.

이제 보호 된 세터가있는 반대쪽을 고려하십시오. 모든 클래스는 이제 아무것도 처분하지 않고 처분 된 재산을 임의로 TRUE로 설정할 수 있습니다. 이것은 아무것도 폐기되지 않을 때 마무리를 반환 할 기회를 만듭니다.

가장 시행 가능한 계약을 제공하기 때문에 첫 번째 옵션을 선택합니다.

다른 팁

나는 공개 getter와 보호 된 세터와 함께 기본 클래스에 배치 재산을 갖는 것이 좋습니다.

클래스가 배치되었을 때 다른 일을하는 방법이있는 경우, 예를 들어 예외를 던지면 기본 클래스에서 개인 필드를 읽는 기본 클래스에 대한 보호 된 getter 속성 만 만들어줍니다. 이렇게하면 상속인이 작업을 수행 할 수 있는지 알 수 있습니다.

그런 다음 클래스가 이미 자체 처분 방법에 배치되었는지 알기 위해 (예 : 자원을 두 번 방출하지 않기 위해) 개인 플래그를 갖는 것이 명확성과 유지에 더 좋다고 생각합니다.

Jaredpar의 답변 외에도, 나는 항상 거기에있는 것이 항상 필요한 것은 아니라고 덧붙였다. _disposed 깃발. 종종 물체의 다른 "자원 관련"필드는 자연스럽게 폐기 된 상태를 나타내는 방법을 제공합니다.

예를 들어, 필요한 외부 COM 객체 Shutdown 폐기되기 전에 COM 객체에 대한 참조로 표시되므로 관련 부분이 Dispose 다음과 같습니다.

if (_comObject != null)
{
    _comObject.Shutdown();
    _comObject = null;
}

전화없이 여러 번 안전하게 실행할 수 있습니다 Shutdown 필요한대로 두 번 이상. _comobject를 사용하려고 시도하는 다른 방법 Dispose a NullReferenceException, 또는 이상적으로 이러한 방법은 _comobject 필드를 확인하고 던지는 것입니다. ObjectDisposedException.

나는 이것이 자주 idisposable을 자주 구현 한 것보다 더 종종 사실이라고 생각합니다. _disposed 필드. 하나를 도입하면 자유도가 증가합니다 (나사로가는 방법의 수를 증가시킵니다).

따라서 이것은 안전한 아이디어 일지라도 파생 수업에 유용하지 않을 것입니다 (Jaredpar가 설명하는 것처럼 그렇지 않습니다).

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