การเข้าถึงเริ่มต้นไม่ได้ทำให้ตัวดัดแปลงการเข้าถึงส่วนตัวซ้ำซ้อน
ตำแหน่งนักออกแบบภาษาที่ปรากฏในบทช่วยสอนอย่างเป็นทางการ - การควบคุมการเข้าถึงสมาชิกของชั้นเรียนและค่อนข้างชัดเจน (เพื่อความสะดวกของคุณคำสั่งที่เกี่ยวข้องในเครื่องหมายคำพูดทำให้เป็นตัวหนา ):
เคล็ดลับในการเลือกระดับการเข้าถึง:
หากโปรแกรมเมอร์คนอื่นใช้คลาสของคุณคุณต้องการให้แน่ใจว่าข้อผิดพลาดจากการใช้ผิดประเภทจะไม่เกิดขึ้น ระดับการเข้าถึงสามารถช่วยคุณทำสิ่งนี้ได้
- ใช้ระดับการเข้าถึงที่ จำกัด ที่สุดที่เหมาะสมสำหรับสมาชิกบางราย ใช้ส่วนตัวเว้นแต่คุณจะมีเหตุผลที่ดีที่จะไม่
- หลีกเลี่ยงช่องสาธารณะยกเว้นค่าคงที่ (ตัวอย่างมากมายในบทช่วยสอนใช้เขตข้อมูลสาธารณะซึ่งอาจช่วยให้เห็นบางจุดที่ชัดเจน แต่ไม่แนะนำสำหรับรหัสการผลิต) เขตข้อมูลสาธารณะมักจะเชื่อมโยงคุณกับการใช้งานเฉพาะและจำกัดความยืดหยุ่นในการเปลี่ยนรหัสของคุณ
การอุทธรณ์ของคุณต่อความสามารถในการทดสอบเพื่อเป็นเหตุผลในการทำให้ตัวดัดแปลงส่วนบุคคลสมบูรณ์นั้นไม่ถูกต้องตามหลักฐานที่เห็นได้จากคำตอบในใหม่ถึง TDD ฉันควรหลีกเลี่ยงวิธีการส่วนตัวตอนนี้หรือไม่
แน่นอนคุณสามารถมีวิธีส่วนตัวและแน่นอนคุณสามารถทดสอบได้
ทั้งสองมีบางวิธีที่จะได้รับวิธีการส่วนตัวถึงระยะซึ่งในกรณีนี้คุณสามารถทดสอบมันเป็นอย่างนั้นหรือมีไม่มีทางที่จะได้รับส่วนตัวในการทำงานซึ่งในกรณี: ทำไม heck คุณพยายามที่จะทดสอบเพียง ลบสิ่งแช่ง ...
ตำแหน่งของนักออกแบบภาษากับวัตถุประสงค์การใช้งานและการเข้าถึงระดับแพ็กเกจจะมีการอธิบายในอีกอย่างเป็นทางการกวดวิชา, การสร้างและการใช้แพคเกจและมีอะไรที่เหมือนกันกับความคิดของการวางปรับเปลี่ยนเอกชน (เพื่อความสะดวกของคำสั่งที่เกี่ยวข้องในใบเสนอราคาที่ทำตัวหนา ) :
คุณควรรวมคลาสเหล่านี้และอินเทอร์เฟซในแพคเกจด้วยเหตุผลหลายประการรวมถึงต่อไปนี้:
- คุณและโปรแกรมเมอร์คนอื่น ๆ สามารถระบุได้อย่างง่ายดายว่าประเภทเหล่านี้เกี่ยวข้อง ...
- คุณสามารถอนุญาตประเภทภายในแพ็คเกจให้เข้าถึงแบบไม่ จำกัด ซึ่งกันและกัน แต่ยัง จำกัด การเข้าถึงประเภทนอกแพ็คเกจ ...
<พูดจาโผงผาง "ฉันคิดว่าฉันได้ยินเสียงครวญครางพอเดาว่าถึงเวลาที่จะพูดเสียงดังและชัดเจน ... ">
วิธีการแบบส่วนตัวมีประโยชน์ต่อการทดสอบหน่วย
หมายเหตุด้านล่างอนุมานว่าคุณมีความคุ้นเคยกับความคุ้มครองรหัส ถ้าไม่ใช้เวลาในการเรียนรู้เนื่องจากมันค่อนข้างมีประโยชน์สำหรับผู้ที่สนใจในการทดสอบหน่วยและในการทดสอบเลย
เอาล่ะดังนั้นฉันจึงมีวิธีส่วนตัวและการทดสอบหน่วยและการวิเคราะห์ความครอบคลุมบอกฉันว่ามีช่องว่างวิธีส่วนตัวของฉันไม่ได้รับการทดสอบ ตอนนี้ ...
ฉันจะได้อะไรจากการรักษาความเป็นส่วนตัว
เนื่องจากเมธอดเป็นไพรเวตวิธีเดียวที่จะดำเนินการต่อคือการศึกษาโค้ดเพื่อเรียนรู้วิธีใช้งานผ่าน API ที่ไม่ใช่ไพรเวต โดยทั่วไปแล้วการศึกษาดังกล่าวแสดงให้เห็นว่าเหตุผลของช่องว่างคือสถานการณ์การใช้งานเฉพาะที่ขาดหายไปในการทดสอบ
void nonPrivateMethod(boolean condition) {
if (condition) {
privateMethod();
}
// other code...
}
// unit tests don't invoke nonPrivateMethod(true)
// => privateMethod isn't covered.
เพื่อความสมบูรณ์เหตุผลอื่น ๆ (ไม่บ่อย) สำหรับช่องว่างการรายงานข่าวดังกล่าวอาจเป็นข้อบกพร่องในสเปค / การออกแบบ ฉันจะไม่ดำดิ่งลึกลงไปในสิ่งเหล่านี้ที่นี่เพื่อให้สิ่งต่าง ๆ เรียบง่าย; พอเพียงที่จะบอกว่าถ้าคุณอ่อนแอข้อ จำกัด การเข้าถึง "เพียงเพื่อให้วิธีการทดสอบ" คุณจะพลาดโอกาสที่จะเรียนรู้ว่าข้อบกพร่องเหล่านี้มีอยู่ทั้งหมด
ได้ดีเพื่อแก้ไขช่องว่างฉันเพิ่มการทดสอบหน่วยสำหรับสถานการณ์ที่ขาดหายไปการวิเคราะห์ความครอบคลุมซ้ำและยืนยันว่าช่องว่างหายไป ตอนนี้ฉันมีอะไร ฉันได้รับการทดสอบหน่วยใหม่สำหรับการใช้งานเฉพาะของ API ที่ไม่ใช่ส่วนตัว
การทดสอบใหม่ช่วยให้มั่นใจได้ว่าพฤติกรรมที่คาดหวังสำหรับการใช้งานนี้จะไม่เปลี่ยนแปลงหากไม่มีการแจ้งให้ทราบเนื่องจากมีการเปลี่ยนแปลงการทดสอบจะล้มเหลว
ผู้อ่านภายนอกอาจตรวจสอบการทดสอบนี้และเรียนรู้ว่าควรใช้และประพฤติตัวอย่างไร (ที่นี่ผู้อ่านภายนอกจะรวมตัวตนในอนาคตของฉันด้วยเนื่องจากฉันมักจะลืมรหัสหนึ่งหรือสองเดือนหลังจากที่ฉันทำเสร็จ)
การทดสอบใหม่มีความทนทานต่อการปรับโครงสร้างใหม่ (ฉันจะปรับวิธีส่วนตัวหรือไม่คุณเดิมพัน!) ไม่ว่าฉันจะทำอะไรprivateMethod
ฉันจะต้องทดสอบnonPrivateMethod(true)
เสมอ ไม่ว่าฉันจะทำอะไรprivateMethod
จะไม่จำเป็นต้องแก้ไขการทดสอบเพราะวิธีการไม่ได้ถูกเรียกใช้โดยตรง
ไม่เลว? พนันได้เลย.
ฉันทำอะไรหลวมจากข้อ จำกัด การเข้าถึงที่ลดลง
ทีนี้ลองนึกว่าแทนที่จะเป็นเรื่องข้างต้นฉันแค่ จำกัด การเข้าถึง exPrivateMethod
ฉันข้ามการศึกษาของรหัสที่ใช้วิธีการและดำเนินการตรงกับการทดสอบที่จะเรียกฉัน ที่ดี? ไม่!
ฉันจะได้รับการทดสอบสำหรับการใช้งานเฉพาะของ API ที่ไม่ใช่ส่วนตัวดังกล่าวข้างต้นหรือไม่ ไม่: ไม่มีการทดสอบมาnonPrivateMethod(true)
ก่อนและไม่มีการทดสอบดังกล่าวในขณะนี้
ผู้อ่านภายนอกได้รับโอกาสที่จะเข้าใจการใช้งานของชั้นเรียนดีขึ้นหรือไม่ ไม่"- เฮ้จุดประสงค์ของวิธีทดสอบที่นี่คืออะไร - ลืมมันเป็นวิธีการใช้ภายในอย่างเคร่งครัด - โอ๊ะโอ"
ทนต่อการเปลี่ยนโครงสร้างใหม่ได้หรือไม่ ไม่มีทาง: สิ่งที่ฉันเปลี่ยนexPrivateMethod
มีแนวโน้มที่จะทำลายการทดสอบ เปลี่ยนชื่อรวมเข้ากับวิธีอื่นเปลี่ยนการโต้แย้งและการทดสอบจะหยุดรวบรวม ปวดหัว? พนันได้เลย!
ข้อสรุปการผสานกับวิธีการส่วนตัวทำให้ฉันได้รับการปรับปรุงที่มีประโยชน์และเชื่อถือได้ในการทดสอบหน่วย ในทางตรงกันข้ามการ จำกัด การเข้าถึง "สำหรับการทดสอบ" นั้นทำให้ฉันมีความคลุมเครือและยากที่จะเข้าใจรหัสการทดสอบซึ่งเป็นความเสี่ยงถาวรที่จะถูกทำลายโดยการปรับเปลี่ยนเล็กน้อย ตรงไปตรงมาในสิ่งที่ผมได้รับมีลักษณะหวาดระแวงเช่นหนี้ทางเทคนิค
</ พูดจาโผงผาง>