공개 메소드의 인수를 검증하는 것이 권장된다고 들었습니다.
- null을 기대하지 않으면 null을 검사해야합니까?
- 메소드가 매개 변수의 유효성을 검증해야합니까?
- MSDN-CA1062 : 공용 메서드의 인수 유효성 검사 (.NET 배경은 있지만 질문은 C #에 국한되지 않음)
동기 부여는 이해할 수 있습니다. 모듈이 잘못된 방식으로 사용될 경우 예측할 수없는 동작 대신 즉시 예외를 처리하려고합니다.
나를 괴롭히는 것은 잘못된 인수가 모듈을 사용하는 동안 발생할 수있는 유일한 오류가 아니라는 것입니다. 권장 사항을 따르고 오류 에스컬레이션을 원하지 않는 경우 검사 로직을 추가해야하는 오류 시나리오는 다음과 같습니다.
- 수신 전화-예기치 않은 인수
- 수신 전화-모듈이 잘못된 상태입니다
- 외부 전화-예기치 않은 결과가 반환되었습니다.
- 외부 통화-예상치 못한 부작용 (호출 모듈에 이중 입력, 다른 종속성 상태 중단)
나는이 모든 조건을 고려하고 하나의 방법 (죄송하지만 C #이 아닌 사람들)으로 간단한 모듈을 작성하려고했습니다.
public sealed class Room
{
private readonly IDoorFactory _doorFactory;
private bool _entered;
private IDoor _door;
public Room(IDoorFactory doorFactory)
{
if (doorFactory == null)
throw new ArgumentNullException("doorFactory");
_doorFactory = doorFactory;
}
public void Open()
{
if (_door != null)
throw new InvalidOperationException("Room is already opened");
if (_entered)
throw new InvalidOperationException("Double entry is not allowed");
_entered = true;
_door = _doorFactory.Create();
if (_door == null)
throw new IncompatibleDependencyException("doorFactory");
_door.Open();
_entered = false;
}
}
이제 안전합니다 =)
꽤 오싹합니다. 그러나 수십 개의 메소드, 복잡한 상태 및 많은 외부 호출 (hi, 의존성 주입 애호가)이있는 실제 모듈에 얼마나 소름 끼칠지 상상해보십시오. 동작을 무시할 수있는 모듈 (C #에서 봉인되지 않은 클래스)을 호출하는 경우 외부 호출을 수행하므로 호출자의 범위에서 결과를 예측할 수 없습니다.
요약하면, 올바른 방법은 무엇이며 왜? 아래 옵션 중에서 선택할 수 있으면 추가 질문에 대답하십시오.
전체 모듈 사용량을 확인하십시오. 단위 테스트가 필요합니까? 그러한 코드의 예가 있습니까? 의존성 주입은 사용량이 제한되어야합니까 (더 많은 검사 논리가 발생하기 때문에)? 해당 검사를 디버그 시간으로 옮기는 것이 실용적이지 않습니까 (릴리스에 포함하지 않음)?
인수 만 확인하십시오. 내 경험상 인수 검사, 특히 null 검사는 가장 효과적인 검사입니다. 인수 오류는 복잡한 실수와 오류 에스컬레이션을 거의 일으키지 않기 때문입니다. 대부분의 경우 NullReferenceException
다음 줄에 표시됩니다. 그렇다면 인수 확인이 왜 그렇게 특별합니까?
모듈 사용량을 확인하지 마십시오. 꽤 인기가없는 의견입니다. 이유를 설명해 주시겠습니까?