วิศวกรรมซอฟต์แวร์

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

8
การเปรียบเทียบความเท่าเทียมกันของจำนวนลอยเข้าใจผิดนักพัฒนารุ่นน้องแม้ว่าจะไม่มีข้อผิดพลาดในการปัดเศษในกรณีของฉันหรือไม่?
ตัวอย่างเช่นฉันต้องการแสดงรายการปุ่มจาก 0,0.5, ... 5 ซึ่งข้ามไปแต่ละ 0.5 ฉันใช้สำหรับการวนรอบเพื่อทำเช่นนั้นและมีสีที่แตกต่างกันที่ปุ่ม STANDARD_LINE: var MAX=5.0; var DIFF=0.5 var STANDARD_LINE=1.5; for(var i=0;i<=MAX;i=i+DIFF){ button.text=i+''; if(i==STANDARD_LINE){ button.color='red'; } } ในกรณีนี้ไม่ควรมีข้อผิดพลาดในการปัดเศษเนื่องจากค่าแต่ละค่าเป็นค่าที่แน่นอนใน IEEE 754 แต่ฉันกำลังลำบากถ้าฉันควรเปลี่ยนเพื่อหลีกเลี่ยงการเปรียบเทียบความเท่าเทียมกันของทศนิยม var MAX=10; var STANDARD_LINE=3; for(var i=0;i<=MAX;i++){ button.text=i/2.0+''; if(i==STANDARD_LINE/2.0){ button.color='red'; } } ในมือข้างหนึ่งรหัสดั้งเดิมนั้นเรียบง่ายกว่าและส่งต่อมาให้ฉัน แต่มีสิ่งหนึ่งที่ฉันกำลังพิจารณา: i == STANDARD_LINE ทำให้เข้าใจผิดว่าเป็นเพื่อนร่วมทีมของจูเนียร์หรือไม่? มันซ่อนข้อเท็จจริงที่ว่าตัวเลขจุดลอยตัวอาจมีข้อผิดพลาดในการปัดเศษหรือไม่ หลังจากอ่านความคิดเห็นจากโพสต์นี้: https://stackoverflow.com/questions/33646148/is-hardcode-float-precise-if-it-can-be-represented-by-binary-format-in-ieee-754 ดูเหมือนว่ามีนักพัฒนาหลายคนไม่ทราบว่าตัวเลขลอยตัวบางอย่างแน่นอน ฉันควรหลีกเลี่ยงการเปรียบเทียบความเท่าเทียมกันของจำนวนทศนิยมแม้ว่าจะถูกต้องในกรณีของฉัน หรือฉันกำลังคิดถึงเรื่องนี้อยู่

2
วิธีการแยกส่วนหน้าและส่วนหลังด้วยจาวาสคริปต์แบบเต็ม?
สมมติว่าฉันมีส่วนหน้าซึ่งส่วนใหญ่เป็นแอปพลิเคชันหน้าเดียวที่เขียนโดยใช้เชิงมุมเสียงฮึดฮัดและความโกลาหล และสมมติว่าฉันมีแบ็กเอนด์ซึ่งส่วนใหญ่เป็นเพียง REST API นั่งอยู่ด้านบนของ ORM ซึ่งเก็บ / ดึงวัตถุจากฐานข้อมูลโดยใช้สิ่งต่าง ๆ เช่นเสียงฮึดฮัดแสดงและต่อเนื่อง แอปพลิเคชันเชิงมุมทำสิ่งที่เป็นภาพทั้งหมดที่ผู้ใช้เห็น แต่ทำได้ด้วยการเป็น GUI เหนือบริการที่จัดทำโดยแบ็คเอนด์ มันจะเป็นที่พึงปรารถนาที่จะแยกสิ่งเหล่านี้ออกเป็นสอง codebases ที่แตกต่างกันเพื่อให้เกิดการพัฒนาที่เป็นอิสระการกำหนดเวอร์ชันการรวมอย่างต่อเนื่องการผลักดันการพัฒนาเป็นต้น คำถามของฉันคือมีวิธีการอะไรบ้างสำหรับการทำสิ่งนี้อย่างหมดจด? มีแนวทางปฏิบัติที่ดีที่สุดสำหรับจาวาสคริปต์แบบเต็มสแต็คหรือไม่? ตัวเลือก # 1 ดูเหมือนจะเป็นหินใหญ่ก้อนเดียวเช่น "อย่าแยกพวกมันออก" โปรคือห่วงโซ่การสร้างนั้นง่ายและทุกอย่างอยู่ในที่แห่งเดียว - แต่ดูเหมือนจะมีข้อเสียมากมาย เวอร์ชันที่ยากขึ้นไปอีกส่วนด้านหน้าที่หักหมายถึงส่วนที่ไม่สามารถปรับใช้ได้และอื่น ๆ ตัวเลือก # 2 ดูเหมือนจะเป็นแบบโมโนลิ ธ ที่ซึ่งฟลูเอ็นด์บิลด์ส่วนหน้ามีผลในการเขียนไฟล์จำนวนมากไปยังแบ็คเอนด์ distไดเรกทอรีบน front-end จะอ้างถึงไดเรกทอรีบางอย่างเกี่ยวกับ back-end เพื่อเป็นหลักเมื่อ minifies ปลายด้านหน้า uglifies ฯลฯ ก็ลงท้ายเผยแพร่ไปยัง back-end ซึ่งจะทำงานทุกอย่าง ตัวเลือก # …

