Googled에 대한 모든 표준 답변을 피하기 위해 모든 사람이 마음대로 공격 할 수있는 예를 제공합니다.
C #과 Java (및 너무 많은 다른 것)에는 내가 좋아하지 않는 '오버플로'동작이 많이 있습니다 (예 type.MaxValue + type.SmallestValue == type.MinValue
: int.MaxValue + 1 == int.MinValue
:).
그러나 내 악의적 인 성격을 보았을 때이 행동을 확장 하여이 부상에 모욕을 더할 것 DateTime
입니다. (나는 DateTime
.NET에서 봉인 된 것을 알고 있지만이 예제를 위해 DateTime이 봉인되지 않았다는 점을 제외하고는 C #과 유사한 의사 언어를 사용하고 있습니다.)
재정의 된 Add
방법 :
/// <summary>
/// Increments this date with a timespan, but loops when
/// the maximum value for datetime is exceeded.
/// </summary>
/// <param name="ts">The timespan to (try to) add</param>
/// <returns>The Date, incremented with the given timespan.
/// If DateTime.MaxValue is exceeded, the sum wil 'overflow' and
/// continue from DateTime.MinValue.
/// </returns>
public DateTime override Add(TimeSpan ts)
{
try
{
return base.Add(ts);
}
catch (ArgumentOutOfRangeException nb)
{
// calculate how much the MaxValue is exceeded
// regular program flow
TimeSpan saldo = ts - (base.MaxValue - this);
return DateTime.MinValue.Add(saldo)
}
catch(Exception anyOther)
{
// 'real' exception handling.
}
}
물론 if는 이것을 쉽게 해결할 수는 있지만 예외를 사용할 수없는 이유를 알 수 없다는 사실은 여전히 유지됩니다 (논리적으로, 성능이 특정 경우 예외를 피해야하는 문제가 있음을 알 수 있습니다) ).
나는 많은 경우에 그것들이 if 구조보다 명확하고 방법이 만드는 계약을 깨뜨리지 않는다고 생각합니다.
IMHO“정기 프로그램 흐름에는 절대로 사용하지 마십시오”라는 반응은 그 반응의 강도가 정당화 될 수 있기 때문에 제대로 구축되지 않은 것 같습니다.
아니면 내가 착각합니까?
나는 모든 종류의 특별한 경우를 다루는 다른 게시물을 읽었지만, 내 요점은 당신이 둘 다라면 아무런 문제가 없다는 것입니다.
- 명확한
- 방법의 계약을 존중하십시오
날 쏴
if
. 당신은 이것을 매우 어렵다는 것을 알게 될 것입니다. 다시 말해, 당신의 전제에 결함이 있으며, 그로부터 얻은 결론은 잘못되었습니다.