เพื่อหลีกเลี่ยงคำตอบมาตรฐานทั้งหมดที่ฉันสามารถใช้กับ Google ฉันจะให้ตัวอย่างที่คุณทุกคนสามารถโจมตีได้
C # และ Java (และอื่น ๆ อีกมากมายเกินไป) มีกับความอุดมสมบูรณ์ของประเภทบางส่วนของ 'ล้น' พฤติกรรมฉันไม่ชอบที่ทุกคน (เช่นtype.MaxValue + type.SmallestValue == type.MinValue
ตัวอย่างเช่น: int.MaxValue + 1 == int.MinValue
)
แต่เมื่อเห็นลักษณะที่ชั่วร้ายของฉันฉันจะเพิ่มการดูถูกการบาดเจ็บนี้โดยการขยายพฤติกรรมนี้ไปให้สมมุติDateTime
ประเภทOverridden (ฉันรู้ว่า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.
}
}
แน่นอนว่าถ้าสามารถแก้ปัญหานี้ได้อย่างง่ายดาย แต่ความจริงก็คือฉันยังไม่ได้เห็นสาเหตุที่คุณไม่สามารถใช้ข้อยกเว้นได้ (ตามหลักเหตุผลคือฉันสามารถเห็นได้ว่าเมื่อประสิทธิภาพเป็นปัญหาที่ในบางกรณีควรหลีกเลี่ยงข้อยกเว้น )
ฉันคิดว่าในหลาย ๆ กรณีพวกเขามีความชัดเจนมากกว่าถ้าโครงสร้างและไม่ทำลายสัญญาใด ๆ วิธีการทำ
IMHO ปฏิกิริยา“ อย่าใช้มันสำหรับการไหลเวียนของโปรแกรมปกติ” ทุกคนดูเหมือนว่าจะไม่ได้รับการพัฒนาอย่างดีเนื่องจากความแข็งแกร่งของปฏิกิริยานั้นสามารถพิสูจน์ได้
หรือฉันเข้าใจผิด?
ฉันได้อ่านโพสต์อื่น ๆ ที่เกี่ยวข้องกับกรณีพิเศษทุกประเภท แต่ประเด็นของฉันคือไม่มีอะไรผิดถ้าคุณทั้งคู่:
- ชัดเจน
- ทำตามสัญญาของวิธีการของคุณ
ยิงฉัน.
if
คำสั่งการจัดทำเอกสารด้วยตนเองที่สั้นกว่ามาก คุณจะพบว่ามันยากมาก กล่าวอีกนัยหนึ่ง: หลักฐานของคุณมีข้อบกพร่องและข้อสรุปที่คุณดึงออกมานั้นผิดไป