1
“ StringBuilder” เป็นแอปพลิเคชั่นของรูปแบบการออกแบบตัวสร้างหรือไม่?
รูปแบบ "ตัวสร้าง" ถูก จำกัด ให้จัดการกับรูปแบบการต่อต้าน "ตัวสร้างเหลื่อม" หรืออาจกล่าวได้ว่าเป็นการแก้ปัญหาทั่วไปของการสร้างวัตถุที่ไม่เปลี่ยนรูปแบบที่ซับซ้อนมากขึ้นหรือไม่? StringBuilderชั้นจะมีคำว่า "ผู้สร้าง" ในชื่อของมัน แต่มันมีอะไรจะทำอย่างไรกับความเหลื่อมก่อสร้างมันก็ช่วยให้เราได้รวบรวมข้อมูลทั้งหมดที่เราต้องผ่านการสร้างของวัตถุที่ไม่เปลี่ยนรูป สำหรับฉันดูเหมือนว่าคำตอบจะชัดเจนมาก "ใช่" แต่ดูเหมือนจะมีความขัดแย้งในหัวข้อดังนั้นฉันหวังว่าบางคนอาจจะอธิบายได้ ฉันตอบคำถามนี้: โปรแกรมเมอร์ SE: "งานจริง" ที่ถูกต้องในตัวสร้าง? ที่ OP ต้องการสร้างวัตถุ (น่าจะไม่เปลี่ยนรูป) ที่มีต้นไม้ที่ซับซ้อนและความคิดของรูปแบบ "ผู้สร้าง" โผล่ขึ้นมาและในขณะที่ทำการวิจัยผมพบว่า Q&A นี้ซึ่งดูเหมือนว่ารูปแบบการสร้างวัตถุ "StringBuilder" คือไม่ได้เป็นโปรแกรมของ "สร้าง" รูปแบบสำหรับเหตุผลที่ไม่ชัดเจนกับผม: Stackoverflow - StringBuilder และสร้างรูปแบบ (ผู้ที่ตอบคำถามนั้นล้มเหลวในการสร้างจุดที่น่าเชื่อถือเท่าที่ฉันสามารถบอกได้)

9
ทำไมเราต้องมีคลาส Builder เมื่อใช้รูปแบบตัวสร้าง?
ฉันเห็นการใช้งานหลายอย่างของรูปแบบตัวสร้าง (ส่วนใหญ่ใน Java) พวกเขาทั้งหมดมีคลาสเอนทิตี้ (สมมุติว่าPersonคลาส) และคลาสบิลPersonBuilderเดอร์ ผู้สร้าง "สแต็ค" ฟิลด์ที่หลากหลายและส่งกลับค่าnew Personด้วยอาร์กิวเมนต์ที่ส่งผ่าน ทำไมเราต้องมีคลาสผู้สร้างอย่างชัดเจนแทนที่จะใส่เมธอดผู้สร้างทั้งหมดลงในPersonคลาสเอง? ตัวอย่างเช่น: class Person { private String name; private Integer age; public Person() { } Person withName(String name) { this.name = name; return this; } Person withAge(int age) { this.age = age; return this; } } ฉันสามารถพูดได้ Person john = …

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

