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

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

10
เทมเพลต“ metaprogramming” ใน Java เป็นความคิดที่ดีหรือไม่
มีไฟล์ต้นฉบับในโครงการที่ค่อนข้างใหญ่ที่มีฟังก์ชั่นหลายอย่างที่มีความอ่อนไหวต่อประสิทธิภาพอย่างมาก (เรียกว่าล้านครั้งต่อวินาที) ในความเป็นจริงผู้ดูแลก่อนหน้านี้ตัดสินใจที่จะเขียน 12 สำเนาของฟังก์ชั่นที่แตกต่างกันเล็กน้อยมากเพื่อประหยัดเวลาที่จะใช้ในการตรวจสอบเงื่อนไขในฟังก์ชั่นเดียว น่าเสียดายที่นี่หมายถึงรหัสนี้เป็น PITA ที่จะรักษาไว้ ฉันต้องการลบรหัสที่ซ้ำกันทั้งหมดและเขียนเพียงหนึ่งเทมเพลต อย่างไรก็ตามภาษา, Java, ไม่รองรับเทมเพลตและฉันไม่แน่ใจว่ายาชื่อสามัญเหมาะสำหรับสิ่งนี้ แผนปัจจุบันของฉันคือการเขียนแทนไฟล์ที่สร้างฟังก์ชั่น 12 ชุด (ตัวขยายเทมเพลตแบบใช้ครั้งเดียวเท่านั้นจริง) แน่นอนฉันจะให้คำอธิบายมากมายว่าทำไมไฟล์จะต้องถูกสร้างขึ้นโดยทางโปรแกรม ความกังวลของฉันคือสิ่งนี้จะนำไปสู่ความสับสนของผู้ดูแลในอนาคตและอาจแนะนำข้อผิดพลาดที่น่ารังเกียจหากพวกเขาลืมสร้างไฟล์ใหม่หลังจากแก้ไขมันหรือ (ยิ่งแย่กว่า) หากพวกเขาแก้ไขไฟล์ที่สร้างโดยทางโปรแกรม โชคไม่ดีที่การเขียนใหม่ทั้งหมดใน C ++ ฉันไม่เห็นวิธีการแก้ไข ประโยชน์ของวิธีนี้มีมากกว่าข้อเสียหรือไม่ ฉันควรจะแทน: เพิ่มประสิทธิภาพการทำงานและใช้ฟังก์ชั่นเดียวที่บำรุงรักษาได้ เพิ่มคำอธิบายว่าทำไมฟังก์ชันจึงต้องทำซ้ำ 12 ครั้งและรับภาระการบำรุงรักษาอย่างสง่างาม พยายามใช้ข้อมูลทั่วไปเป็นเทมเพลต (อาจใช้ไม่ได้ผล) ตะโกนใส่ผู้ดูแลเก่าเพื่อสร้างรหัสขึ้นอยู่กับประสิทธิภาพในฟังก์ชั่นเดียว วิธีอื่นในการรักษาประสิทธิภาพและการบำรุงรักษา? ป.ล. เนื่องจากการออกแบบของโครงการไม่ดีการทำโปรไฟล์ฟังก์ชั่นค่อนข้างยุ่งยาก ... อย่างไรก็ตามผู้ดูแลคนก่อนทำให้ฉันมั่นใจว่าประสิทธิภาพในการทำงานนั้นไม่เป็นที่ยอมรับ ฉันคิดว่าเขามีความหมายมากกว่า 5% แม้ว่าจะเป็นการคาดเดาที่สมบูรณ์ในส่วนของฉัน บางทีฉันควรทำอย่างละเอียดหน่อย สำเนา 12 ชุดทำหน้าที่คล้ายกันมาก แต่มีความแตกต่างเล็กน้อย ความแตกต่างอยู่ในสถานที่ต่าง ๆ ตลอดทั้งฟังก์ชั่นดังนั้นน่าเสียดายที่มีข้อความมากมายที่มีเงื่อนไข การทำงานมีประสิทธิภาพ …

