속성 설정자 또는 getter에서 예외를 던질 필요가 있다고 생각하면 디자인에 결함이 있다고 주장합니다.
속성은 단지 값인 것을 나타내는 추상화입니다 . 예외가 발생할 수도 있다는 두려움없이 가치를 설정할 수 있어야합니다. *
속성을 설정하면 부작용이 발생하는 경우 실제로 메서드로 구현해야합니다. 그리고 부작용이 발생하지 않으면 예외가 발생하지 않습니다.
다른 답변에서 이미 언급 한 예는 Stream.Position
속성입니다. 이로 인해 부작용이 발생하고 예외가 발생할 수 있습니다. 그러나이 속성 설정 기는 기본적으로 Stream.Seek
대신 호출 할 수 있는 래퍼 입니다.
개인적으로, 나는 그 입장이 쓰기 가능한 재산이 아니어야한다고 믿습니다.
속성 설정 기에서 예외를 발생시키려는 유혹을받을 수있는 또 다른 예는 데이터 유효성 검사에 있습니다.
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
그러나이 문제에 대한 더 나은 해결책이 있습니다. 유효한 이메일 주소를 나타내는 유형을 소개하십시오.
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
Email
클래스는 유효한 이메일 주소가 아닌 값을 보유 할 수 없도록하고, 클래스는 저장 이메일에 대한 필요성을 검증하는 의무에서 해방됩니다.
또한 전자 메일 주소가 무엇인지, 어떻게 유효성을 검사하는지에 대한 지식이 더 높은 응집력 (좋은 소프트웨어 설계의 지표)으로 이어집니다 Email
.
* ObjectDisposedException은 현재 생각할 수있는 유일한 유효한 예외입니다.