6
ทำไมไพ ธ อนจึงทำสำเนาองค์ประกอบเฉพาะเมื่อทำซ้ำรายการ?
ฉันเพิ่งรู้ว่าในงูใหญ่ถ้ามีคนเขียน for i in a: i += 1 องค์ประกอบของรายการเดิมaจริงจะไม่ได้ส่งผลกระทบต่อที่ทุกคนตั้งแต่ตัวแปรจะออกมาเพียงแค่เป็นสำเนาขององค์ประกอบเดิมในia ในการปรับเปลี่ยนองค์ประกอบดั้งเดิม for index, i in enumerate(a): a[index] += 1 จะต้อง ฉันรู้สึกประหลาดใจจริงๆกับพฤติกรรมนี้ ดูเหมือนว่าจะเป็นแบบที่ใช้ง่ายมากดูเหมือนจะแตกต่างจากภาษาอื่นและทำให้เกิดข้อผิดพลาดในรหัสของฉันที่ฉันต้องแก้ไขในขณะนี้ ฉันเคยอ่าน Python Tutorial มาก่อน เพียงเพื่อให้แน่ใจว่าฉันตรวจสอบหนังสืออีกครั้งในขณะนี้และมันไม่ได้พูดถึงพฤติกรรมนี้เลย เหตุผลที่อยู่เบื้องหลังการออกแบบนี้คืออะไร? เป็นที่คาดหวังหรือไม่ว่าเป็นแบบฝึกหัดมาตรฐานในหลายภาษาเพื่อที่ผู้สอนจะเชื่อว่าผู้อ่านควรได้รับมันอย่างเป็นธรรมชาติหรือไม่? ในภาษาอื่นมีพฤติกรรมแบบเดียวกันในการทำซ้ำที่ฉันควรให้ความสนใจในอนาคตหรือไม่
31 python  list  iterator 

7
การควบคุมเวอร์ชันทำงานบนไมโครคอมพิวเตอร์ในยุค 80 และ 90 อย่างไร
ฉันอยากรู้ว่าทีมโปรแกรมเมอร์มักจะจัดการการพัฒนาซอฟต์แวร์ของพวกเขาในยุค 80 และต้นยุค 90 อย่างไร มีการจัดเก็บซอร์สโค้ดทั้งหมดไว้ในเครื่องเดียวที่ทุกคนทำงานหรือถูกส่งผ่านไปมาและคัดลอกด้วยตนเองผ่านฟลอปปี้และรวมเข้าด้วยกันหรือพวกเขาใช้ระบบควบคุมการแก้ไขผ่านเครือข่าย (ตัวอย่างเช่น CVS) เช่นเดียวกับที่เราทำ ตอนนี้หรือไม่ หรืออาจจะมีการใช้ CVS ออฟไลน์เช่นเดียวกัน ทุกวันนี้ทุกคนขึ้นอยู่กับการควบคุมแหล่งที่มา .. มันไม่มีเกมง่ายๆ แต่ในยุค 80 เครือข่ายคอมพิวเตอร์ไม่ใช่เรื่องง่ายที่จะตั้งค่าและสิ่งต่าง ๆ เช่นแนวปฏิบัติที่ดีที่สุดยังคงถูกคิดออก ... ฉันรู้ว่าในการเขียนโปรแกรม 70s และ 60s นั้นค่อนข้างแตกต่างกันดังนั้นการควบคุมการแก้ไขจึงไม่จำเป็น แต่ในยุค 80 และ 90 ที่ผู้คนเริ่มใช้คอมพิวเตอร์เพื่อเขียนรหัสและแอปพลิเคชันเริ่มเพิ่มขนาดและขอบเขตดังนั้นฉันจึงสงสัยว่าผู้คนจัดการกับสิ่งเหล่านั้นได้อย่างไร นอกจากนี้สิ่งนี้แตกต่างระหว่างแพลตฟอร์มอย่างไร พูดว่า Apple กับ Commodore 64 กับ Amiga กับ MS-DOS เทียบกับ Windows กับ Atari หมายเหตุ: ส่วนใหญ่ฉันพูดถึงการเขียนโปรแกรมบนไมโครคอมพิวเตอร์ในแต่ละวันไม่ใช่เครื่อง UNIX ขนาดใหญ่