6
ทำความเข้าใจกับ“ การเขียนโปรแกรมไปยังส่วนต่อประสาน”
ฉันเจอคำว่า "การเขียนโปรแกรมไปยังอินเทอร์เฟซแทนที่จะใช้งาน" มากและฉันคิดว่าฉันเข้าใจความหมายของมัน แต่ฉันต้องการให้แน่ใจว่าฉันเข้าใจถึงประโยชน์และการใช้งานที่เป็นไปได้ "การเขียนโปรแกรมไปยังอินเทอร์เฟซ" หมายความว่าเมื่อเป็นไปได้เราควรอ้างถึงระดับนามธรรมของคลาส (อินเทอร์เฟซคลาสนามธรรมหรือบางครั้งเป็นซูเปอร์คลาสของการเรียงลำดับบางอย่าง) แทนที่จะอ้างถึงการใช้งานที่เป็นรูปธรรม ตัวอย่างทั่วไปใน Java คือการใช้: List myList = new ArrayList();ArrayList myList = new ArrayList();แทน ฉันมีคำถามสองข้อเกี่ยวกับเรื่องนี้: ฉันต้องการให้แน่ใจว่าฉันเข้าใจถึงประโยชน์หลักของวิธีนี้ ฉันคิดว่าประโยชน์ส่วนใหญ่มีความยืดหยุ่น การประกาศวัตถุเป็นข้อมูลอ้างอิงระดับสูงมากกว่าการนำไปปฏิบัติอย่างเป็นรูปธรรมช่วยให้มีความยืดหยุ่นและบำรุงรักษาได้มากขึ้นตลอดวงจรการพัฒนาและตลอดทั้งรหัส ถูกต้องหรือไม่ ความยืดหยุ่นเป็นประโยชน์หลักหรือไม่? มีวิธีเพิ่มเติมในการ 'เขียนโปรแกรมไปยังส่วนต่อประสาน' หรือไม่? หรือ "การประกาศตัวแปรเป็นอินเตอร์เฟสแทนที่จะใช้อย่างเป็นรูปธรรม" เป็นการนำแนวคิดนี้ไปปฏิบัติเท่านั้น ฉันไม่ได้พูดคุยเกี่ยวกับการเชื่อมต่อสร้าง Java ฉันกำลังพูดถึงหลักการ OO "การเขียนโปรแกรมไปยังส่วนต่อประสานไม่ใช่การใช้งาน" ในหลักการนี้"อินเตอร์เฟซ" ของโลกหมายถึง "supertype" ใด ๆ ของคลาส - อินเทอร์เฟซคลาสนามธรรมหรือซูเปอร์คลาสธรรมดาซึ่งเป็นนามธรรมและคอนกรีตน้อยกว่าคลาสย่อยที่เป็นรูปธรรมมากขึ้น

