คำถามติดแท็ก language-design

แท็กสำหรับคำถามที่เกี่ยวข้องกับการออกแบบทุกแง่มุมของภาษาโปรแกรม

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

13
เหตุใด C # จึงไม่อนุญาตให้ใช้ตัวแปรโลคัลแบบอ่านอย่างเดียว
มีการถกเถียงอย่างเป็นกันเองกับเพื่อนร่วมงานเกี่ยวกับเรื่องนี้ เรามีความคิดบางอย่างเกี่ยวกับเรื่องนี้ แต่สงสัยว่ากลุ่ม SO คิดอย่างไรกับเรื่องนี้?

17
เหตุใดการสืบทอดหลายรายการจึงไม่อนุญาตใน Java หรือ C #
ฉันรู้ว่าไม่อนุญาตให้มีการสืบทอดหลายรายการใน Java และ C # หนังสือหลายเล่มบอกว่าไม่อนุญาตให้มีการสืบทอดหลาย ๆ แต่สามารถใช้งานได้โดยใช้อินเทอร์เฟซ ไม่มีการพูดคุยเกี่ยวกับสาเหตุที่ไม่อนุญาต ใครช่วยบอกทีว่าทำไมถึงไม่อนุญาต?

5
เหตุใด C # 3.0 object initializer constructor จึงเป็นตัวเลือกเสริม
ดูเหมือนว่าไวยากรณ์ของตัวเริ่มต้นออบเจ็กต์ C # 3.0 จะอนุญาตให้มีหนึ่งในการยกเว้นคู่เปิด / ปิดของวงเล็บในตัวสร้างเมื่อมีตัวสร้างที่ไม่มีพารามิเตอร์อยู่ ตัวอย่าง: var x = new XTypeName { PropA = value, PropB = value }; ตรงข้ามกับ: var x = new XTypeName() { PropA = value, PropB = value }; ฉันสงสัยว่าทำไมคู่ของวงเล็บเปิด / ปิดตัวสร้างจึงเป็นตัวเลือกที่นี่หลังจากนั้นXTypeName?

5
เหตุใดพารามิเตอร์ const จึงไม่อนุญาตให้ใช้ใน C #
มันดูแปลกโดยเฉพาะสำหรับนักพัฒนา C ++ ใน C ++ เราใช้เพื่อทำเครื่องหมายพารามิเตอร์เป็นconstเพื่อให้แน่ใจว่าสถานะจะไม่เปลี่ยนแปลงในวิธีการ นอกจากนี้ยังมีเหตุผลเฉพาะอื่น ๆ ของ C ++ เช่นการส่งผ่านconst refเพื่อส่งต่อโดยอ้างอิงและต้องแน่ใจว่าสถานะจะไม่เปลี่ยนแปลง แต่ทำไมเราไม่สามารถทำเครื่องหมายเป็นพารามิเตอร์วิธี const ใน C # ได้? เหตุใดฉันจึงประกาศวิธีการดังต่อไปนี้ไม่ได้ .... static void TestMethod1(const MyClass val) {} .... static void TestMethod2(const int val) {} ....

7
PHP ทั่วโลกในฟังก์ชัน
ยูทิลิตี้ของคำหลักสากลคืออะไร? มีเหตุผลใดบ้างที่จะชอบวิธีการหนึ่งมากกว่าวิธีอื่น ความปลอดภัย? ประสิทธิภาพ? มีอะไรอีกไหม วิธีที่ 1: function exempleConcat($str1, $str2) { return $str1.$str2; } วิธีที่ 2: function exempleConcat() { global $str1, $str2; return $str1.$str2; } เมื่อไม่ได้ทำให้ความรู้สึกที่จะใช้global? สำหรับฉันดูเหมือนจะอันตราย ... แต่มันอาจจะเป็นแค่การขาดความรู้ ฉันสนใจในเอกสาร (เช่นตัวอย่างรหัสลิงก์ไปยังเอกสารประกอบ ... ) เหตุผลทางเทคนิค ขอบคุณล่วงหน้า! เงินรางวัล นี่เป็นคำถามทั่วไปที่ดีเกี่ยวกับหัวข้อนี้ฉัน (@Gordon) กำลังเสนอเงินรางวัลเพื่อรับคำตอบเพิ่มเติม ไม่ว่าคำตอบของคุณจะเห็นด้วยกับของฉันหรือให้มุมมองที่แตกต่างออกไปก็ไม่สำคัญ เนื่องจากมีglobalหัวข้อปรากฏขึ้นเป็นระยะ ๆ เราจึงสามารถใช้คำตอบแบบ "บัญญัติ" ที่ดีเพื่อเชื่อมโยง