5
มักจะแยกความคิดเห็นเป็นอย่างไร
ความคิดเห็นได้รับการปฏิบัติโดยทั่วไปในภาษาการเขียนโปรแกรมและมาร์กอัปอย่างไร ฉันกำลังเขียนโปรแกรมแยกวิเคราะห์สำหรับภาษามาร์กอัปที่กำหนดเองบางอย่างและต้องการทำตามหลักการของความประหลาดใจน้อยที่สุดดังนั้นฉันจึงพยายามกำหนดรูปแบบทั่วไป ตัวอย่างเช่นความคิดเห็นที่ฝังอยู่ภายในโทเค็น 'รบกวน' กับโทเค็นหรือไม่? โดยทั่วไปแล้วเป็นสิ่งที่ชอบ: Sys/* comment */tem.out.println() ถูกต้อง? นอกจากนี้หากภาษามีความอ่อนไหวต่อบรรทัดใหม่และความคิดเห็นที่ครอบคลุมบรรทัดใหม่ควรพิจารณาบรรทัดใหม่หรือไม่? stuff stuff /* this is comment this is still comment */more stuff ถือว่าเป็น stuff stuff more stuff หรือ stuff stuff more stuff ? ฉันรู้ว่ามีบางภาษาที่เฉพาะเจาะจงทำหรือฉันกำลังมองหาความคิดเห็น แต่กำลังมองหาหรือไม่: มีฉันทามติทั่วไปสิ่งที่คาดหวังโดยทั่วไปโดยเครื่องหมายขึ้นเกี่ยวกับโทเค็นและบรรทัดใหม่หรือไม่? บริบทเฉพาะของฉันคือมาร์กอัปคล้ายวิกิ
31 parsing  comments 

6
ใส่รหัสผ่านในการเรียกใช้ REST API
สมมติว่าฉันมี REST API ที่ใช้ในการตั้งค่า / รีเซ็ตรหัสผ่าน สมมติว่าวิธีนี้ใช้ได้กับการเชื่อมต่อ HTTPS มีเหตุผลที่ดีที่จะไม่ใส่รหัสผ่านนั้นในเส้นทางการโทรหรือเปล่าสมมุติว่าฉันจะเข้ารหัสใน BASE64 ตัวอย่างจะรีเซ็ตรหัสผ่านดังนี้: http://www.example.com/user/joe/resetpassword/OLDPASSWD/NEWPASSWD ฉันเข้าใจว่า BASE64 ไม่ใช่การเข้ารหัส แต่ฉันเพียงต้องการปกป้องรหัสผ่านเพื่อท่องในกรณีนี้
31 rest  passwords 

1
เหตุใด C ++ ไม่มีคำหลัก“ บริสุทธิ์” สำหรับฟังก์ชันเสมือนจริง
ฉันสงสัยอยู่เสมอว่าทำไมเราถึงโค้ด virtual void MyFunction() = 0; และไม่ pure virtual void MyFunction(); มีการอ้างอิงสำหรับพื้นฐานของการตัดสินใจนี้หรือไม่?

