ความแตกต่างระหว่างตัวเรือนแบบขอบมุมแบบตัวพิมพ์ฐานและแบบเส้นขอบมีความแตกต่างกันอย่างไร


86

ฉันไม่ใช่เจ้าของภาษา ในภาษาของฉันฉันรู้ถึงคำศัพท์บางคำที่ใช้อ้างถึงเงื่อนไขที่ตรวจสอบเพื่อหยุดการเรียกซ้ำและเงื่อนไขที่ตรวจสอบสำหรับกรณีที่รุนแรงไม่น่าจะเป็นไปได้ ในภาษาอังกฤษฉันเจอคำว่า "edge case", "corner case", "boundary case" และ "base case" แต่ฉันไม่สามารถเข้าใจความแตกต่างได้และใช้เพื่ออ้างอิงถึงสิ่งใด ฉันชอบที่จะสรุปความแตกต่างระหว่างพวกเขา

โดยเฉพาะอย่างยิ่งฉันจะมีความสุขมากถ้าใครบางคนสามารถให้คำอธิบายประกอบสำหรับบรรทัดในตัวอย่างรหัสต่อไปนี้:

    int transmogrify(int n) {
1.      assert(n <= 1000000);
2.      if (n < 0) return -1;
3.      if (n == 1000000) return PRE_CALC;
4.      if (n == 0) return n+1;            // For stopping the recursion
5.      if (n == 1251) return 3077;
        return transmogrify(n-1);
    }

ฉันคิดว่ามัน:

  1. ตรวจสติ
  2. ตรวจสอบอินพุต
  3. กรณีเขตแดน กรณีขอบ? กรณีมุม?
  4. กรณีฐาน? กรณีเขตแดน
  5. กรณีมุม? กรณีขอบ?

4
ฉันเชื่อว่าขอบและขอบเขตโดยทั่วไปแล้วจะเหมือนกัน แต่พวกเขาอ้างถึงการทดสอบไม่ใช่การตรวจสอบเงื่อนไขในรหัส
Richard

@ การทดสอบริชาร์ดไม่ได้รหัส? นั่นไม่ใช่ความเข้าใจของฉัน - คุณมีการอ้างอิงเพื่อสนับสนุนความจริงที่ว่าคุณเชื่อว่าข้อกำหนดเหล่านี้ใช้ไม่ได้กับรหัสหรือไม่?
แบรดโธมัส

คำตอบ:


94

ฉันไม่ได้เป็นเจ้าของภาษาอังกฤษเช่นกัน แต่ตาม Wikipedia:

  • กรณีขอบเกิดขึ้นที่พารามิเตอร์การดำเนินงานมาก (สูงสุดหรือต่ำสุด)
  • กรณีมุมเกิดขึ้นนอกพารามิเตอร์ปฏิบัติการปกติโดยเฉพาะเมื่อตัวแปรสภาพแวดล้อมหรือเงื่อนไขหลายอย่างพร้อมกันในระดับมากถึงแม้ว่าแต่ละพารามิเตอร์จะอยู่ในช่วงที่ระบุสำหรับพารามิเตอร์นั้น ("พารามิเตอร์การทำงานภายนอกปกติ" อย่างชัดเจนหมายถึงบางสิ่งบางอย่างเช่น "การใช้งานร่วมกันโดยทั่วไปของพารามิเตอร์การทำงาน" ไม่ใช่อย่างเคร่งครัด "ภายนอกพารามิเตอร์การทำงานที่ได้รับอนุญาต" นั่นคือคุณยังคงอยู่ในพื้นที่พารามิเตอร์ที่ถูกต้อง
  • กรณีเขตแดนเกิดขึ้นเมื่อหนึ่งในอินพุตอยู่ที่หรือเกินขีด จำกัด สูงสุดหรือต่ำสุด
  • กรณีพื้นฐานคือที่การเรียกซ้ำสิ้นสุดลง

ดังนั้นระบบการตั้งชื่อดูเหมือนจะสับสนโดยสิ้นเชิงแม้ว่าตัวพิมพ์มุมจะหมายถึงบางสิ่งที่แตกต่างกันเล็กน้อย (การรวมกันของค่า) มากกว่ากรณีแบบขอบและขอบเขตซึ่งเป็นคำพ้องความหมายแน่นอน มันอาจจะปลอดภัยที่จะพูดว่ากรณีมุมขอบและขอบเขตเป็นสิ่งเดียวกันในการพูดทั่วไป บางคนอาจพูดถึงสิ่งที่แตกต่างกันไปในแต่ละคน แต่ก็ไม่ค่อยมีข้อตกลงร่วมกัน

1) และ 2) เป็นสิ่งที่คุณเขียน 3) เป็นกรณีขอบ / ขอบเขต 4) เป็นกรณีพื้นฐานและ 5) เป็นกรณีพิเศษ


นี่เป็นคำตอบที่มีประโยชน์มากในการเข้าใจแนวคิดเบื้องหลังคำศัพท์ทางเทคนิคแต่ละคำ
Jignesh Fadadu

25

สิ่งที่คุณจะใช้อธิบายการทดสอบนั้นขึ้นอยู่กับความหมาย (ความหมาย) ของการทดสอบไม่ใช่รหัสที่แน่นอน - ในตัวอย่างที่ให้มานั้นไม่ได้มีความชัดเจนในตัวอย่างที่ให้มา นั่นคือวิธีที่ฉันเข้าใจพวกเขา:

  • การตรวจสอบสติ = สิ่งนี้สมเหตุสมผลหรือไม่ ตัวอย่างเช่นหากแอปพลิเคชันของคุณแสดงเฉพาะจำนวนเต็มsqrt(-1)และlog(-1)ไม่ได้กำหนด
  • ตรวจสอบอินพุต = ทดสอบอินพุตของผู้ใช้ซึ่งตรงข้ามกับโครงสร้างข้อมูลภายในบางส่วนหรือเอาต์พุตของฟังก์ชัน ยกตัวอย่างเช่นในทุบตี[ $# -gt 0 ]ตรวจสอบว่าคุณมีพารามิเตอร์สำหรับการป้อนอย่างน้อยหนึ่งซึ่งก็อาจจะมีการตรวจสอบสุขภาพจิตสำหรับคำสั่งเหมือนหรือfindmail
  • ขอบ / ขอบเขตการตรวจสอบ = ค่าสูงสุดหรือการป้อนข้อมูลขั้นต่ำซึ่งคาดว่าจะผลิตออกที่ถูกต้อง ตัวอย่างเช่นฟังก์ชั่นที่เพิ่งเพิ่มไปยังหมายเลขหนึ่งจะมีช่วงการใช้งานตั้งแต่ <MIN_INT> ถึง <MAX_INT> - 1 เนื่องจากอินพุตที่เล็กกว่า <MIN_INT> จะไม่สามารถให้ได้โดยผู้ใช้และผลผลิตที่มากกว่า <MAX_INT> จะไม่เป็นประโยชน์
  • การตรวจสอบตัวพิมพ์ของมุม = การตรวจสอบขอบเขตที่ซับซ้อนมากขึ้น (มุมคือขอบเขตสองมิติ) ตัวอย่างเช่นการรวม <MIN_INT> และ <MAX_INT> ในการคำนวณ
  • กรณีการตรวจสอบพิเศษ = ไม่ชัดเจนไม่ใช่ขอบเขตค่าพิเศษlog(1 + the smallest floating point number)เช่น

nit ที่ไม่ซับซ้อน: logₑ-1 คือiπ ในไพ ธ อนimport cmath; assert(cmath.log(-1) == 3.141592653589793j)
Bob Stein
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.