Щоб уникнути всіх стандартних відповідей, які я міг би мати на Google, я наведу приклад, на який ви всі можете напасти на волю.
C # і Java (і надто багато інших) мають багато типів поведінки "переповнення", яка мені зовсім не подобається (наприклад, type.MaxValue + type.SmallestValue == type.MinValue
наприклад int.MaxValue + 1 == int.MinValue
:).
Але, зважаючи на свою порочну природу, я додам деякої образи до цієї травми, розширивши цю поведінку на, скажімо, перекритий DateTime
тип. (Я знаю, що DateTime
це запечатано в .NET, але заради цього прикладу я використовую псевдомову, яка точно схожа на C #, за винятком того, що DateTime не запечатаний).
Перекритий 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
заяву, що самодокументує. Це вам буде дуже важко. Іншими словами: ваша помилка є вашою, і висновки, які ви робите з цього, є помилковими.