4
วิธีป้องกันสภาวะการแข่งขันในเว็บแอปพลิเคชัน
พิจารณาเว็บไซต์อีคอมเมิร์ซที่ทั้ง Alice และ Bob กำลังแก้ไขรายการผลิตภัณฑ์ อลิซกำลังปรับปรุงคำอธิบายขณะที่ Bob กำลังอัพเดทราคา พวกเขาเริ่มแก้ไข Acme Wonder Widget ในเวลาเดียวกัน บ๊อบเสร็จสิ้นก่อนและบันทึกผลิตภัณฑ์ด้วยราคาใหม่ อลิซใช้เวลาในการอัปเดตคำอธิบายนานขึ้นและเมื่อเธอทำเสร็จเธอจะบันทึกผลิตภัณฑ์ด้วยคำอธิบายใหม่ของเธอ น่าเสียดายที่เธอเขียนทับราคาด้วยราคาเดิมซึ่งไม่ได้มีเจตนา จากประสบการณ์ของฉันปัญหาเหล่านี้พบได้ทั่วไปในเว็บแอป ซอฟต์แวร์บางตัว (เช่นซอฟต์แวร์ wiki) มีการป้องกันสิ่งนี้ - โดยปกติการบันทึกครั้งที่สองจะล้มเหลวด้วย "หน้าได้รับการปรับปรุงในขณะที่คุณกำลังแก้ไข" แต่เว็บไซต์ส่วนใหญ่ไม่มีการป้องกันนี้ เป็นที่น่าสังเกตว่าวิธีการควบคุมนั้นมีความปลอดภัยในเธรด โดยปกติแล้วพวกเขาจะใช้ธุรกรรมฐานข้อมูลซึ่งทำให้ปลอดภัยในแง่ที่ว่าถ้า Alice และ Bob พยายามที่จะบันทึกในเวลาเดียวกันแม่นยำมันจะไม่ทำให้เกิดความเสียหาย สภาพการแข่งขันเกิดขึ้นจาก Alice หรือ Bob ที่มีข้อมูลเก่าในเบราว์เซอร์ เราจะป้องกันสภาพการแข่งขันดังกล่าวได้อย่างไร? โดยเฉพาะอย่างยิ่งฉันต้องการทราบ: เทคนิคใดบ้างที่สามารถใช้ได้ เช่นการติดตามเวลาของการเปลี่ยนแปลงครั้งล่าสุด อะไรคือข้อดีข้อเสียของแต่ละคน ประสบการณ์การใช้งานที่เป็นประโยชน์คืออะไร? กรอบการป้องกันนี้มีอะไรในตัว?

6
เราจำเป็นต้องทดสอบซอฟต์แวร์ 32 บิตใน Windows 64 บิตหรือไม่
ฉันทำงานในทีมพัฒนาซอฟต์แวร์ในฐานะนักพัฒนาซอฟต์แวร์ ฉันทำงานโครงการเดียวกันเป็นเวลาสามปีแล้ว ซอฟต์แวร์นี้เป็นแอพพลิเคชั่น C # แบบเดสก์ท็อปขนาด 32 บิตใน. NET 4 แพลตฟอร์มเป้าหมายของเราใน Windows 7 (เราต้องรองรับ Windows XP จนถึงปีที่แล้ว) ซอฟต์แวร์สื่อสารกับฮาร์ดแวร์ที่กำหนดเองต่างๆซึ่งเขียนไดรเวอร์ที่กำหนดเอง ซอฟต์แวร์การผลิตและไดร์เวอร์ฮาร์ดแวร์เขียนโดยลูกค้าของเรา มีไดรเวอร์ที่แตกต่างกันสำหรับ Windows 32 บิตและ 64 บิต ในระหว่างขั้นตอนการทดสอบระบบของเราเราดำเนินการกรณีทดสอบทั้งหมด / ส่วนใหญ่ใน Windows 7 ทั้ง 32- บิตและ 64- บิตฉันจำไม่ได้ว่าเรามีข้อผิดพลาดใด ๆ ในซอฟต์แวร์ของเราที่มีอยู่ใน Windows เพียงรสชาติเดียว เมื่อได้รับประสบการณ์นี้ฉันเริ่มสงสัยแล้วเราจำเป็นต้องทดสอบซอฟต์แวร์ 32 บิตบน Windows 64 บิตหรือไม่ มาตรฐานอุตสาหกรรมคืออะไร