10
รหัสชั่วคราวควรอยู่ภายใต้การควบคุมเวอร์ชันและอย่างไร
นี่คือตัวอย่างของรหัสชั่วคราว / ท้องถิ่น มันเป็นสิ่งจำเป็นในการทำงานกับ codebase แต่จะเป็นอันตรายต่อการเป็นส่วนหนึ่งของมัน: ไฟล์โครงการ อาจจำเป็นต้องแก้ไขพา ธ เพื่อให้แสดงเลย์เอาต์บนพีซีปัจจุบัน makefiles ตัวอย่างเช่นการปรับให้เหมาะสมอาจต้องปิดในระหว่างการดีบัก แต่ไม่ใช่สำหรับเซิร์ฟเวอร์ CI แฮ็กสกปรกน่าเกลียด ตัวอย่างเช่นreturn 7ในช่วงกลางของฟังก์ชั่นเพื่อทดสอบบางสิ่งบางอย่างขึ้นอยู่กับฟังก์ชั่นและสงสัยว่าจะทำลายที่ 7 หรือ 7 เป็นรหัสของปุ่มยังไม่ได้ใช้ที่ฉันกำลังใช้และต้องทดสอบตลอด ชีวิตของสาขาของฉัน ฉันได้พยายามรักษาผู้ที่อยู่ในคอมไพล์กระทำที่ฉันมักจะ rebase ไปด้านบนก่อนที่จะผลักดันไป repo HEAD~และผลักดันแล้ว สิ่งนี้ค่อนข้างไม่สะดวกและไม่สามารถทำงานกับ svn ได้ Stashing ทำให้ฉันกลัวยิ่งขึ้น - "ฉันจำได้หรือไม่ว่าฉันจะโผล่ขึ้นมาหลังจากกด?" การทำให้โค้ดไม่อยู่ในการควบคุมเวอร์ชันจะทำให้เกิดเสียงที่ไม่พึงประสงค์ทุกครั้งที่มีการคอมมิชชันและอาจมีการนำไปใช้ในตอนเย็นวันศุกร์โดยไม่ตั้งใจ อะไรจะเป็นทางออกที่มีสติสำหรับรหัสการโยนทิ้งเช่น?

9
ทฤษฎี TDD เท่านั้น
น้อยกว่าหนึ่งปีที่ผ่านมาฉันโชคดีที่สามารถหยุดงานได้ 9 เดือน ฉันตัดสินใจว่าในเวลานั้นฉันจะฝึกฝนทักษะ C # ของฉัน ฉันเริ่มทำงานหลายโครงการและบังคับให้ตัวเองต้องติดตาม TDD มันเป็นกระบวนการที่ค่อนข้างกระจ่างแจ้ง มันยากในตอนแรก แต่เมื่อเวลาผ่านไปฉันเรียนรู้วิธีเขียนโค้ดที่ทดสอบได้มากขึ้น (ซึ่งกลายเป็นว่ามีแนวโน้มที่จะเป็นรหัสที่มั่นคงมากขึ้น) และในกระบวนการฉันก็เพิ่มทักษะการออกแบบ OO ของฉัน ตอนนี้ฉันกลับมาทำงานแล้วและฉันสังเกตเห็นบางสิ่งแปลก ๆ ฉันไม่ต้องการติดตาม TDD ฉันพบว่า TDD ทำให้ฉันช้าลงและทำให้ยากต่อการออกแบบแอปพลิเคชั่นที่สะอาด ฉันได้ใช้แนวทางที่แตกต่างเล็กน้อย (หนาแน่น) แทน เลือกชิ้นงานตามแนวตั้ง พัฒนาต้นแบบการทำงาน Refactor จนกว่าทุกอย่างจะดีและเป็นระเบียบ เอนหลังชื่นชมความสวยงามและรหัสที่ทดสอบได้ที่ฉันเขียน คุณอาจสังเกตเห็นว่าขั้นตอนที่ 1 ไม่ได้ "กำหนดพื้นผิวสาธารณะของเป้าหมายการทดสอบของฉัน" และขั้นตอนที่ 2 ไม่ใช่ "ทดสอบ bejesus จากพื้นผิวสาธารณะดังกล่าว" คุณอาจสังเกตเห็นว่าไม่มีขั้นตอนใดที่เกี่ยวข้องกับการทดสอบ ฉันกำลังเขียนโค้ดที่สามารถทดสอบได้ แต่ฉันยังไม่ได้ทดสอบ ... ตอนนี้ฉันต้องการทำให้ชัดเจนว่าจริง ๆ แล้วฉันไม่ได้ทำการทดสอบใด ๆ รหัสที่ฉันกำลังเขียนนั้นใช้งานได้ …

