การไตร่ตรองโดยเฉพาะกับสมาชิกส่วนตัวนั้นผิด
- การสะท้อนการแบ่งความปลอดภัยประเภท คุณสามารถลองเรียกใช้วิธีการที่ไม่มีอยู่ (อีกต่อไป) หรือด้วยพารามิเตอร์ที่ไม่ถูกต้องหรือมีพารามิเตอร์มากเกินไปหรือไม่เพียงพอ ... หรือแม้กระทั่งในลำดับที่ไม่ถูกต้อง โดยวิธีการคืนชนิดสามารถเปลี่ยนแปลงได้เช่นกัน
- การสะท้อนกลับช้า
สมาชิกส่วนบุคคลสะท้อนให้เห็นถึงการทำลายหลักการห่อหุ้มและทำให้เปิดเผยรหัสของคุณต่อไปนี้:
- เพิ่มความซับซ้อนของรหัสของคุณเพราะมันจะต้องจัดการกับพฤติกรรมภายในของชั้นเรียน สิ่งที่ถูกซ่อนอยู่ควรจะถูกซ่อนไว้
- ทำให้โค้ดของคุณแตกง่ายเนื่องจากจะรวบรวม แต่จะไม่ทำงานหากวิธีเปลี่ยนชื่อ
- ทำให้รหัสส่วนตัวง่ายต่อการแตกเพราะถ้ามันเป็นแบบส่วนตัวมันไม่ได้ตั้งใจจะเรียกว่าเป็นอย่างนั้น บางทีวิธีส่วนตัวคาดว่าสถานะภายในบางอย่างก่อนที่จะถูกเรียก
ถ้าฉันต้องทำยังไงล่ะ
มีหลายกรณีที่เมื่อคุณต้องพึ่งพาบุคคลที่สามหรือคุณไม่ต้องการมี api บางส่วนคุณต้องทำการไตร่ตรองบ้าง บางคนใช้เพื่อทดสอบบางคลาสที่พวกเขาเป็นเจ้าของ แต่พวกเขาไม่ต้องการเปลี่ยนอินเทอร์เฟซเพื่อให้เข้าถึงสมาชิกภายในเพียงเพื่อทำการทดสอบ
ถ้าคุณทำมันถูกต้อง
เพื่อลดปัญหาการแตกหักที่ง่ายที่สุดวิธีที่ดีที่สุดคือการตรวจหาการหยุดพักที่อาจเกิดขึ้นได้โดยการทดสอบในการทดสอบหน่วยที่จะทำงานในการสร้างการรวมต่อเนื่องหรือ แน่นอนมันหมายความว่าคุณจะใช้แอสเซมบลีเดียวกันเสมอ (ซึ่งประกอบด้วยสมาชิกส่วนตัว) หากคุณใช้การโหลดและการสะท้อนแบบไดนามิกคุณชอบเล่นด้วยไฟ แต่คุณสามารถรับข้อยกเว้นที่การโทรอาจสร้างได้
- บรรเทาความเชื่องช้าของการสะท้อน:
ใน. Net Framework เวอร์ชันล่าสุด CreateDelegate จะได้รับผลกระทบจากปัจจัย 50 ที่ MethodInfo เรียกใช้:
// The following should be done once since this does some reflection
var method = this.GetType().GetMethod("Draw_" + itemType,
BindingFlags.NonPublic | BindingFlags.Instance);
// Here we create a Func that targets the instance of type which has the
// Draw_ItemType method
var draw = (Func<TInput, Output[]>)_method.CreateDelegate(
typeof(Func<TInput, TOutput[]>), this);
draw
การโทรจะเร็วกว่าประมาณ 50 เท่าเมื่อMethodInfo.Invoke
ใช้งานdraw
ตามมาตรฐานFunc
เช่นนั้น:
var res = draw(methodParams);
ตรวจสอบโพสต์ของฉันนี้เพื่อดูเกณฑ์มาตรฐานในวิธีการขอร้องที่แตกต่างกัน