.NET 속성과 관련된 디자인 문제가 있습니다.
interface IX
{
Guid Id { get; }
bool IsInvalidated { get; }
void Invalidate();
}
문제:
이 인터페이스에는 두 가지 읽기 전용 속성 Id
과가 IsInvalidated
있습니다. 그러나 이들이 읽기 전용이라는 사실만으로도 그 값이 일정하게 유지 될 것이라는 보장은 없습니다.
다음과 같은 사실을 매우 명확하게하는 것이 나의 의도 였다고 가정 해 봅시다.
Id
상수 값을 나타내며 (따라서 안전하게 캐시 될 수 있음)IsInvalidated
IX
객체 의 수명 동안 값을 변경할 수 있으므로 캐시하지 않아야합니다.
interface IX
계약을 충분히 명시 적으로 수정 하려면 어떻게 해야합니까?
해결책에 대한 세 가지 시도 :
인터페이스는 이미 잘 설계되었습니다. 호출 된 메소드가
Invalidate()
있으면 프로그래머는 유사한 이름의 특성 값IsInvalidated
이 영향을받을 수 있음 을 유추 할 수 있습니다.이 인수는 메서드와 속성의 이름이 비슷한 경우에만 사용됩니다.
이벤트로이 인터페이스를 보강하십시오
IsInvalidatedChanged
.bool IsInvalidated { get; } event EventHandler IsInvalidatedChanged;
a의 존재
…Changed
에 대한 이벤트IsInvalidated
이 속성 값을 변경할 수 있습니다 상태 등에 대한 유사한 이벤트의 부재는Id
그 속성 값을 변경하지 않을 것을 약속합니다.나는이 솔루션을 좋아하지만 전혀 사용되지 않을 수있는 많은 추가 자료입니다.
속성
IsInvalidated
을 메소드로 바꾸십시오IsInvalidated()
:bool IsInvalidated();
이것은 너무 미묘한 변화 일 수 있습니다. 값이 매번 새로 계산됨을 암시해야합니다. 상수 인 경우에는 필요하지 않습니다. MSDN 항목 "속성과 방법 선택"에 대해 다음과 같이 설명합니다.
다음과 같은 상황에서는 속성 대신 메서드를 사용하십시오. […] 연산은 매개 변수가 변경되지 않더라도 호출 될 때마다 다른 결과를 반환합니다.
어떤 답변을 기대합니까?
나는 문제에 대한 완전히 다른 해결책과 그들이 나의 위의 시도를 어떻게 이겼는지에 대한 설명에 가장 관심이 있습니다.
내 시도에 논리적으로 결함이 있거나 아직 언급되지 않은 중대한 단점이있어 하나의 솔루션 만 남아 있거나 내가없는 곳이 어디인지 듣고 싶습니다.
결함이 경미하고이를 고려한 후 둘 이상의 솔루션이 남아있는 경우 의견을 말하십시오.
최소한 어떤 솔루션을 선호하는지, 어떤 이유로 어떤 피드백을 받고 싶습니다.
class Foo : IFoo { private bool isInvalidated; public bool IsInvalidated { get { return isInvalidated; } } public void Invalidate() { isInvalidated = true; } }
InvalidStateException
예를 들어 , 우리는 예를 들어 걱정할 필요가 없지만 이것이 이론적으로 가능한지 확실하지 않습니다. 그래도 좋을 것입니다.
IsInvalidated
필요 하지 않습니다private set
?