2
ทำไมตัวเชื่อมโยง Unix ถึงเรียกว่า“ ld”
พยายามค้นหาเว็บและไม่สามารถหาคำตอบได้ มันอาจมีบางอย่างเกี่ยวกับ "การโหลด" แต่นั่นก็ไม่สมเหตุสมผลสำหรับฉัน เห็นได้ชัดว่า "ln" ถูกใช้ไปแล้ว แต่นั่น "d" มาจากไหน
29 history 

3
เหตุใดบูลีนประเภทใน C ++ จึงสนับสนุน แต่ไม่ใช่ -
ทำไมโอเปอเรเตอร์ถึง--ไม่มีอยู่สำหรับบูลในขณะนั้นสำหรับโอเปอเรเตอร์++? ฉันลองใช้ C ++ แล้วและฉันไม่รู้ว่าคำถามของฉันใช้ได้กับภาษาอื่นหรือไม่ ฉันยินดีที่จะรู้ว่ายัง ฉันรู้ว่าฉันสามารถใช้โอเปอเรเตอร์++กับบูล มันทำให้บูลใด ๆ เท่ากับจริง bool b = false; b++; // Now b == true. ทำไมเราไม่สามารถใช้โอเปอเรเตอร์--ในทางตรงกันข้ามได้ bool b = true; b--; // Now b == false; มันไม่มีประโยชน์มาก แต่ฉันอยากรู้

5
คู่มือสไตล์สำหรับ C ++ [ปิด]
ตอนนี้ฉันกำลังใช้คู่มือสไตล์ C ++ ของ Googleในรหัส C ++ ของฉันและฉันก็ค่อนข้างพอใจกับมัน เมื่อเร็ว ๆ นี้ฉันได้รับแจ้งว่าคู่มือนี้ไม่ดีมาก: Google ใช้งานภายใน (ฉันรู้ว่า) ล้าสมัยและส่งเสริมการปฏิบัติที่ไม่ดีบางอย่าง ดังนั้นฉันต้องการใช้รูปแบบการเข้ารหัสอื่น มีคำแนะนำสไตล์ C ++ ที่ดีและใช้งานอย่างเป็นธรรมอะไรบ้าง? ฉันเขียนโค้ดสำหรับทั้ง gcc และ Visual Studio และฉันใช้คุณสมบัติ C ++ 11 มากมาย สิ่งที่ฉันชอบมากเกี่ยวกับคู่มือสไตล์ Google C ++คือการเยื้องช่องว่างและการตั้งชื่อ (โดยเฉพาะการตั้งชื่อคลาสทุกประเภท - รวมถึง typedefs, นามแฝงประเภทและนามแฝงเทมเพลต - ด้วยอักษรตัวใหญ่ตัวแรก) ฉันรู้ว่าคำตอบใด ๆ ที่เป็นอัตนัย (ฉันหวังว่านี่จะโอเคกับเว็บไซต์นี้) และฉันจะขอบคุณความคิดเห็นใด ๆ แต่ฉันสนใจที่จะใช้คำแนะนำในวันนี้

