私が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構造よりも明確であり、メソッドが行っているコントラクトを壊すことはありません。
「通常のプログラムフローではそれらを使用しないでください」という私見は、誰もが持っていると思われる反応は、その反応の強さが正当化できるほど十分に構築されているわけではありません。
それとも私は間違っていますか?
私は他の投稿を読んで、あらゆる種類の特別なケースを扱っていますが、両方の人がいれば、何も問題はありません。
- 晴れ
- メソッドの契約を尊重する
私を撃つ。
if
ください。これは非常に難しいでしょう。言い換えると、あなたの前提には欠陥があり、そこから引き出す結論は間違っています。