ฉันได้ยินมาว่าขอแนะนำให้ตรวจสอบข้อโต้แย้งของวิธีการสาธารณะ:
- หนึ่งควรตรวจสอบโมฆะถ้าเขาไม่คาดหวังโมฆะ?
- เมธอดควรตรวจสอบความถูกต้องของพารามิเตอร์หรือไม่
- MSDN - CA1062: ตรวจสอบข้อโต้แย้งของวิธีสาธารณะ (ฉันมีพื้นหลัง. NET แต่คำถามไม่เฉพาะ C #)
แรงจูงใจสามารถเข้าใจได้ หากโมดูลจะถูกใช้ในทางที่ผิดเราต้องการที่จะโยนข้อยกเว้นทันทีแทนที่จะเป็นพฤติกรรมที่คาดเดาไม่ได้
สิ่งที่รบกวนจิตใจฉันคือข้อโต้แย้งที่ผิดไม่ใช่ข้อผิดพลาดเดียวที่สามารถทำได้ในขณะที่ใช้โมดูล นี่คือสถานการณ์ข้อผิดพลาดบางประการที่เราจำเป็นต้องเพิ่มตรรกะการตรวจสอบหากเราทำตามคำแนะนำและไม่ต้องการการเพิ่มระดับข้อผิดพลาด:
- สายเรียกเข้า - อาร์กิวเมนต์ที่ไม่คาดคิด
- สายเรียกเข้า - โมดูลอยู่ในสถานะไม่ถูกต้อง
- โทรภายนอก - ส่งคืนผลลัพธ์ที่ไม่คาดคิด
- การโทรภายนอก - ผลข้างเคียงที่ไม่คาดคิด (การป้อนสองครั้งในโมดูลการโทร, การแยกสถานะการอ้างอิงอื่น ๆ )
ฉันได้ลองคำนึงถึงเงื่อนไขเหล่านี้และเขียนโมดูลง่าย ๆ ด้วยวิธีการหนึ่ง (ขออภัยไม่ใช่ -C # guys):
public sealed class Room
{
private readonly IDoorFactory _doorFactory;
private bool _entered;
private IDoor _door;
public Room(IDoorFactory doorFactory)
{
if (doorFactory == null)
throw new ArgumentNullException("doorFactory");
_doorFactory = doorFactory;
}
public void Open()
{
if (_door != null)
throw new InvalidOperationException("Room is already opened");
if (_entered)
throw new InvalidOperationException("Double entry is not allowed");
_entered = true;
_door = _doorFactory.Create();
if (_door == null)
throw new IncompatibleDependencyException("doorFactory");
_door.Open();
_entered = false;
}
}
ตอนนี้มันปลอดภัย =)
มันค่อนข้างน่าขนลุก แต่ลองจินตนาการดูว่ามันน่าขนลุกในโมดูลจริงด้วยวิธีการนับสิบวิธีที่ซับซ้อนและมีสายภายนอกมากมาย (สวัสดีผู้ชื่นชอบการฉีดพึ่งพา) โปรดทราบว่าหากคุณกำลังเรียกใช้โมดูลที่สามารถแทนที่พฤติกรรม (คลาสที่ไม่มีการปิดผนึกใน C #) แสดงว่าคุณกำลังโทรภายนอกและผลที่ตามมาไม่สามารถคาดเดาได้ในขอบเขตของผู้โทร
สรุปแล้วอะไรคือวิธีที่ถูกต้องและทำไม หากคุณสามารถเลือกจากตัวเลือกด้านล่างโปรดตอบคำถามเพิ่มเติม
ตรวจสอบการใช้งานโมดูลทั้งหมด เราจำเป็นต้องมีการทดสอบหน่วยหรือไม่? มีตัวอย่างของรหัสดังกล่าวหรือไม่ การใช้การฉีดที่ต้องพึ่งพานั้น จำกัด ในการใช้งาน (เนื่องจากจะทำให้ตรรกะการตรวจสอบมากขึ้น)? การย้ายการตรวจสอบเหล่านั้นไปใช้ในการดีบั๊กเป็นจริงหรือไม่?
ตรวจสอบข้อโต้แย้งเท่านั้น จากประสบการณ์ของฉันการตรวจสอบอาร์กิวเมนต์ - โดยเฉพาะการตรวจสอบ null - เป็นการตรวจสอบที่มีประสิทธิภาพน้อยที่สุดเนื่องจากข้อผิดพลาดของอาร์กิวเมนต์มักนำไปสู่ข้อผิดพลาดที่ซับซ้อนและการเพิ่มข้อผิดพลาด เวลาส่วนใหญ่คุณจะได้รับNullReferenceException
บรรทัดถัดไป ดังนั้นทำไมการตรวจสอบการโต้แย้งจึงพิเศษ?
อย่าตรวจสอบการใช้งานโมดูล มันค่อนข้างเป็นความคิดเห็นที่ไม่เป็นที่นิยมคุณช่วยอธิบายได้ไหม