1
วิธีเขียนวัตถุประสงค์“ สมาร์ท” ในฐานะนักพัฒนาที่คล่องตัว
เช่นเดียวกับ บริษัท หลาย บริษัท ที่ผมทำงานที่กำลังอยู่ระหว่างการทบทวนระบบการปฏิบัติงานเป็นไปตามวัตถุประสงค์ของสมาร์ท ทีมงานของฉันคือการทำงานสูงทีมพัฒนาเปรียวจ้างการปฏิบัติจากการเขียนโปรแกรมมาก เพื่อประโยชน์อันยิ่งใหญ่ของเราการจ้างงานของเราในการปฏิบัติเปรียวได้รับการสนับสนุนอย่างเต็มที่จากการจัดการทันทีและบน เพื่อให้งานสำเร็จลุล่วงทีมของเราใช้การทำซ้ำสามสัปดาห์ นอกเหนือจากการทำซ้ำทันทีเรามีแผนทั่วไปออกเป็นไตรมาส ความหมายว่าสิ่งที่เราจะทำได้ไม่กี่ไตรมาสต่อจากนี้เป็นสิ่งที่อันตรายกว่าสิ่งที่เราจะประสบความสำเร็จในไตรมาสปัจจุบัน แน่นอนเรามีความคิดทั่วไปของการที่โครงการของเราจะมุ่งหน้าไป แต่คำหลักที่นี่คือทั่วไป ด้วยวิธีการของเราในการวางแผนโครงการสมาชิกในทีมของฉันรวมถึงตัวฉันเองพบว่ามันยากที่จะเขียนวัตถุประสงค์ที่เฉพาะเจาะจงวัดได้บรรลุได้เกี่ยวข้องและกำหนดขอบเขตเวลา (SMART) สองคำถามที่มีอยู่ในSoftwareEngineering.seดำเนินงานที่ดีของการแก้ไขบางส่วนของความกังวลของเรา: ตัวอย่างของวัตถุประสงค์ SMART ที่ดีสำหรับโปรแกรมเมอร์คืออะไร เป้าหมาย SMART มีประโยชน์สำหรับโปรแกรมเมอร์หรือไม่ อย่างไรก็ตามคำถามที่นำเสนอการตอบสนองทั่วไปมากกว่าเฉพาะสำหรับการจัดการกับเป้าหมายสมาร์ทเมื่อทำงานกับทีมพัฒนาเปรียว ในฐานะนักพัฒนาที่คล่องแคล่วคุณจะเขียนวัตถุประสงค์ระยะยาวห้าถึงเจ็ดปีซึ่งมีความเฉพาะเจาะจงวัดได้บรรลุได้มีความเกี่ยวข้องและมีเวลา จำกัด อย่างไร

