ไม่มีสองวิธีเกี่ยวกับเรื่องนี้ คำแนะนำของ ReSharper และคุณสมบัติที่มีประโยชน์หลายอย่างของ C # จะไม่ถูกใช้บ่อยถ้าคุณเขียนการทดสอบแบบปรมาณูแบบแยกหน่วยสำหรับรหัสทั้งหมดของคุณ
ตัวอย่างเช่นหากคุณมีวิธีการแบบคงที่และคุณต้องเริ่มต้นด้วยวิธีนี้คุณจะไม่สามารถทำได้เว้นแต่ว่าคุณจะใช้เฟรมเวิร์กการแยกโปรไฟล์ตามโปรไฟล์ วิธีแก้ปัญหาที่เข้ากันได้กับการโทรคือการเปลี่ยนด้านบนของวิธีการใช้สัญกรณ์แลมบ์ดา ตัวอย่างเช่น:
ก่อน:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
หลังจาก:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
ทั้งสองเข้ากันได้กับการโทร ผู้โทรไม่จำเป็นต้องเปลี่ยน ร่างกายของฟังก์ชั่นยังคงเหมือนเดิม
จากนั้นในรหัสการทดสอบหน่วยของคุณคุณสามารถทำให้การโทรนี้เป็นเช่นนั้นได้ (สมมติว่ามันอยู่ในคลาสที่เรียกว่าฐานข้อมูล):
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
โปรดใช้ความระมัดระวังในการแทนที่ด้วยค่าดั้งเดิมหลังจากเสร็จสิ้น คุณสามารถทำได้ผ่านการลอง / ในที่สุดหรือในการล้างหน่วยการทดสอบของคุณสิ่งที่ถูกเรียกหลังจากการทดสอบทุกครั้งให้เขียนโค้ดเช่นนี้
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
ซึ่งจะเรียกใช้ initializer คงที่ของคลาสของคุณอีกครั้ง
แลมบ์ดาฟันซ์ไม่ได้รับการสนับสนุนมากมายเหมือนวิธีการคงที่ทั่วไปดังนั้นวิธีนี้จึงมีผลข้างเคียงที่ไม่พึงประสงค์ดังต่อไปนี้:
- หากวิธีสแตติกเป็นวิธีส่วนขยายคุณต้องเปลี่ยนเป็นวิธีที่ไม่ใช่ส่วนขยายก่อน Resharper สามารถทำสิ่งนี้ให้คุณโดยอัตโนมัติ
- ถ้าชนิดข้อมูลใด ๆ ของวิธีการแบบคงที่มีแอสเซมบลีที่ฝังตัว interop เช่นสำหรับ Office คุณต้องตัดวิธีการตัดคำชนิดหรือเปลี่ยนเป็นชนิด 'วัตถุ'
- คุณไม่สามารถใช้เครื่องมือการเปลี่ยนโครงสร้างการเปลี่ยนลายเซ็นของ Resharper ได้อีกต่อไป
แต่สมมุติว่าคุณหลีกเลี่ยงสถิตยศาสตร์ทั้งหมดและคุณแปลงมันเป็นวิธีอินสแตนซ์ มันยังคงไม่สามารถล้อเลียนได้เว้นแต่ว่าวิธีการนั้นเป็นเสมือนจริงหรือถูกนำไปใช้เป็นส่วนหนึ่งของส่วนต่อประสาน
ดังนั้นในความเป็นจริงใครก็ตามที่แนะนำวิธีการแก้ไขวิธีการแบบคงที่คือการทำให้พวกเขาเป็นตัวอย่างวิธีพวกเขาก็จะต่อต้านวิธีการอินสแตนซ์ที่ไม่ได้เสมือนหรือเป็นส่วนหนึ่งของอินเตอร์เฟซ
เหตุใด C # จึงมีวิธีคงที่ ทำไมจึงอนุญาตให้ใช้วิธีการที่ไม่ใช่เสมือนได้
หากคุณใช้ "ฟีเจอร์" เหล่านี้คุณจะไม่สามารถสร้างวิธีแยกได้
แล้วคุณจะใช้มันเมื่อไหร่?
ใช้รหัสดังกล่าวที่คุณไม่ต้องการให้ใครออกไป ตัวอย่าง: เมธอด Format () ของคลาส String วิธี WriteLine () ของคลาส Console เมธอด Cosh () ของคลาส Math
และอีกสิ่งหนึ่ง .. คนส่วนใหญ่ไม่สนใจเรื่องนี้ แต่ถ้าคุณทำได้เกี่ยวกับประสิทธิภาพของการโทรทางอ้อมนั่นเป็นอีกเหตุผลหนึ่งที่หลีกเลี่ยงวิธีการแบบอินสแตนซ์ มีหลายกรณีที่มันเป็นผลการดำเนินงาน นั่นเป็นเหตุผลที่มีวิธีการที่ไม่ใช่เสมือนอยู่ในสถานที่แรก