ฉันจำเป็นต้องจัดการกับสถานการณ์ที่วิธีการส่วนตัวถูกเรียกผ่านการสะท้อนกลับหรือไม่?


12

เมื่อมีการสร้างห้องสมุดที่ผมต้องให้แน่ใจว่าวิธีการที่ภาคเอกชนจะต้องทำงานตามที่คาดไว้เมื่อเรียกไม่ได้โดยวิธีการอื่น ๆ ของชั้นเดียวกัน แต่โดยห้องสมุดอื่นผ่านการสะท้อน ?

ตัวอย่างเช่นหากวิธีส่วนตัวprivate DoSomething(int number)คาดว่า:

  • number เป็นจำนวนเต็มบวกที่ไม่เป็นศูนย์และ:
  • ตัวแปรส่วนตัวstring abcไม่ใช่โมฆะและไม่ใช่สตริงว่าง

และสมบูรณ์ล้มเหลวอย่างน่าเกลียดหากทั้งสองเงื่อนไขไม่ตรงกันฉันต้องจัดการกับความล้มเหลวเหล่านั้นแม้ว่าฉันจะรู้ว่าวิธีการทั้งหมดในชั้นเรียนจะกำหนดค่าที่ไม่ว่างเปล่าให้กับการabcโทรก่อนDoSomethingและส่งจำนวนเต็มบวกที่ไม่เป็นศูนย์ให้ วิธี?

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

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


¹เนื่องจากชั้นเรียนได้รับการบันทึกอย่างถูกต้องเนื่องจากมีการทดสอบหน่วยมากพอที่จะตรวจสอบให้แน่ใจว่าผู้พัฒนารายอื่นจะไม่ทำลายวิธีนี้เป็นต้น


คลาสที่ได้รับจะสามารถเรียกวิธีการส่วนตัวได้หรือไม่
oenone

คำตอบ:


16

โดยการทำเครื่องหมายวิธีการของคุณเป็นส่วนตัวคุณได้สร้างความตั้งใจและสัญญาของคุณ โดยการใช้การสะท้อนรหัสลูกค้าสามารถเลือกที่จะทำลายสัญญานี้และดังนั้นจะต้องแบกรับผลที่ตามมา สิ่งเดียวกันนี้เกิดขึ้นกับโปรโตคอลสำหรับสิ่งที่ต้องทำตามกฎการทำงานมิฉะนั้นจะเกิดสิ่งเลวร้ายขึ้น

ปัญหาเดียวกันอาจเกิดขึ้นกับภาษาอื่นเช่น C ++ ที่ฉันเห็นสิ่งต่าง ๆ เช่น

#define private public

โดยสรุป - คุณไม่จำเป็นต้องจัดการกับสถานการณ์เหล่านี้ผู้โทรควรรู้ดีกว่า


3
ฉันเคยเห็นผู้คนส่งคลาสไปที่ (ถ่านที่ไม่ได้ลงชื่อ *) และเขียนโดยตรงไปยังออฟเซ็ตหน่วยความจำของตัวแปรสมาชิกที่พวกเขาต้องการเปลี่ยน ดวงตาของฉันเลือด
Shawn D.

6
ฉันจะเพิ่มว่ามันเป็นไปไม่ได้ที่จะปกป้องชั้นเรียนของคุณจากรหัสพิเศษที่เป็นอันตราย หากคุณจัดการเพื่อป้องกันตัวเองจากการใช้การสะท้อนที่ไม่เหมาะสมใครบางคนจะพบวิธีที่แตกต่างในการทำลายวันของคุณโดยการเขียนทับหน่วยความจำกระบวนการของคุณโดยตรง การป้องกันการเข้ารหัสในที่สุดก็มาถึงจุดที่ผลตอบแทนลดลงและการสะท้อนกลับผ่านจุดนั้นไป
Aaronaught

5

หากใครใช้การสะท้อนเพื่อเรียกวิธีการส่วนตัวของคุณมันเป็นสัญญาณว่ามีคนทำอะไรผิดพลาด ไม่ว่าเขาจะใช้รหัสในแบบที่ไม่ได้ออกแบบมาหรือคุณซ่อนงานภายในมากเกินไปและทำให้ API ไม่ทำงาน

แต่ดูเหมือนว่าคุณยังไม่ถึงขั้นนั้นและพยายามที่จะจองไว้ล่วงหน้า ดังนั้นความคิดเห็นของฉันคือ: ไม่ต้องกังวลกับมัน วิธีการส่วนตัวควรได้รับการพิจารณานอกขอบเขต หากใครบางคนจงใจละเมิดข้อ จำกัด เหล่านั้นก็เป็นปัญหาของพวกเขาหากสิ่งที่ระเบิด


0

มันเป็นความคิดที่ดีเสมอที่จะตรวจสอบตัวแปรที่ไม่ใช่ในท้องถิ่นก่อนที่คุณจะใช้ แต่นอกเหนือจากนั้นฉันไม่ต้องกังวลเกี่ยวกับมัน ดังที่คนอื่น ๆ พูดกันว่าคุณได้กำหนดความตั้งใจไว้แล้วโดยกำหนดวิธีการให้เป็นส่วนตัวตั้งแต่แรก ใครก็ตามที่โทรหาคุณจากนอกชั้นเรียนของคุณจะไม่มีการรับประกันใด ๆ เมื่อทำงานใน Java ฉันไม่ได้ใส่ความเห็น javadoc ในวิธีการส่วนตัวของฉันเพราะฉันไม่ต้องการให้นักพัฒนาคนอื่นรู้ว่าพวกเขาอยู่ที่นั่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.