ฉันคิดว่าคำตอบทั้งหมดที่อธิบายว่าคุณไม่ควรมีธงที่ควบคุมว่าข้อยกเว้นจะถูกโยนทิ้งหรือไม่ดี คำแนะนำของพวกเขาคือคำแนะนำของฉันสำหรับทุกคนที่รู้สึกต้องการถามคำถามนั้น
อย่างไรก็ตามฉันต้องการชี้ให้เห็นว่ามีข้อยกเว้นที่มีความหมายต่อกฎนี้ เมื่อคุณก้าวหน้าพอที่จะเริ่มพัฒนา API ที่บุคคลอื่นหลายร้อยคนจะใช้จะมีกรณีที่คุณอาจต้องการให้การตั้งค่าสถานะดังกล่าว เมื่อคุณเขียน API คุณไม่เพียง แต่เขียนถึงผู้สอน คุณกำลังเขียนถึงลูกค้าจริงที่มีความต้องการจริง ส่วนหนึ่งของงานคือทำให้ API มีความสุข ที่กลายเป็นปัญหาสังคมแทนที่จะเป็นปัญหาการเขียนโปรแกรมและบางครั้งปัญหาสังคมกำหนดแนวทางแก้ไขซึ่งจะน้อยกว่าอุดมคติในการแก้ปัญหาการเขียนโปรแกรมด้วยตัวเอง
คุณอาจพบว่าคุณมีผู้ใช้สองคนที่แตกต่างกันของ API ของคุณซึ่งหนึ่งในนั้นต้องการข้อยกเว้นและที่ไม่มี ตัวอย่างชีวิตจริงที่อาจเกิดขึ้นได้คือกับห้องสมุดที่ใช้ทั้งในการพัฒนาและในระบบฝังตัว ในสภาพแวดล้อมการพัฒนาผู้ใช้อาจต้องการที่จะมีข้อยกเว้นทุกที่ ข้อยกเว้นเป็นที่นิยมอย่างมากในการจัดการกับสถานการณ์ที่ไม่คาดคิด อย่างไรก็ตามพวกเขาถูกห้ามในสถานการณ์ฝังตัวหลายแห่งเนื่องจากยากต่อการวิเคราะห์ข้อ จำกัด แบบเรียลไทม์ เมื่อคุณสนใจจริง ๆ แล้วไม่ใช่แค่ค่าเฉลี่ยเวลาใช้ในการทำงานของคุณ แต่เวลาที่ใช้สำหรับความสนุกของแต่ละคนความคิดในการคลายสแต็ค ณ ที่ใด ๆ ตามอำเภอใจนั้นเป็นสิ่งที่ไม่พึงปรารถนา
ตัวอย่างชีวิตจริงสำหรับฉัน: ห้องสมุดคณิตศาสตร์ หากห้องสมุดคณิตศาสตร์ของคุณมีVector
คลาสที่รองรับการรับเวกเตอร์หน่วยในทิศทางเดียวกันคุณจะต้องสามารถหารด้วยขนาด หากขนาดเป็น 0 คุณจะมีการหารด้วยศูนย์สถานการณ์ ในการพัฒนาคุณต้องการจับสิ่งเหล่านี้คุณต้องการที่จะจับเหล่านี้คุณไม่ต้องการให้หารด้วยความประหลาดใจของ 0 แขวนอยู่รอบ ๆ การขว้างข้อยกเว้นเป็นวิธีแก้ปัญหายอดนิยมสำหรับเรื่องนี้ มันแทบจะไม่เคยเกิดขึ้นเลย (มันเป็นพฤติกรรมที่ยอดเยี่ยมจริงๆ) แต่เมื่อไหร่ที่คุณต้องการรู้
บนแพลตฟอร์มที่ฝังตัวคุณไม่ต้องการข้อยกเว้นเหล่านั้น มันจะทำให้รู้สึกมากขึ้นในการตรวจสอบif (this->mag() == 0) return Vector(0, 0, 0);
มันจะทำให้รู้สึกมากขึ้นในการทำการตรวจสอบอันที่จริงฉันเห็นสิ่งนี้ในรหัสจริง
ตอนนี้คิดจากมุมมองของธุรกิจ คุณสามารถลองสอนวิธีการใช้ API ได้สองวิธี:
// Development version - exceptions // Embeded version - return 0s
Vector right = forward.cross(up); Vector right = forward.cross(up);
Vector localUp = right.cross(forward); Vector localUp = right.cross(forward);
Vector forwardHat = forward.unit(); Vector forwardHat = forward.tryUnit();
Vector rightHat = right.unit(); Vector rightHat = right.tryUnit();
Vector localUpHat = localUp.unit() Vector localUpHat = localUp.tryUnit();
สิ่งนี้ตอบสนองความคิดเห็นของคำตอบส่วนใหญ่ได้ที่นี่ แต่จากมุมมองของ บริษัท สิ่งนี้ไม่พึงประสงค์ ผู้พัฒนาสมองกลฝังตัวจะต้องเรียนรู้สไตล์เดียวการเขียนโค้ดและผู้พัฒนาจะต้องเรียนรู้อีกแบบหนึ่ง สิ่งนี้ค่อนข้างน่ารำคาญและบังคับให้ผู้คนคิดวิธีหนึ่ง อาจแย่ไปกว่า: คุณจะพิสูจน์ได้อย่างไรว่ารุ่นที่ฝังไว้ไม่มีรหัสข้อยกเว้นการขว้างปา? เวอร์ชันการขว้างปาสามารถผสมผสานกันได้อย่างง่ายดายซ่อนบางแห่งในรหัสของคุณจนกว่าคณะกรรมการตรวจสอบความล้มเหลวที่มีราคาแพงพบว่ามัน
หากในอีกทางหนึ่งคุณมีการตั้งค่าสถานะซึ่งเปิดหรือปิดการจัดการข้อยกเว้นทั้งสองกลุ่มสามารถเรียนรู้วิธีการเข้ารหัสในลักษณะเดียวกัน ในความเป็นจริงในหลายกรณีคุณสามารถใช้รหัสของกลุ่มหนึ่งในโครงการของกลุ่มอื่นได้ ในกรณีที่ใช้รหัสนี้unit()
หากคุณสนใจจริง ๆ ว่าเกิดอะไรขึ้นในการหารด้วย 0 กรณีคุณควรเขียนแบบทดสอบด้วยตัวเอง ดังนั้นหากคุณย้ายมันไปยังระบบฝังตัวที่คุณเพิ่งได้รับผลลัพธ์ที่ไม่ดีพฤติกรรมนั้นก็คือ "สติ" ตอนนี้จากมุมมองทางธุรกิจฉันได้ฝึกอบรมโคเดอร์ของฉันหนึ่งครั้งและพวกเขาใช้ API เดียวกันและสไตล์เดียวกันในทุกส่วนของธุรกิจของฉัน
ในกรณีส่วนใหญ่คุณต้องการทำตามคำแนะนำของผู้อื่น: ใช้สำนวนที่เหมือนtryGetUnit()
หรือคล้ายกันสำหรับฟังก์ชั่นที่ไม่ส่งข้อยกเว้นและส่งคืนค่า Sentinel เช่น null หากคุณคิดว่าผู้ใช้อาจต้องการที่จะใช้ทั้งการจัดการข้อยกเว้นและไม่ใช่ข้อยกเว้นด้านการจัดการรหัสข้างภายในโปรแกรมเดียวติดกับtryGetUnit()
สัญกรณ์ อย่างไรก็ตามมีกรณีมุมที่ความเป็นจริงของธุรกิจสามารถทำให้ใช้ธงได้ดีขึ้น หากคุณพบว่าตัวเองอยู่ในมุมนั้นอย่ากลัวที่จะโยน "กฎ" ข้างทาง นั่นคือสิ่งที่กฎมีไว้สำหรับ!