2
วันนี้การวิพากษ์วิจารณ์ของเสียงกระเพื่อมสามัญใดยังคงใช้อยู่
ในการวิพากษ์วิจารณ์ของเสียงกระเพื่อมสามัญเขียนโดย Rodney A. Brooks และ Richard P. Gabriel จาก Stanford ในปี 1984 การออกแบบการตัดสินใจบางอย่างที่เก็บรักษาไว้โดยคณะกรรมการ Common Lisp แม้ว่าการอภิปรายส่วนใหญ่จะยังคงใช้ได้ แต่มีสองแถลงการณ์ที่อ้างถึงเทคโนโลยีที่มีอยู่ในขณะนั้นและอาจเป็นเท็จในวันนี้ ข้อความทั้งสองนี้คือ: ค่าใช้จ่ายของภาษามากเกินไปถูกยกเลิกด้วยการตักเตือนว่า 'ผู้รวบรวมที่ดี' สามารถดูแลพวกเขาได้ ยังไม่มีใครเขียน - และมีแนวโน้มที่จะไม่มีความพยายามอย่างมาก - คอมไพเลอร์ที่ใช้ส่วนของเทคนิคที่คาดหวัง ในขณะที่ฉันเป็นสามเณร Lisp สามัญหรือแม้กระทั่งเด็กฝึกงานฉันไม่สามารถเจาะจงได้มากกว่าผู้เขียน พวกเขาดูเหมือนจะกล่าวว่าลักษณะทั่วไปที่ดีและความยืดหยุ่นได้ถูกสร้างขึ้นในหลาย ๆ ด้านของภาษาซึ่งทำให้การเขียนคอมไพเลอร์ที่ดีค่อนข้างยาก ใน LISP สามัญการควบคุมมากเกินไปเล็กน้อยถูกวางไว้ในเลขคณิตจุดลอยตัว และแน่นอนว่าถึงแม้ว่าการทำงานที่ถูกต้องของโปรแกรม floating-point-point สามารถบรรลุได้ แต่ประสิทธิภาพอาจแตกต่างกันไป เท่าที่ฉันเข้าใจดูเหมือนว่าการเขียนรหัสตัวเลขที่มีประสิทธิภาพใน Common LISP เป็นไปได้ แต่มีความท้าทายมากกว่าที่จะเป็น เมื่อสามสิบปีก่อน ฉันจะพิจารณาคำแถลงเหล่านี้ได้อย่างไรถ้าฉันยินดีที่จะเขียนโปรแกรม Common LISP สำหรับการใช้งานซอฟต์แวร์เสรีอย่างใดอย่างหนึ่ง (CLISP, …

1
ตัวแยกวิเคราะห์ภาษาอังกฤษ (สำหรับ The Hobbit 1982)
รู้สึกทึ่งที่ได้อ่านเกี่ยวกับเกมผจญภัยข้อความThe Hobbitซึ่งมีตัวแยกวิเคราะห์ที่แข็งแกร่งอย่างเหลือเชื่อที่เรียกว่า "Inglish": ... อิงลิชอนุญาตให้พิมพ์ประโยคขั้นสูงเช่น "ถามแกนดัล์ฟเกี่ยวกับแผนที่แปลกประหลาดจากนั้นหยิบดาบและฆ่าหมุนรอบด้วย" โปรแกรมแยกวิเคราะห์มีความซับซ้อนและใช้งานง่ายแนะนำสรรพนามคำวิเศษณ์ ("โจมตีพวกผีร้าย") เครื่องหมายวรรคตอนและคำบุพบทและอนุญาตให้ผู้เล่นโต้ตอบกับโลกของเกมด้วยวิธีที่ไม่เคยเกิดขึ้นมาก่อน ฉันสงสัยว่าถ้าใครรู้เกี่ยวกับประวัติและ / หรือมรดกของเครื่องมือแยกวิเคราะห์ Inglish และโปรแกรมเมอร์ที่พัฒนามันขึ้นมา

5
นี่เป็น "กฎ" ที่เหมาะสมสำหรับการระบุสัญลักษณ์ "บิ๊กโอ" ของอัลกอริทึมหรือไม่?
ฉันได้เรียนรู้เพิ่มเติมเกี่ยวกับ Big O Notation และวิธีการคำนวณตามวิธีการเขียนอัลกอริทึม ฉันเจอชุด "กฎ" ที่น่าสนใจสำหรับการคำนวณอัลกอริธึมสัญลักษณ์ Big O และฉันต้องการดูว่าฉันอยู่ในเส้นทางที่ถูกต้องหรือไม่ สัญลักษณ์ Big O: N function(n) { For(var a = 0; i <= n; i++) { // It's N because it's just a single loop // Do stuff } } สัญลักษณ์ Big O: N 2 function(n, b) { For(var a …
29 algorithms  big-o 

9
ทำไมภาษาที่จำเป็น / OO ที่เป็นที่รู้จักกันดีส่วนใหญ่อนุญาตให้เข้าถึงประเภทที่สามารถแสดงถึงค่า 'ไม่มีอะไร' ได้โดยไม่ จำกัด
ผมได้อ่านเกี่ยวกับ (UN) ความสะดวกสบายของการมีnullแทน Maybe(ตัวอย่าง) หลังจากที่ได้อ่านบทความนี้ , ผมเชื่อว่ามันจะดีกว่าที่จะใช้Maybe (หรือบางสิ่งบางอย่างที่คล้ายกัน) อย่างไรก็ตามฉันรู้สึกประหลาดใจที่เห็นว่าภาษาการเขียนโปรแกรมเชิงวัตถุหรือเชิงวัตถุที่มีชื่อเสียง "ยังคงใช้อยู่null(ซึ่งอนุญาตการเข้าถึงชนิดที่ไม่ถูกตรวจสอบซึ่งสามารถแสดงถึงค่า 'ไม่มีอะไร') และMaybeส่วนใหญ่จะใช้ในภาษาโปรแกรมเชิงฟังก์ชัน ตัวอย่างเช่นดูรหัส C # ต่อไปนี้: void doSomething(string username) { // Check that username is not null // Do something } มีบางอย่างมีกลิ่นไม่ดีที่นี่ ... ทำไมเราควรตรวจสอบว่าข้อโต้แย้งนั้นเป็นโมฆะหรือไม่ เราไม่ควรคิดว่าทุกตัวแปรมีการอ้างอิงไปยังวัตถุหรือไม่? อย่างที่คุณเห็นปัญหาคือว่าโดยนิยามตัวแปรเกือบทั้งหมดสามารถมีการอ้างอิงที่เป็นโมฆะ เกิดอะไรขึ้นถ้าเราสามารถตัดสินใจว่าตัวแปรใดเป็น "โมฆะ" และไม่ได้? นั่นจะช่วยเราได้มากในขณะที่ทำการดีบั๊กและมองหา "NullReferenceException" ลองจินตนาการว่าโดยค่าเริ่มต้นไม่มีประเภทอาจมีอ้างอิงโมฆะ แทนที่จะเป็นเช่นนั้นคุณจะระบุอย่างชัดเจนว่าตัวแปรสามารถมีการอ้างอิงที่เป็นโมฆะได้เฉพาะในกรณีที่คุณต้องการ นั่นคือความคิดเบื้องหลังบางที หากคุณมีฟังก์ชั่นที่ในบางกรณีล้มเหลว (ตัวอย่างเช่นการหารด้วยศูนย์) คุณสามารถส่งกลับMaybe<int>ระบุอย่างชัดเจนว่าผลลัพธ์อาจเป็น int แต่ยังไม่มีอะไร! นี่คือเหตุผลหนึ่งที่ต้องการบางทีอาจจะแทนที่จะเป็นโมฆะ …

2
เหตุใด Java จึงใช้ UTF-16 สำหรับการแทนค่าสตริงภายใน
ฉันคิดว่าเหตุผลนั้นเร็วอาเรย์ชอบเข้าถึงตัวละครที่ดัชนี แต่ตัวละครบางตัวไม่พอดีกับ 16 บิตดังนั้นมันจะไม่ทำงาน ... ดังนั้นถ้าคุณต้องจัดการกับกรณีพิเศษอยู่แล้วทำไมไม่ใช้ UTF-8 ล่ะ?
29 java  strings  unicode 

5
ทำไม Java / C # ไม่สามารถใช้ RAII ได้
คำถาม: ทำไม Java / C # ไม่สามารถใช้ RAII ได้ ชี้แจง: ฉันรู้ว่าตัวรวบรวมขยะไม่ได้กำหนดไว้ ดังนั้นด้วยคุณสมบัติภาษาปัจจุบันจึงเป็นไปไม่ได้ที่วิธีการกำจัด () ของวัตถุจะถูกเรียกโดยอัตโนมัติเมื่อออกจากขอบเขต แต่สามารถเพิ่มคุณสมบัติพิเศษดังกล่าวได้หรือไม่ ความเข้าใจของฉัน: ฉันรู้สึกว่าการนำไปปฏิบัติของ RAII ต้องเป็นไปตามข้อกำหนดสองประการ: 1. อายุการใช้งานของทรัพยากรจะต้องอยู่ในขอบเขต 2. โดยปริยาย การเพิ่มทรัพยากรต้องเกิดขึ้นโดยไม่มีคำสั่งอย่างชัดเจนจากโปรแกรมเมอร์ คล้ายกับตัวรวบรวมขยะที่เพิ่มหน่วยความจำโดยไม่ต้องมีคำสั่งที่ชัดเจน "implicitness" จะต้องเกิดขึ้นเมื่อใช้งานในชั้นเรียนเท่านั้น แน่นอนว่าผู้สร้างไลบรารีคลาสต้องใช้เมธอด destructor หรือ Dispose () อย่างชัดเจน Java / C # พอใจจุดที่ 1 ใน C # ทรัพยากรการใช้ IDisposable สามารถถูกผูกไว้กับขอบเขต "using": void test() { using(Resource …

8
การแยกรหัสและข้อมูลกลายเป็นวิธีปฏิบัติได้อย่างไร
โปรดอ่านคำถามอย่างระมัดระวัง: จะถามว่าไม่ว่าทำไม ฉันเพิ่งเจอคำตอบนี้ซึ่งแนะนำให้ใช้ฐานข้อมูลเพื่อเก็บข้อมูลที่ไม่เปลี่ยนรูปแบบ: ดูเหมือนว่าตัวเลขเวทมนต์มากมายที่คุณอธิบายโดยเฉพาะอย่างยิ่งหากเป็นส่วนที่ขึ้นกับข้อมูลจริง ๆ ไม่ใช่รหัส [... ] มันอาจหมายถึงฐานข้อมูลประเภท SQL หรืออาจหมายถึงไฟล์ข้อความที่จัดรูปแบบ มันจะดูเหมือนกับผมว่าถ้าคุณมีข้อมูลที่เป็นส่วนหนึ่งของสิ่งที่โปรแกรมของคุณไม่แล้วสิ่งที่ต้องทำคือการใส่ไว้ในโปรแกรม ตัวอย่างเช่นหากฟังก์ชั่นโปรแกรมของคุณคือการนับเสียงสระมีอะไรผิดปกติvowels = "aeiou"หรือไม่ ท้ายที่สุดแล้วภาษาส่วนใหญ่มีโครงสร้างข้อมูลที่ออกแบบมาเพื่อการใช้งานนี้อย่างแม่นยำ เหตุใดคุณจึงต้องแยกข้อมูลโดยใส่ใน "ไฟล์ข้อความที่จัดรูปแบบ" ตามที่แนะนำข้างต้น ทำไมไม่เพียงทำให้ไฟล์ข้อความนั้นถูกจัดรูปแบบในภาษาการเขียนโปรแกรมที่คุณเลือก ตอนนี้มันเป็นฐานข้อมูลหรือไม่ หรือมันคือรหัส? ฉันแน่ใจว่าบางคนจะคิดว่านี่เป็นคำถามที่โง่ แต่ฉันถามมันอย่างจริงจัง ฉันรู้สึกว่า "การแยกรหัสและข้อมูล" กำลังเกิดขึ้นทางวัฒนธรรมเนื่องจากความจริงที่เห็นได้ชัดในตัวเองพร้อมกับสิ่งที่ชัดเจนอื่น ๆ เช่น "ไม่ให้ตัวแปรของคุณทำให้ชื่อที่ทำให้เข้าใจผิด" และ "อย่าหลีกเลี่ยงการใช้ช่องว่างเพราะภาษาของคุณพิจารณา มันไม่มีนัยสำคัญ " ใช้ตัวอย่างเช่นบทความนี้: ปัญหากับข้อมูลแยกจากรหัสหุ่นกระบอก ปัญหาเหรอ มีปัญหาอะไร? ถ้าPuppetเป็นภาษาสำหรับอธิบายโครงสร้างพื้นฐานของฉันทำไมมันถึงอธิบายไม่ได้ว่า nameserver คือ 8.8.8.8 สำหรับฉันแล้วดูเหมือนว่าปัญหาไม่ใช่รหัสและข้อมูลนั้นปะปนกันอยู่1แต่ Puppet ขาดโครงสร้างข้อมูลที่สมบูรณ์และวิธีการเชื่อมต่อกับสิ่งอื่น ๆ ฉันพบว่าการเปลี่ยนแปลงนี้รบกวน การเขียนโปรแกรมเชิงวัตถุกล่าวว่า "เราต้องการโครงสร้างข้อมูลที่หลากหลายตามอำเภอใจ" และมอบโครงสร้างข้อมูลด้วยพลังของรหัส …

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