คำถามติดแท็ก defensive-programming

16
ฉันควรเพิ่มรหัสที่ซ้ำซ้อนตอนนี้ในกรณีที่อาจจำเป็นในอนาคตหรือไม่
ถูกหรือผิดฉันกำลังเชื่อว่าฉันควรพยายามทำให้รหัสของฉันแข็งแกร่งที่สุดเท่าที่จะเป็นไปได้แม้ว่าจะหมายถึงการเพิ่มรหัส / เช็คซ้ำซ้อนที่ฉันรู้ว่าตอนนี้ฉันจะไม่ใช้ประโยชน์ แต่อย่างใด อาจเป็นจำนวนปี x ลงบรรทัด ตัวอย่างเช่นฉันกำลังทำงานกับแอปพลิเคชันมือถือที่มีรหัสนี้: public static CalendarRow AssignAppointmentToRow(Appointment app, List<CalendarRow> rows) { //1. Is rows equal to null? - This will be the case if this is the first appointment. if (rows == null) { rows = new List<CalendarRow> (); } //2. Is rows empty? - …

14
TDD ทำให้การเขียนโปรแกรมเชิงป้องกันซ้ำซ้อนหรือไม่?
วันนี้ฉันมีการสนทนาที่น่าสนใจกับเพื่อนร่วมงาน ฉันเป็นโปรแกรมเมอร์ป้องกัน ฉันเชื่อว่ากฎ " คลาสจะต้องตรวจสอบให้แน่ใจว่าวัตถุนั้นมีสถานะที่ถูกต้องเมื่อมีการโต้ตอบกับจากนอกห้องเรียน " จะต้องปฏิบัติตามเสมอ เหตุผลสำหรับกฎนี้คือชั้นเรียนไม่ทราบว่าผู้ใช้เป็นใครและควรคาดคะเนความล้มเหลวเมื่อมีการโต้ตอบในลักษณะที่ผิดกฎหมาย ในความเห็นของฉันกฎที่ใช้กับทุกชั้น ในสถานการณ์เฉพาะที่ฉันมีการสนทนาวันนี้ฉันเขียนโค้ดที่ตรวจสอบว่าอาร์กิวเมนต์ของตัวสร้างของฉันนั้นถูกต้อง (เช่นพารามิเตอร์จำนวนเต็มต้อง> 0) และหากไม่ตรงตามเงื่อนไขก่อนจะมีข้อผิดพลาดเกิดขึ้น ในทางกลับกันเพื่อนร่วมงานของฉันเชื่อว่าการตรวจสอบดังกล่าวซ้ำซ้อนเพราะการทดสอบหน่วยควรตรวจสอบการใช้งานในชั้นเรียนที่ไม่ถูกต้อง นอกจากนี้เขาเชื่อว่าการตรวจสอบความถูกต้องของโปรแกรมการเขียนโปรแกรมควรจะเป็นการทดสอบหน่วยดังนั้นการเขียนโปรแกรมเชิงป้องกันจะเพิ่มงานจำนวนมากและไม่เหมาะสำหรับ TDD เป็นความจริงหรือไม่ที่ TDD สามารถแทนที่โปรแกรมป้องกันได้ การตรวจสอบความถูกต้องของพารามิเตอร์ (และฉันไม่ได้หมายถึงการป้อนข้อมูลของผู้ใช้) ไม่จำเป็นตามมาหรือไม่? หรือว่าทั้งสองเทคนิคเติมเต็มซึ่งกันและกัน?

4
if ('constant' == $ variable) vs. if ($ variable == 'constant')
เมื่อเร็ว ๆ นี้ฉันได้ทำงานกับ PHP มากและโดยเฉพาะภายในกรอบ WordPress ฉันสังเกตเห็นรหัสจำนวนมากในรูปแบบของ: if ( 1 == $options['postlink'] ) ที่ฉันคาดว่าจะเห็น: if ( $options['postlink'] == 1 ) นี่เป็นข้อตกลงที่พบในบางภาษา / กรอบงานหรือไม่? มีเหตุผลใดที่แนวทางก่อนหน้านี้เป็นที่นิยมกว่าในภายหลัง (จากมุมมองการประมวลผลหรือมุมมองการแยกวิเคราะห์หรือแม้แต่มุมมองของมนุษย์?) หรือมันเป็นเพียงเรื่องของการลิ้มรส? ฉันมักจะคิดว่ามันจะดีกว่าเมื่อทำการทดสอบว่ารายการตัวแปรที่ทดสอบกับค่าคงที่อยู่ทางซ้าย ดูเหมือนว่าแผนที่ดีกว่าวิธีที่เราจะถามคำถามในภาษาธรรมชาติ: "ถ้าเค้กช็อคโกแลต" มากกว่า "ถ้าช็อคโกแลตเป็นเค้ก"

10
กำหนดรหัสที่แข็งแกร่งคืออะไร
อาจารย์ของฉันอ้างอิงถึงตัวอย่าง Java นี้เมื่อเขาพูดถึงรหัส "แข็งแกร่ง": if (var == true) { ... } else if (var == false) { ... } else { ... } เขาอ้างว่า "รหัสที่มีประสิทธิภาพ" หมายถึงโปรแกรมของคุณคำนึงถึงความเป็นไปได้ทั้งหมดและไม่มีสิ่งใดเป็นข้อผิดพลาด - ทุกสถานการณ์ได้รับการจัดการโดยรหัสและส่งผลให้อยู่ในสถานะที่ถูกต้องดังนั้นจึงเป็น "อื่น" อย่างไรก็ตามฉันสงสัยว่า หากตัวแปรเป็นบูลีนจุดตรวจสอบสถานะที่สามคืออะไรเมื่อสถานะที่สามเป็นไปไม่ได้ทางตรรกะ? "ไม่มีสิ่งเช่นข้อผิดพลาด" ดูเหมือนไร้สาระเช่นกัน; แม้แอปพลิเคชันของ Google จะแสดงข้อผิดพลาดโดยตรงกับผู้ใช้แทนที่จะกลืนให้เงียบหรืออย่างใดถือว่าพวกเขาเป็นสถานะที่ถูกต้อง และมันก็เป็นเรื่องดี - ฉันชอบที่จะรู้ว่าเมื่อมีอะไรผิดปกติ และดูเหมือนว่าการอ้างสิทธิ์ว่าแอปพลิเคชันจะไม่มีข้อผิดพลาดเลย ดังนั้นนิยามที่แท้จริงของ "รหัสที่มีประสิทธิภาพ" คืออะไร?

7
ฉันควรตรวจสอบค่าส่งคืนของการเรียกใช้เมธอดแม้ว่าฉันจะรู้ว่าวิธีนั้นไม่สามารถส่งคืนอินพุตที่ไม่ดีได้หรือไม่?
ฉันสงสัยว่าฉันควรป้องกันค่าตอบแทนการโทรด้วยวิธีการโดยตรวจสอบว่าพวกเขาตอบสนองความคาดหวังของฉันแม้ว่าฉันรู้ว่าวิธีการที่ฉันโทรจะตอบสนองความคาดหวังดังกล่าว GIVEN User getUser(Int id) { User temp = new User(id); temp.setName("John"); return temp; } ฉันควรทำหรือไม่ void myMethod() { User user = getUser(1234); System.out.println(user.getName()); } หรือ void myMethod() { User user = getUser(1234); // Validating Preconditions.checkNotNull(user, "User can not be null."); Preconditions.checkNotNull(user.getName(), "User's name can not be null."); System.out.println(user.getName()); } …

2
ความแตกต่างระหว่างการออกแบบตามสัญญาและการเขียนโปรแกรมป้องกัน
การออกแบบโดยสัญญา (DbC) เป็นวิธีการตั้งโปรแกรมป้องกันหรือไม่ เป็นวิธีหนึ่งในการเขียนโปรแกรมที่ดีกว่าในบางกรณีมากกว่าวิธีอื่นหรือไม่

3
ฉันจำเป็นต้องจัดการกับสถานการณ์ที่วิธีการส่วนตัวถูกเรียกผ่านการสะท้อนกลับหรือไม่?
เมื่อมีการสร้างห้องสมุดที่ผมต้องให้แน่ใจว่าวิธีการที่ภาคเอกชนจะต้องทำงานตามที่คาดไว้เมื่อเรียกไม่ได้โดยวิธีการอื่น ๆ ของชั้นเดียวกัน แต่โดยห้องสมุดอื่นผ่านการสะท้อน ? ตัวอย่างเช่นหากวิธีส่วนตัวprivate DoSomething(int number)คาดว่า: number เป็นจำนวนเต็มบวกที่ไม่เป็นศูนย์และ: ตัวแปรส่วนตัวstring abcไม่ใช่โมฆะและไม่ใช่สตริงว่าง และสมบูรณ์ล้มเหลวอย่างน่าเกลียดหากทั้งสองเงื่อนไขไม่ตรงกันฉันต้องจัดการกับความล้มเหลวเหล่านั้นแม้ว่าฉันจะรู้ว่าวิธีการทั้งหมดในชั้นเรียนจะกำหนดค่าที่ไม่ว่างเปล่าให้กับการabcโทรก่อนDoSomethingและส่งจำนวนเต็มบวกที่ไม่เป็นศูนย์ให้ วิธี? กล่าวอีกนัยหนึ่งคือรหัสที่ไม่ได้ป้องกันการโทรที่ไม่ปลอดภัยผ่านการสะท้อนอาจถือได้ว่าเป็นรหัสที่มีคุณภาพต่ำหรือเป็นของผู้โทรที่ใช้การสะท้อนเพื่อให้แน่ใจว่าการโทรจะไม่ทำลายอะไรเลย หมายเหตุ: คำถามของฉันครอบคลุมเฉพาะชุดไลบรารีมาตรฐาน นี่ไม่ครอบคลุมรหัสที่จะต้องมีความปลอดภัยสูง (เช่นเมื่อใครบางคนอาจสนใจโดยใช้การสะท้อนเพื่อให้มันทำงานโดยไม่คาดคิดหรือผิดพลาด) ¹เนื่องจากชั้นเรียนได้รับการบันทึกอย่างถูกต้องเนื่องจากมีการทดสอบหน่วยมากพอที่จะตรวจสอบให้แน่ใจว่าผู้พัฒนารายอื่นจะไม่ทำลายวิธีนี้เป็นต้น

4
เราควรจะป้องกันได้อย่างไร
เราใช้งานPexมากับโค้ดบางตัวและมันก็แสดงให้เห็นถึงสิ่งที่ดี (สิ่งเลวร้าย แต่แสดงให้พวกเขาเห็นก่อนที่มันจะเริ่มผลิต!) อย่างไรก็ตามหนึ่งในสิ่งที่ดีเกี่ยวกับ Pex คือมันไม่จำเป็นต้องหยุดพยายามค้นหาปัญหา สิ่งหนึ่งที่เราพบคือเมื่อผ่านสตริงเราไม่ได้ตรวจสอบสตริงว่าง ดังนั้นเราจึงเปลี่ยน: if (inputString == null) ถึง if (string.IsNullOrEmpty(inputString)) // *** ที่แก้ไขปัญหาเบื้องต้น แต่เมื่อเราวิ่ง Pex อีกครั้งก็ตัดสินใจว่า inputString = "\0"; ก่อให้เกิดปัญหา และจากนั้น inputString = "\u0001"; สิ่งที่เราได้ตัดสินใจคือสามารถใช้ค่าเริ่มต้นได้หากเราพบ// ***และเรายินดีที่จะเห็นข้อยกเว้นที่เกิดจากข้อมูลแปลก ๆ อื่น ๆ (และจัดการกับมัน) เพียงพอหรือไม่
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.