6
มันจะโอเคที่จะมีกลิ่นรหัสหรือไม่ถ้ายอมรับวิธีแก้ปัญหาที่ง่ายกว่าสำหรับปัญหาอื่น? [ปิด]
กลุ่มเพื่อนและฉันทำงานในโครงการเมื่อไม่นานมานี้และเราต้องการคิดค้นวิธี OOP ที่ดีเพื่อแสดงสถานการณ์ที่เฉพาะเจาะจงกับผลิตภัณฑ์ของเรา โดยพื้นฐานแล้วเรากำลังทำงานกับเกมกระสุนนรกสไตล์ Touhou และเราต้องการสร้างระบบที่เราสามารถแสดงพฤติกรรมที่เป็นไปได้ของกระสุนได้อย่างง่ายดายที่เราสามารถฝันได้ นั่นคือสิ่งที่เราทำ เราสร้างสถาปัตยกรรมที่สง่างามอย่างแท้จริงซึ่งทำให้เราสามารถแยกพฤติกรรมของกระสุนปืนออกเป็นส่วนประกอบต่าง ๆ ที่สามารถแนบไปกับกระสุนได้ตามใจชอบระบบส่วนประกอบของ Unity มันใช้งานได้ดีมันขยายได้ง่ายมีความยืดหยุ่นและครอบคลุมฐานทั้งหมดของเรา แต่มีปัญหาเล็กน้อย แอปพลิเคชันของเรายังเกี่ยวข้องกับการสร้างขั้นตอนจำนวนมากกล่าวคือเราสร้างพฤติกรรมของกระสุน เหตุใดจึงเป็นปัญหา วิธีแก้ปัญหา OOP ของเราคือการแสดงพฤติกรรมกระสุนในขณะที่สง่างามมีความซับซ้อนเล็กน้อยในการทำงานโดยไม่มีมนุษย์ มนุษย์ฉลาดพอที่จะคิดถึงวิธีแก้ปัญหาที่มีเหตุผลและชาญฉลาด อัลกอริธึมการสร้างโพรซีเดอร์ยังไม่ฉลาดและเราพบว่ามันยากที่จะใช้ AI ที่ใช้สถาปัตยกรรม OOP ของเราให้มีศักยภาพสูงสุด เป็นที่ยอมรับว่าเป็นข้อบกพร่องของสถาปัตยกรรมคือมันไม่ง่ายในทุกสถานการณ์ ดังนั้นเพื่อแก้ไขปัญหานี้โดยทั่วไปเราได้ผลักดันพฤติกรรมทั้งหมดที่ส่วนประกอบต่าง ๆ นำเสนอให้กับคลาสกระสุนเพื่อให้ทุกสิ่งที่เราสามารถจินตนาการได้ถูกนำเสนอโดยตรงในแต่ละอินสแตนซ์ของสัญลักษณ์แสดงหัวข้อย่อย นี้จะทำให้ขั้นตอนรุ่นของเราขั้นตอนวิธีการง่ายขึ้นเล็ก ๆ น้อย ๆ ในการทำงานด้วย แต่ตอนนี้ระดับกระสุนของเราเป็นอย่างมากวัตถุพระเจ้า มันเป็นคลาสที่ใหญ่ที่สุดในโปรแกรมอย่างง่ายจนมีโค้ดมากกว่าห้าเท่ามากกว่าอย่างอื่น มันค่อนข้างเจ็บปวดที่ต้องดูแลเช่นกัน เป็นไรไหมที่ชั้นเรียนของเราคนหนึ่งเปลี่ยนเป็นเทพเจ้าวัตถุเพื่อให้ง่ายต่อการทำงานกับปัญหาอื่น? โดยทั่วไปแล้วจะเป็นการดีไหมที่จะมีกลิ่นของรหัสในรหัสของคุณหากยอมรับวิธีการแก้ปัญหาที่ง่ายกว่าสำหรับปัญหาอื่น

