ฉันควรโยนข้อยกเว้นจากตัวสร้าง?


46

ฉันรู้ว่าฉันสามารถโยนข้อยกเว้นจากตัวสร้างใน PHP แต่ฉันควรทำอย่างไร ตัวอย่างเช่นหากค่าของพารามิเตอร์ไม่เป็นไปตามที่ฉันคาดไว้

หรือฉันควรเลื่อนการยกเว้นออกไปจนกว่าจะมีการเรียกใช้เมธอด ข้อดีและข้อเสียของทั้งสองกรณีคืออะไร


คำถามคือคุณต้องการให้ผู้ใช้ของคุณเห็นข้อความข้อผิดพลาดข้อยกเว้นน่าเกลียด?

15
@ LawrenceCherone ไม่นั่นไม่ใช่คำถาม ไม่ใช่เลย. คำถามคือว่าจะยกข้อยกเว้นทันทีเมื่อ ctor ไม่สามารถตั้งค่าวัตถุให้อยู่ในสถานะที่ถูกต้องจากการขัดแย้งที่ส่งผ่านไปหรือเพื่อเลื่อนว่าจนกว่าวิธีการดำเนินการกับอินสแตนซ์ที่มีสถานะที่ไม่ถูกต้องที่เป็นไปได้ เหมาะกว่าสำหรับโปรแกรมเมอร์

4
@ LawrenceCherone คุณพูดถูก ไม่ควรมีซอฟต์แวร์ใดล้มเหลวโดยเจตนา มันควรดำเนินต่อไปและดูว่าเกิดอะไรขึ้น / s
user253751

@immibis การถากถางที่ดีเป็นสิ่งที่ดี
kodeart

นี่เป็นคำถามที่ยอดเยี่ยม !!! ฉันไม่เคยแม้แต่จะพิจารณาแนวคิดนี้จนกระทั่งวันนี้
Rhys Johns

คำตอบ:


75

ทำไมคุณเลื่อนการยกเว้นออกไป

หากคุณรู้ว่าวัตถุนั้นไม่สามารถสร้างอินสแตนซ์ของพารามิเตอร์ที่กำหนดได้อย่างถูกต้องคุณควรทำการยกเว้น

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

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


21

หากคอนสตรัคของคุณถูกเรียกใช้ด้วยพารามิเตอร์ที่ไม่ดีคุณควร (ต้อง?) แสดงข้อยกเว้น หากคุณไม่ทำเช่นนั้นคุณอาจได้รับวัตถุที่ไม่ดีซึ่งจะไม่ทำงานตามที่คาดไว้


17

แน่นอน !!

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

มันจะดีกว่าเสมอ"FAIL FAST and FAIL EARLY"


7

ฉันรู้ว่าฉันสามารถโยนข้อยกเว้นจากตัวสร้างใน PHP แต่ฉันควรทำอย่างไร

นั่นเป็นวิธีเดียวที่มีเหตุผลที่จะแจ้งว่าการก่อสร้างวัตถุล้มเหลว


2

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

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

แค่ความเห็นของฉัน PHP ให้อิสระมากมาย - สนุกได้เลย!


ฉันไม่แน่ใจว่าทำไมคำตอบนี้จึงลดลง มันให้วิธีการที่ถูกต้องโดยใช้การตรวจสอบความถูกต้องของพารามิเตอร์ก่อนการสร้างวัตถุ ( วิธี "ยาม" ) ซึ่งเป็นวิธีที่ดีในการออกแบบคลาส / ฟังก์ชั่นของคุณสำหรับกฎเฉพาะ หากยังไม่ได้คำตอบตรงคำถาม OP แต่ก็ยังคงเป็นคำแนะนำที่ดี :)
kodeart
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.