3
การนับเดือนตามศูนย์ [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ภาษาการเขียนโปรแกรมยอดนิยมบางภาษาใช้การกำหนดหมายเลขเดือนซึ่งปิดด้วย 1 - JavaScript อยู่ในใจเช่นเดียวกับ Java และหากหน่วยความจำทำหน้าที่ C ก็เป็นอีกภาษาหนึ่ง ฉันมีคำถาม: หากคุณกำลังจะเพิกเฉยต่อการใช้เลขเดือนที่คนทั่วไปใช้แล้วทำไมไม่เพื่อความสอดคล้องกันก็ละเว้นการนับวันที่คนทั่วไปใช้และนับวันในแต่ละเดือนโดยเริ่มจาก 0 ทำไมเรื่องนี้เป็นเรื่องธรรมดา ความคิดนี้เป็นของใครตั้งแต่แรก?

6
การเรียกใช้เมธอด Java varargs ด้วยอาร์กิวเมนต์ null เดียว?
ถ้าฉันมีวิธี vararg Java foo(Object ...arg)และฉันเรียกfoo(null, null)ฉันมีทั้งสองอย่างarg[0]และarg[1]เป็นnulls แต่ถ้าผมเรียกfoo(null), argตัวเองเป็นโมฆะ เหตุใดจึงเกิดขึ้น จะเรียกfooเช่นนั้นfoo.length == 1 && foo[0] == nullได้trueอย่างไร?

4
จะแทนที่ '::' ด้วย ' สร้างความคลุมเครือใน C ++ หรือไม่
ใน C ++ ตัวดำเนินการ::ถูกใช้เพื่อเข้าถึงคลาสฟังก์ชันและตัวแปรในเนมสเปซหรือคลาส หากข้อกำหนดทางภาษาที่ใช้.แทน::ในกรณีเหล่านั้นเช่นกันเช่นเมื่อเข้าถึงตัวแปร / วิธีการของวัตถุแล้วจะทำให้เกิดความคลุมเครือที่อาจเกิดขึ้นซึ่งไม่ได้มีอยู่ด้วย::หรือไม่? เนื่องจาก C ++ ไม่อนุญาตให้ใช้ชื่อตัวแปรที่เป็นชื่อประเภทด้วยฉันไม่สามารถนึกถึงกรณีที่อาจเกิดขึ้นได้ ชี้แจง: ฉันไม่ได้ถามว่าทำไมถึง::เลือก.แม้ว่ามันจะทำงานได้เช่นกัน?

7
ปัจจัยใน R: มากกว่าความรำคาญ?
ประเภทข้อมูลพื้นฐานชนิดหนึ่งใน R คือปัจจัย จากประสบการณ์ของฉันปัจจัยโดยพื้นฐานแล้วเป็นความเจ็บปวดและฉันไม่เคยใช้มัน ฉันมักจะแปลงเป็นตัวละคร ฉันรู้สึกแปลก ๆ เหมือนขาดอะไรไป มีตัวอย่างที่สำคัญบางอย่างของฟังก์ชันที่ใช้ปัจจัยเป็นตัวแปรในการจัดกลุ่มที่ประเภทข้อมูลปัจจัยจำเป็นหรือไม่? มีสถานการณ์เฉพาะที่ฉันควรใช้ปัจจัยหรือไม่?

10
เหตุใด C ++ จึงไม่อนุญาตให้สืบทอดมิตรภาพ
เหตุใดอย่างน้อยมิตรภาพจึงไม่สามารถสืบทอดได้ใน C ++? ฉันเข้าใจว่าการเคลื่อนย้ายและการสะท้อนกลับถูกห้ามด้วยเหตุผลที่ชัดเจน (ฉันพูดสิ่งนี้เพื่อตัดคำตอบของใบเสนอราคาคำถามที่พบบ่อยธรรมดา ๆ เท่านั้น) แต่ฉันขาดบางสิ่งบางอย่างตามแนวของvirtual friend class Foo;ปริศนา มีใครทราบความเป็นมาทางประวัติศาสตร์เบื้องหลังการตัดสินใจครั้งนี้บ้าง? มิตรภาพเป็นเพียงการแฮ็คที่ จำกัด ซึ่งนับตั้งแต่นั้นมาก็กลายเป็นการใช้งานที่น่านับถือที่คลุมเครือไม่กี่อย่าง? แก้ไขเพื่อความกระจ่าง:ฉันกำลังพูดถึงสถานการณ์ต่อไปนี้ไม่ใช่ที่ที่เด็กของ A สัมผัสกับ B หรือทั้ง B และลูก ๆ ของมัน ฉันยังสามารถจินตนาการได้ว่าการอนุญาตให้เข้าถึงการลบล้างฟังก์ชันของเพื่อนเป็นต้น class A { int x; friend class B; }; class B { // OK as per friend declaration above. void foo(A& a, int n) { …

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

5
การใช้การอนุมานประเภท
ฉันเห็นการอภิปรายที่น่าสนใจเกี่ยวกับการพิมพ์แบบคงที่และแบบไดนามิก โดยทั่วไปฉันชอบการพิมพ์แบบคงที่เนื่องจากการตรวจสอบประเภทการคอมไพล์โค้ดเอกสารที่ดีกว่าเป็นต้นอย่างไรก็ตามฉันยอมรับว่ามันทำให้โค้ดรกถ้าทำแบบที่ Java ทำ ดังนั้นฉันกำลังจะเริ่มสร้างภาษาสไตล์การทำงานของตัวเองและการอนุมานประเภทเป็นหนึ่งในสิ่งที่ฉันต้องการนำไปใช้ ฉันเข้าใจว่ามันเป็นเรื่องใหญ่และฉันไม่ได้พยายามสร้างสิ่งที่ยังไม่เคยทำมาก่อนเพียงแค่การอนุมานขั้นพื้นฐาน ... มีคำแนะนำเกี่ยวกับสิ่งที่ต้องอ่านที่จะช่วยฉันในเรื่องนี้หรือไม่? โดยเฉพาะอย่างยิ่งสิ่งที่เป็นประโยชน์ / ปฏิบัติมากกว่าเมื่อเทียบกับทฤษฎีหมวดหมู่เชิงทฤษฎี / ตำราทฤษฎีประเภทอื่น ๆ หากมีข้อความอภิปรายเกี่ยวกับการนำไปใช้งานพร้อมโครงสร้างข้อมูล / อัลกอริทึมนั่นก็น่าจะดี

9
เหตุใดจึงต้องออกแบบภาษาด้วยประเภทที่ไม่ระบุตัวตน
นี่เป็นสิ่งที่ทำให้ฉันติดขัดในฐานะคุณลักษณะของนิพจน์แลมบ์ดา C ++ ประเภทของนิพจน์แลมบ์ดา C ++ นั้นไม่เหมือนใครและไม่ระบุตัวตนฉันไม่สามารถเขียนมันลงไปได้ แม้ว่าฉันจะสร้างแลมบ์ดาสองตัวที่มีวากยสัมพันธ์เหมือนกันทุกประการ แต่ประเภทผลลัพธ์ก็ถูกกำหนดให้แตกต่างกัน ผลที่ตามมาคือ a) lambdas สามารถส่งผ่านไปยังฟังก์ชันเทมเพลตที่อนุญาตให้ส่งต่อเวลาคอมไพล์ประเภทที่ไม่สามารถบรรยายได้พร้อมกับออบเจ็กต์และ b) lambdas นั้นมีประโยชน์ก็ต่อเมื่อถูกลบผ่านประเภทstd::function<>เท่านั้น โอเค แต่นั่นเป็นเพียงวิธีที่ C ++ ทำฉันก็พร้อมที่จะเขียนมันออกมาเป็นเพียงคุณลักษณะที่น่ารำคาญของภาษานั้น อย่างไรก็ตามฉันเพิ่งเรียนรู้ว่า Rust ดูเหมือนจะเหมือนกัน: ฟังก์ชัน Rust หรือแลมบ์ดาแต่ละฟังก์ชันมีลักษณะเฉพาะและไม่ระบุตัวตน และตอนนี้ฉันสงสัยว่า: ทำไม? ดังนั้นคำถามของฉันคือ สิ่งนี้มีข้อดีอย่างไรจากมุมมองของนักออกแบบภาษาในการแนะนำแนวคิดของประเภทที่ไม่ซ้ำใครและไม่ระบุตัวตนในภาษา

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