3
ข้อผิดพลาดในการพิจารณาการจัดการ
ปัญหา: ตั้งแต่เวลานานฉันกังวลเกี่ยวกับexceptionsกลไกเพราะฉันรู้สึกว่ามันไม่ได้แก้ไขสิ่งที่ควร เคลม: มีการถกเถียงกันนานเกี่ยวกับหัวข้อนี้และพวกเขาส่วนใหญ่มักจะพยายามเปรียบเทียบexceptionsและส่งกลับรหัสข้อผิดพลาด นี่ไม่ใช่หัวข้อที่แน่นอน พยายามกำหนดข้อผิดพลาดฉันจะเห็นด้วยกับ CppCoreGuidelines จาก Bjarne Stroustrup & Herb Sutter ข้อผิดพลาดหมายความว่าฟังก์ชันไม่สามารถบรรลุวัตถุประสงค์ที่โฆษณาไว้ การเรียกร้อง: exceptionกลไกคือ semantic ภาษาสำหรับการจัดการข้อผิดพลาด การเรียกร้อง: สำหรับฉันมี "ไม่มีข้อแก้ตัว" สำหรับฟังก์ชั่นที่ไม่ได้งาน: เพราะเรากำหนดเงื่อนไขล่วงหน้า / โพสต์ผิดดังนั้นฟังก์ชันไม่สามารถรับประกันผลลัพธ์ได้หรือกรณีพิเศษบางกรณีไม่ถือว่าสำคัญพอสำหรับการใช้เวลาในการพัฒนา ทางออก เมื่อพิจารณาแล้ว IMO ความแตกต่างระหว่างการจัดการรหัสปกติและรหัสข้อผิดพลาดคือ (ก่อนการติดตั้ง) บรรทัดที่เป็นอัตนัย การเรียกร้อง: การใช้ข้อยกเว้นเพื่อระบุว่าเมื่อใดที่ไม่ได้รักษาเงื่อนไขก่อนหรือหลังการโพสต์ไว้เป็นอีกจุดประสงค์หนึ่งของexceptionกลไก ฉันไม่ได้กำหนดเป้าหมายการใช้งานของexceptionsที่นี่ ในหนังสือหลายบทช่วยสอนและแหล่งข้อมูลอื่น ๆ พวกเขามักจะแสดงการจัดการข้อผิดพลาดเป็นศาสตร์ที่ค่อนข้างมีวัตถุประสงค์ซึ่งแก้ไขได้ด้วยexceptionsและคุณเพียงแค่ต้องการให้catchพวกเขามีซอฟต์แวร์ที่แข็งแกร่งสามารถกู้คืนจากสถานการณ์ใด ๆ แต่เป็นเวลาหลายปีในฐานะนักพัฒนาทำให้ฉันเห็นปัญหาจากแนวทางที่แตกต่าง: โปรแกรมเมอร์มีแนวโน้มที่จะทำให้งานของพวกเขาง่ายขึ้นโดยการโยนข้อยกเว้นเมื่อกรณีที่เฉพาะเจาะจงดูยากเกินกว่าที่จะดำเนินการอย่างระมัดระวัง กรณีทั่วไปนี้คือ: ปัญหาหน่วยความจำไม่เพียงพอ, ปัญหาเต็มรูปแบบดิสก์, ปัญหาไฟล์ที่เสียหายเป็นต้นซึ่งอาจเพียงพอ แต่ไม่สามารถตัดสินใจได้เสมอจากระดับสถาปัตยกรรม โปรแกรมเมอร์ไม่อ่านเอกสารอย่างละเอียดเกี่ยวกับข้อยกเว้นในไลบรารีและมักจะไม่ทราบว่าเมื่อใดและเมื่อใด นอกจากนี้แม้ว่าพวกเขารู้ว่าพวกเขาไม่ได้จัดการพวกเขาจริงๆ โปรแกรมเมอร์มักจะไม่ได้รับข้อยกเว้นเร็วพอและเมื่อพวกเขาทำมันส่วนใหญ่จะเข้าสู่ระบบและโยนต่อไป (อ้างถึงจุดแรก) สิ่งนี้มีสองผล: …

3
ต้นกำเนิดของการเยื้องรหัส
ฉันสนใจที่จะรู้ว่าใครเป็นผู้แนะนำการเยื้องโค้ดรวมถึงเวลาและสถานที่ที่มีการเปิดตัว ดูเหมือนว่าสำคัญอย่างยิ่งต่อการเข้าใจรหัส แต่มันไม่เป็นสากล ส่วนใหญ่ Fortran และรหัสพื้นฐานคือ (ไม่?) unindented และเดียวกันไปสำหรับ Cobol ฉันค่อนข้างมั่นใจว่าฉันเคยเห็นรหัส Lisp เก่าที่เขียนเป็นข้อความต่อเนื่องและมีเส้น คุณต้องนับวงเล็บในหัวของคุณเพื่อวิเคราะห์มัน ดังนั้นการปรับปรุงครั้งใหญ่นี้มาจากไหน? ฉันไม่เคยเห็นการกล่าวถึงต้นกำเนิดของมันเลย นอกเหนือจากตัวอย่างดั้งเดิมของการใช้งานฉันยังมองหาการอภิปรายต้นฉบับของการเยื้อง

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