ข้อความนี้เกี่ยวกับ C # และ Java ที่เป็นครึ่งหนึ่งของภาษาหมายถึงอะไร [ปิด]


32

ในบทความ: ทำไม POCOมีประโยคนี้:

Maciej Sobczak ทำให้มันดี:“ ฉันไม่ชอบเมื่อมีคนให้ภาษาครึ่งหนึ่งกับฉันและบอกฉันว่ามันเป็นของฉันเอง”

ฉันไม่เข้าใจสิ่งที่เขาหมายถึงแม้ว่าC # เป็นเจ้าของโดย Microsoft & Java เป็นของ Oracleแต่ก็ไม่ได้หมายความว่าพวกเขามีภาษาอยู่ครึ่งภาษาใช่หรือไม่ ฉันไม่พบหลักฐานใด ๆ ที่จะพิสูจน์ประโยคนั้นและฉันอยากรู้จริงๆเกี่ยวกับเรื่องนี้ และยิ่งอยากรู้มากขึ้นเกี่ยวกับส่วน 'สำหรับการป้องกันของฉันเอง'


12
ฉันตีความว่าเป็นคำวิจารณ์ที่ไม่อนุญาตให้โปรแกรมเมอร์ทำสิ่งต่าง ๆ เช่นจัดสรรหน่วยความจำได้อย่างอิสระและหน่วยความจำอิสระและ "การป้องกัน" แบบนั้น แต่ฉันไม่แน่ใจว่าเป็นจุดที่เขาพยายามทำหรือไม่
Kayaman

15
ฉันไม่แน่ใจอย่างแน่นอนเพราะบทความที่เขาอ้างมาดูเหมือนจะตายไปแล้ว แต่ดูเหมือนว่าเขากำลังพูดว่า Java และ C # ขาดคุณสมบัติที่เป็นอันตรายหรือแย้งมากกว่าของ C ++ เช่นมรดกหรือแม่แบบหลายรายการ
GoatInTheMachine

3
บริบทของการเสนอราคาหายไป (ลิงค์คือ 404) ดังนั้นสิ่งเดียวที่คุณจะได้รับจากที่นี่คือผู้คนคาดเดาสิ่งที่เขาอาจหมายถึงหรือคนที่มีแนวโน้มที่จะแสดงความคิดเห็นของตัวเอง หากคุณต้องการทราบบริบทเช่นสิ่งที่อยู่ในหน้าหายไปทางออกที่ดีที่สุดคือการเขียนผู้เขียนโดยตรงหรืออาจลองค้นหาหน้าที่หายไปผ่านเครื่อง wayback หรือที่คล้ายกัน
JacquesB

2
คำแถลงนั้นหายไปจากจุดนั้นแม้ว่าคุณจะสามารถจัดการกับมันได้คุณก็ไม่ต้องการเปิดเผยทุกแง่มุมของการพัฒนาซอฟต์แวร์ในภาษา แน่นอนว่าคุณอาจไม่มีปัญหาในการอ่านรหัสการจัดการหน่วยความจำ แต่ผู้พัฒนารายอื่นอาจไม่ตื่นเต้นอย่างมากที่จะดูแลรหัสนั้น มันคล้ายกับแนวคิดของการห่อหุ้ม นอกจากนี้ C # ยังช่วยให้คุณสามารถเข้าถึงสิ่งต่าง ๆ ได้ไม่ จำกัด , คอมไพเลอร์คำสั่ง, คุณสมบัติพิเศษ, และการสะท้อน, ไม่ใช่ว่าควรใช้สิ่งเหล่านั้น,
Mark Rogers

32
เพื่อประโยชน์ของคุณเองอย่าใส่ใจคนที่คิดว่าภาษาจะต้องมีคุณสมบัติทั้งหมดของ C ++ ที่จะได้รับการพิจารณาว่าเป็น "ของจริง" และ "สมบูรณ์" อย่าใส่ใจกับคนที่คิดว่าความปลอดภัยประเภทความปลอดภัยของหน่วยความจำและพฤติกรรมที่กำหนดไว้อย่างดีคือ "วงล้อฝึกอบรม" ความถูกต้องได้กลายเป็นสิ่งสำคัญที่สุดของซอฟต์แวร์ในอุตสาหกรรมส่วนใหญ่และผู้ที่มีความภาคภูมิใจในการไม่ใส่ใจกับมันจะกลายเป็นสิ่งที่ไม่เกี่ยวข้องในไม่ช้า
Theodoros Chatzigiannakis

คำตอบ:


162

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

ประเด็นก็คือมีข้อ จำกัด เหล่านั้นทั้งหมดถูกใส่ลงในภาษาการเขียนโปรแกรมด้วยเหตุผล เราไม่ได้มีภาษาที่ได้รับอนุญาตทั้งหมดนี้ เมื่อเวลาผ่านไปเราพบว่าโปรแกรมเมอร์โดยเฉลี่ยนั้นดีกว่าด้วยข้อ จำกัด และการจับมือกันเพราะศักยภาพของการทำผิดพลาดที่เลวร้ายจริงๆนั้นยอดเยี่ยมเกินกว่าที่จะคุ้มค่ากับพลังเพิ่มเติมและการแสดงออก

(เห็นได้ชัดว่าในบางครั้งผู้เขียนโปรแกรมจะรำคาญซึ่งไม่ต้องการมือมากนักบางครั้งการร้องเรียนของพวกเขาถูกต้องตามกฎหมาย แต่ผู้คนไม่ดีอย่างมากที่ประเมินทักษะของตนเองและหลายคนที่คิดว่าพวกเขาไม่ต้องการการป้องกันใน จริง ๆ แล้วต้องการมันมากไม่ใช่เรื่องง่ายเลยที่จะแยกแยะสติปัญญาที่เหนือกว่าจริง ๆ ที่รู้สึกว่าถูก จำกัด ด้วยภาษาระดับสูงจากโคเดกเฉลี่ยที่คิดว่าการบ่นจะทำให้พวกเขาดูดีกว่าหรือใครไม่รู้ ดีกว่าใด ๆ )


67
นี่คือคำตอบของฉันข้ามไป
Neil

71
นอกจากนี้ฉันจะเพิ่มว่าไม่มีสิ่งเช่นปัญญาที่เหนือกว่าที่ไม่ต้องการข้อ จำกัด มันปลอดภัยเสมอที่จะคิดว่าทุกคนจะสับสนไม่ช้าก็เร็ว และโดยปกติแล้วสติปัญญาที่เหนือกว่าความผิดพลาดที่ใหญ่กว่า
Neil

29
Java และ C # มีอะไรมากกว่าแค่ป้องกันไม่ให้ผู้คนยิงตัวเองด้วยการเดินเท้า การจัดการหน่วยความจำใช้เวลาและความพยายามของนักพัฒนาจำนวนมากก่อนที่การรวบรวมขยะจะมาพร้อมและเป็นการยากที่จะจัดการหน่วยความจำด้วยตนเองอย่างถูกต้อง การรวบรวมขยะช่วยเพิ่มผลผลิตของโปรแกรมเมอร์
Robert Harvey

12
@RobertHarvey ฉันเห็นด้วย 100% ในฐานะโปรแกรมเมอร์ C ++ ที่ยาวนานฉันจึงไม่เชื่อในการจัดการหน่วยความจำอัตโนมัติเมื่อย้ายไปที่ C # เมื่อฉันได้ผ่านมาแล้วมันเป็นอิสระอย่างไม่น่าเชื่อที่จะต้องกังวลเกี่ยวกับมัน 99% ของเวลา มันทำให้สมองของฉันเป็นอิสระที่จะคิดเกี่ยวกับปัญหาอื่น ๆ แทน
17 ของ 26

8
"กำหนดวัตถุใด ๆ ให้กับวัตถุอื่นโดยไม่ จำกัด ชนิด" ... งั้นdynamicเหรอ?
Arturo Torres Sánchez

34

นี่เป็นคำอธิบายที่ค่อนข้างดีในแหล่งอ้างอิงต้นฉบับ :

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

[ ... ]

ฉันเล่นกับ C ++ ต่อไปและเทคนิคการเขียนซอฟต์แวร์ที่มีประสิทธิภาพ เพื่อให้ได้มุมมองที่กว้างขึ้นในด้านซอฟต์แวร์ที่เชื่อถือได้ฉันตัดสินใจลงทุนเวลาในการเรียนรู้ Ada (และเนื้อหาที่เกี่ยวข้อง) ซึ่งเป็นภาษาที่ดูเหมือนจะถูกละทิ้งโดยธุรกิจแม้ว่าจะเป็น Ada ที่ได้รับการออกแบบมาเพื่อความซับซ้อนและเชื่อถือได้ ระบบ ฉันต้องยอมรับว่าการเรียนรู้ Ada นั้นมีประโยชน์จริง ๆ สำหรับฉันในแง่ที่ว่ามันทำให้ฉันสามารถดูวิธีการทำงานและการพัฒนาของฉันได้ดีขึ้น สิ่งสำคัญที่สุดคือความคิดบางส่วนจากโลก Ada สามารถนำไปใช้โดยตรงกับ C ++ ได้มากขึ้นหรือน้อยลงด้วยผลลัพธ์ที่ดีในด้านความแข็งแกร่งและความถูกต้อง

[ ... ]

ตกลงฉันลืม ฉันสาบานวันหนึ่งว่าไม่ต้องเรียนรู้ Java แต่ฉันทำ. ดีเท่าที่ฉันสามารถอ่านและเขียนรหัสการทำงานได้ ฉันได้อ่าน 'การคิดใน Java' (มีออนไลน์ฟรี) และ 'Core Java' (ไม่ออนไลน์ไม่ฟรี) ฉันยังถูกผูกมัดทางอ้อมในการพัฒนา Java บางอย่างและ ... ดีฉันไม่ซื้อ มัน. ฉันไม่ชอบเมื่อมีคนให้ภาษาครึ่งหนึ่งกับฉันและบอกฉันว่ามันเป็นของฉันเอง มันเหมือนค้อนกระดาษทำไฟเพื่อให้ไม่มีใครทำร้ายตัวเองเมื่อกดนิ้ว ... เช่นเดียวกับ C # ฉันเลือกค้อนเลื่อนเหล็กเพื่อให้แน่ใจได้ว่าเมื่อฉันต้องการเล่น Macho มันจะทนได้
คำถามคือ - ทำไมผู้คนจำนวนมากใช้ (Java, C #, ฯลฯ )? อืม ... อาจเป็นเพราะมันยอดเยี่ยมมากในบางที่ แต่มีบางสถานการณ์ที่ทั้งภาษาและห้องสมุดแสดงให้เห็นว่ามันถูกออกแบบมาสำหรับแอปเพล็ต (ตอนแรก) แทนที่จะเป็นสิ่งที่ต้องทำทุกอย่าง เพียงแค่สัญญามากเกินไปและให้เทคโนโลยีน้อยเกินไป หรือเป็นทางออกที่สามารถไถนาเหนือการแข่งขันใด ๆ ..

ฉันชอบ C ++ เมื่อต้องการพลังสูงสุดและมุมมองที่กว้างที่สุด ในสถานที่ที่การแสดงออกของ C ++ ไม่จำเป็นต้องใช้ภาษาเช่น Tcl หรือ Python ดูเหมือนจะพอดีกับใบเรียกเก็บเงิน ไม่เพียง แต่พวกเขาจะเปิดกว้างเกี่ยวกับวิวัฒนาการของพวกเขาเท่านั้น แต่เราสามารถขยายและฝังพวกเขาขึ้นอยู่กับความต้องการเป็นพิเศษ ฉันเห็นความเป็นไปได้มากมายที่ฝันถึงเทคโนโลยีเหล่านั้น ฉันมักจะละทิ้ง C เป็นภาษาสำหรับการเขียนโปรแกรมปกติ - นี่ดูเหมือนจะเป็นตัวเลือกที่สมเหตุสมผลเพียงเป็นเป้าหมายสำหรับการสร้างรหัสมิฉะนั้นจะเกิดข้อผิดพลาดได้ง่ายเกินไป วันนี้ Ada มาเป็นทางเลือกที่สองของฉันสำหรับโครงการที่จริงจังมากขึ้นโดยที่ฉันมีทางเลือกฟรี (ซึ่งน่าเสียดายที่ไม่ใช่กรณีส่วนใหญ่)

ดังนั้นในคำอื่น ๆ ผู้เขียนอ้างว่าชอบ C ++ และเขาไม่ชอบ Java และเขารู้สึกว่า Java หายไปครึ่งหนึ่งของ C ++ และนั่นคือทั้งหมดที่มีต่อคำพูดนั้น


18
กระแทกแดกดันเขาไม่ชอบ C ด้วยเหตุผลเดียวกันกับที่เขาชอบ C ++ มันเปิดมากทำให้มีพลังงานมากและมีข้อผิดพลาดมากมาย
GreySage

8
เขาคิดว่า C ++ แสดงออกได้ดีกว่า Python
benxyzzy

12
@GreySage ที่จับตาของฉันด้วย ... C เป็นข้อผิดพลาดง่ายเกินไป แต่ C # ไม่ให้พลังงานเพียงพอหรือไม่ C นั้นห่างไกลจาก C ++ หรือไม่ C # ไม่มีมุม "ไม่ปลอดภัย" ที่ให้คุณควบคุมได้มากกว่านี้ ความคิดเห็นที่น่าสนใจที่ผสมผสานกันอย่างแน่นอน ...
WernerCD

10
@WernerCD ไม่สามารถบอกได้อย่างชัดเจนเกี่ยวกับ C # ที่ไม่ปลอดภัย แต่ C และ C ++ ไม่มีอะไรที่เหมือนกันมากนักยกเว้นว่าคุณสามารถเอาชนะ C90 snippet พื้นฐานเป็น C ++ ที่ถูกต้อง - ish snippet ที่คอมไพเลอร์จะไม่ทำให้หายใจไม่ออก
เควนติน

23

บทความที่เชื่อมโยงไปยังบล็อกที่คุณโพสต์ถูกลบไปแล้วดังนั้นจึงเป็นเรื่องยากที่จะตรวจสอบ แต่อย่างที่ Kilian กล่าวว่าเป็นไปได้ว่าเมื่อเขาพูดว่า "ครึ่งภาษา" เขาหมายถึง C # และ Java รู้สึกเหมือน C ++ คุณสมบัติและโครงสร้างที่ถูกลบเพื่อให้ง่ายต่อการใช้หรือปลอดภัยยิ่งขึ้น

ย้อนกลับไปในปี 2549 เมื่อมีการเขียนเมื่อ C # ยังค่อนข้างเล็กและ Java มีหลายอย่างที่ยังไม่บรรลุนิติภาวะและเมื่อ power กับความปลอดภัยดูเหมือนจะเป็นการแลกเปลี่ยนที่คุณสามารถเลือกได้เพียงครั้งเดียวนี่ไม่ใช่ตำแหน่งที่ไม่สมเหตุสมผลทั้งหมด .

ทุกวันนี้ตำแหน่งนั้นไม่สมเหตุสมผลเลย แค่คิดเกี่ยวกับภาษากระแสหลัก C # และ Java ได้เติบโตขึ้นอย่างมหาศาลยืมคุณสมบัติจากภาษาอื่น ๆ (โดยเฉพาะการทำงาน) เพื่อส่งเสริมการเขียนรหัสที่ปลอดภัย เรายังมีภาษาเช่น Rust และ Swift ที่สร้างขึ้นจากพื้นดินเพื่อทำสิ่งนี้

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


6
ฉันเห็นด้วยกับตำแหน่งของคุณในวรรคสุดท้าย C ++ ควรเรียกว่า "Fountain of Exploits"
Caleb Mauer

3
นอกจากนี้เพื่อเสริมย่อหน้าที่ 2 ของคุณทั้ง Java และ C # อย่างหนัก cribbed C และ C ++ ไวยากรณ์สำหรับเหตุผลต่าง ๆ รวมถึงการล่อลวงนักพัฒนา C / C ++ ที่มีอยู่ด้วยสัญญาของเส้นโค้งการเรียนรู้ที่ลดลง ขณะที่พวกเขาเติบโตเต็มที่พวกเขาได้เพิ่มคุณสมบัติของตัวเองและมีรสนิยมของตัวเอง แต่ในวันแรก ๆ มันง่ายกว่าที่จะดูพวกเขาเป็น "C ++ แต่มีประสิทธิภาพน้อยลง" เนื่องจากวางตำแหน่งโดยตรงแทน C ++
Harrison Paine

12

เมื่อมองกลับไปที่หอจดหมายเหตุดูเหมือนว่าข้อความนี้มาจากปี 2003 (แม้จะมีบทความที่อ้างว่าเป็นจากปี 2006) ในเวลานั้นC # อยู่ในเวอร์ชัน 1 xและมันขาดคุณสมบัติที่ทันสมัยมากมาย :

คุณสมบัติใหม่

C # 2.0

  • generics
  • ประเภทบางส่วน
  • วิธีการที่ไม่ระบุชื่อ
  • iterators
  • ประเภทที่ทำให้เป็นโมฆะ
  • การเข้าถึง Getter / setter แยกกัน
  • การแปลงกลุ่มวิธี (ผู้รับมอบสิทธิ์)
  • การร่วมและการแปรปรวนสำหรับผู้ร่วมประชุม
  • คลาสแบบคงที่
  • การอนุมานที่มอบหมาย

C # 3.0

  • พิมพ์ตัวแปรโลคัลโดยปริยาย
  • วัตถุเริ่มต้นและการเก็บรวบรวม
  • คุณสมบัติดำเนินการอัตโนมัติ
  • ประเภทนิรนาม
  • วิธีการขยาย
  • คำค้นหานิพจน์
  • การแสดงออกของแลมบ์ดา
  • ต้นไม้แสดงออก
  • วิธีการบางส่วน

C # 4.0

  • การเชื่อมโยงแบบไดนามิก
  • อาร์กิวเมนต์ที่มีชื่อและเป็นทางเลือก
  • ยาสามัญและความขัดแย้ง
  • Embedded interop types ("NoPIA")

C # 5.0

  • วิธีการแบบอะซิงโครนัส
  • คุณลักษณะข้อมูลผู้โทร

C # 6.0

  • คอมไพเลอร์ -as-a-service (Roslyn)
  • นำเข้าสมาชิกประเภทคงที่ในเนมสเปซ
  • ตัวกรองข้อยกเว้น
  • รอการตรวจจับ / บล็อกในที่สุด
  • คุณสมบัติเริ่มต้นของคุณสมบัติอัตโนมัติ
  • ค่าดีฟอลต์สำหรับคุณสมบัติ getter เท่านั้น
  • สมาชิกที่มีการแสดงออก
  • Null propagator (โอเปอเรเตอร์ที่มีเงื่อนไขแบบ Null, การตรวจสอบค่า null แบบสั้น)
  • การแก้ไขสตริง
  • ชื่อของผู้ประกอบการ
  • เครื่องมือเริ่มต้นพจนานุกรม

C # 7.0

  • ออกตัวแปร
  • การจับคู่รูปแบบ
  • tuples
  • โครงสร้าง
  • ฟังก์ชั่นท้องถิ่น
  • ตัวแยกตัวเลข
  • ตัวอักษรไบนารี
  • Ref ส่งคืนและไอเดีย
  • ชนิดการส่งคืน async ทั่วไป
  • ตัวสร้างตัวฉกรรจ์และขั้นสุดท้าย
  • นิพจน์เกตเตอร์และเซทเทเตอร์

C # 7.1

  • หลักของ Async
  • นิพจน์ค่าเริ่มต้นตามตัวอักษร
  • ชื่อองค์ประกอบ tuple ที่อนุมาน

- "C Sharp" , Wikipedia (การอ้างอิงและลิงก์ถูกลบออก)

อาจเป็นที่เข้าใจได้มากกว่าว่า C # ดูเหมือนครึ่งภาษาในบริบทนั้นเนื่องจากขาดสิ่งที่ C # เป็นอยู่ในปัจจุบัน มันแปลกที่คิดว่ามันไม่มีstaticคลาสเลย!

มีบางสิ่งที่ขาดหายไปเช่นกันเนื่องจาก C # เชื่อมโยงกับ. NET ตัวอย่างเช่นWPFไม่ได้กลับมาแล้ว มันเป็น WinForms ทั้งหมด


คลาสสแตติกอาจเป็นตัวเลือกที่ดีของคุณลักษณะที่ขาดหายไปเนื่องจาก Java ยังไม่มีคุณสมบัติเหล่านั้น (ชนิด C #) เว้นแต่จะเป็นการกระทุ้งที่ Java ใช่ไหม
user253751

1
@immibis ไม่ใช่การแทงโดยเจตนาที่ Java แต่ jeeze จริงเหรอ? staticชั้นเรียนดูเหมือนจะเป็นคุณสมบัติดั้งเดิม ฉันคิดว่าพวกเขามีคลาสที่ลงวันที่ล่วงหน้า
Nat

2
ดูเหมือนว่าจะพูดว่าเครื่องยนต์ไอพ่นแบบลูกสูบเป็นเครื่องยนต์ไอพ่นแบบเจ็ต "คลาสที่ไม่ใช่อินสแตนซ์" โดยทั่วไปเรียกว่าโมดูลหรือเนมสเปซยกเว้นในภาษาที่รหัสทั้งหมดจะต้องอยู่ในชั้นเรียน (หรือเรียกจักรยานรถยนต์ด้วยตนเองหรือโทรโทรศัพท์พื้นฐานโทรศัพท์มือถือนิ่งหรือ ... )
user253751

@Nat - การมีคลาสแบบสแตติกนั้นดี แต่ไม่มีการเปลี่ยนแปลงใด ๆ เลย คุณสามารถทำให้สมาชิกทุกคนในคลาสคงที่และสิ่งที่คุณสูญเสียคือข้อผิดพลาดของคอมไพเลอร์สองสามชนิดถ้าคุณลืมว่าคลาสนั้นตั้งใจจะคงอยู่
Jirka Hanika

@ JirkaHanika ใช่ฉันไม่ใช่แฟนตัวยงของการstaticเรียนในกรณีส่วนใหญ่ จริง ๆ แล้วฉันเลือกมันเป็นคุณสมบัติในการโทรออกเพราะมันดูเรียบง่ายส่วนดั้งเดิมของ C #; ฉันไม่ได้พิจารณาว่าพวกเขาไม่ได้อยู่ใน Java
Nat

3

เขาบ่นว่าขาดคุณสมบัติทางภาษาซึ่งเปิดใช้งานการควบคุมอย่างละเอียด เหล่านี้รวมถึงเครื่องมือสำหรับ

  • การบังคับใช้การเปลี่ยนแปลงไม่ได้ (เช่นconstคำหลักC ++ )
  • การควบคุมอายุการใช้งานและความเป็นเจ้าของวัตถุ
  • การควบคุมการใช้งานหน่วยความจำการคัดลอกและสไตล์การจัดสรร

สิ่งนี้ทำให้ฉันนึกถึงการวิพากษ์วิจารณ์ Java อย่างใดอย่างหนึ่งของฉัน:

ทุกอย่างเป็นตัวชี้ แต่ไม่มีพอยน์เตอร์อยู่

ในวัตถุ C ++ พอยน์เตอร์และการอ้างอิงเป็นแนวคิดที่แตกต่างสามประการที่มีความหมายชัดเจน ใน Java คุณมี pseudo-object-pointer โดยการทำให้ความหมายของพอยเตอร์เหล่านี้กระจัดกระจายและทำให้โมเดลวัตถุมีความชัดเจนน้อยลง

ในโปรแกรม C ++ ที่กำหนดไว้อย่างดีโปรแกรมเมอร์สามารถคาดหวังว่าการอ้างอิงนั้นถูกต้องและไม่เป็นโมฆะ เนื่องจากรูปแบบที่เรียบง่าย Java จึงไม่สามารถรับประกันได้เหมือนกัน

อาการที่เกิดจากรูปแบบที่ชัดเจนน้อยกว่านี้รวมถึงรูปแบบวัตถุ nullและ Yoda 5.equals(potentiallyNullIntegerReference)เงื่อนไขเช่น


5
มันสับสนมาก พอยน์เตอร์ (ในแง่ตรรกะมีอยู่ใน Java) คุณเพียงแค่ไม่สามารถไปรอบ ๆ กับพวกเขา จุดรวมของการทำให้แบบจำลองง่ายขึ้นคือการรับประกันเพิ่มเติม ตรรกะที่คุณสามารถใช้เพิ่มเติมเกี่ยวกับรหัสในภาษาจะมีข้อ จำกัด น้อยลงไปข้างหลัง ข้อ จำกัด เพิ่มเติม -> รับประกันเพิ่มเติม
JimmyJames

1
@JimmyJames วลีหมายความว่าแม้ว่าคลาส Java ทั้งหมดจะมีความหมายอ้างอิง (yuck, btw) โดยนัยคุณไม่สามารถมีตัวชี้ที่แท้จริงได้ ตัวอย่างเช่นไม่มีทางที่จะได้รับ "การอ้างอิง" เพื่อการอ้างอิง สิ่งนี้ทำลายภาษาในหลาย ๆ ที่บางครั้งต้องใช้วิธีการแก้ปัญหาที่บ้า (ดูMap.mergeเมื่อคุณเพียงแค่ต้องการที่จะปรับปรุงค่าในแผนที่)
เควนติน

3
@JimmyJames: การค้ำประกันที่มีประโยชน์บางอย่างไม่สามารถนำเสนอในทางปฏิบัติได้โดยไม่ต้องมีข้อ จำกัด บางประการ นอกจากนี้การเพิ่มประสิทธิภาพที่มีประโยชน์บางอย่างอาจจำเป็นต้องมีข้อ จำกัด บางอย่าง อย่างไรก็ตามบางภาษากำหนดข้อ จำกัด ที่ไม่มีประโยชน์ซึ่งไม่มีการรับประกันใด ๆ ที่เป็นประโยชน์ต่อโปรแกรมเมอร์และไม่จำเป็นต้องทำการปรับแต่งที่มีประโยชน์ ข้อ จำกัด บางประการนั้นแย่มาก
supercat

3
@JimmyJames: ในทางกลับกันข้อ จำกัด พื้นฐานบางอย่างของ Java และ "safe-mode" C # ให้พวกเขาเสนอการรับประกันที่มีประโยชน์มากที่ C ++ ไม่สามารถ: การอ้างอิงใด ๆ (ใน C ++ จะเป็นตัวชี้) ที่เคยมีมา ข้อสังเกตในการระบุวัตถุโดยเฉพาะจะไม่ถูกตั้งข้อสังเกตในการระบุอะไรอื่น
supercat

3
คุณช่วยเสนอราคาเพื่อสนับสนุนคำตอบของคุณได้ไหม? ยกตัวอย่างเช่น AFAIK, constหน้าไม่ได้พูดถึง มันไม่พูดถึง "โปรแกรมการทำงาน" แต่ภาษาที่เขาใช้เป็นตัวอย่างคือโครงการซึ่งเป็นไม่ภาษาทำงานบริสุทธิ์ (ในความเป็นจริงนักออกแบบของโครงการที่มีความระมัดระวังในการหลีกเลี่ยงการใช้คำว่า "ฟังก์ชั่น" และพูดคุยเกี่ยวกับที่ " ขั้นตอน ") ดังนั้นดูเหมือนว่าเขากำลังใช้การตีความ" รูทีนย่อยชั้นหนึ่ง "ของ FP และไม่ใช่" การอ้างอิงโปร่งใส "
Jörg W Mittag

1

ฉันเห็นด้วยกับ @Kilian คำตอบ แต่ฉันจะเพิ่มองค์ประกอบบางอย่าง

1- ทำงานกับเครื่องเสมือนไม่ใช่ระบบปฏิบัติการ

เนื่องจาก Java และ C # ทำงานผ่านเครื่องเสมือนจึงคาดว่าจะมีเหตุผลที่คุณไม่สามารถทำสิ่งที่คุณต้องการได้เมื่ออยู่บนระบบปฏิบัติการโดยตรงเพราะคุณมีแนวโน้มที่จะทำให้บางสิ่งใน VM เสียหาย นอกจากนี้เมื่อ Java ถูกวางตัวเป็นผู้ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์มมันเป็นตรรกะมากขึ้น

2- แอปพลิเคชั่นไม่จำเป็นต้องให้คุณต้องการของแบบนั้น

มีแอปพลิเคชั่นมากมายที่ไม่ต้องการให้คุณขุดลึกลงไปในรายละเอียดมากนัก แต่ถ้าคุณใช้ภาษาที่ต้องการให้คุณทำคุณจะได้รับ:

  • ความเสี่ยงมากขึ้นที่จะมีข้อผิดพลาดเนื่องจากสิ่งที่ไม่จำเป็นเหล่านั้น
  • ต้นทุนการพัฒนาที่มากขึ้นการจัดการหน่วยความจำและการทดสอบใช้เวลาและเงิน!

3- ภาษาถูกสร้างขึ้นมาเพื่อลดน้ำหนักค่าใช้จ่าย / การใช้งาน / ความเสี่ยงเช่น ... ทุกอย่าง

ด้วย C ++ คุณสามารถทำสิ่งที่คุณต้องการได้นั่นคือตัวเลือกของคน C ++ อย่างไรก็ตามยิ่งมีมากคุณจะต้องจัดการ

ดังนั้นสิ่งต่าง ๆ เช่นการสืบทอดหลาย ๆ อย่างไม่ได้ถูกยกเลิกเพียงเพราะความจริงที่ว่าพวกเขากำลังเป็นอันตรายพวกเขาถูกเลิกเพราะการใช้งานพวกเขามีค่าใช้จ่าย (การพัฒนาการบำรุงรักษา) ทั้งหมดสำหรับคุณลักษณะที่ไม่ค่อยได้ใช้อย่างถูกต้อง โดยทั่วไปจะเขียนใหม่แตกต่างกัน


ค่าใช้จ่ายที่แท้จริงของการสืบทอดหลาย ๆ อันอยู่ในความเป็นจริงมันเป็นไปไม่ได้ที่จะสนับสนุนการรับประกันทั้งสองต่อไปนี้: (1) ถ้าสมาชิกของคลาสฐานBถูกแทนที่ในชั้นกลางMแล้วBเวอร์ชั่นของสมาชิกนั้นจะสามารถเข้าถึงได้ผ่านM' แทนที่ (2) ได้รับการอ้างอิงประเภทใด ๆTแปลงเป็น super-type ใด ๆ และกลับไปTจะให้ผลการอ้างอิงเทียบเท่ากับต้นฉบับ การรับประกันทั้งสองอย่างนั้นมีประโยชน์และการสนับสนุนการสืบทอดหลายรายการนั้นต้องการการยกเลิกอย่างน้อยหนึ่งรายการ
supercat

-1

เพียงวางข้อ จำกัด ทั้งหมดในภาษาระดับสูงเช่น C # และ Java ที่มีอยู่เพื่อป้องกันโปรแกรมเมอร์ พวกเขามีอยู่ไม่มากนักในการปกป้องโปรแกรมเมอร์จากเขา / เธอ แต่เพื่อปกป้องโปรแกรมเมอร์จากโปรแกรมเมอร์อื่น ๆ !

พวกเราในฐานะโปรแกรมเมอร์ต้องเผชิญกับห้องสมุดที่จริงจังกับการเขียนโปรแกรมและการออกแบบ แต่พวกเราถูกบังคับให้ใช้ด้วยเหตุผลเดียวหรือไม่?

โดยทั่วไปแล้วโปรแกรมเหล่านี้มีจุดเด่นของวิธีการโปรแกรมแบบเก่าที่ไม่มีการห่อหุ้มข้อมูลหน่วยความจำโดยตรงจำนวนมากเขียนโดยไม่มีข้อผิดพลาดเล็กน้อยหรือไม่มีข้อผิดพลาด Segfaults ไล่ตามมวลชนเมื่อพยายามใช้มันในโครงการขนาดใหญ่

นั่นคือสิ่งที่ภาษาอย่าง Java และ C # มีประโยชน์อย่างยิ่ง ไม่ใช่ว่าพวกเขาสนุกกับความจริงที่ว่าพวกเขาไม่ให้เราทำทุกสิ่งที่เป็นภาษาอื่น ๆ อย่างที่เราทำมันคือการที่เราเพลิดเพลินกับการปวดหัวที่เราต้องทนเพราะโปรแกรมเมอร์คนอื่น ๆ ทำ.

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


นี้ไม่ได้ดูเหมือนจะนำเสนออะไรที่สำคัญกว่าจุดทำและอธิบายในก่อน 5 คำตอบ
ริ้น

1
They exist not so much to protect the programmer from him/herself, but rather to protect the programmer from other programmers!หรือเพื่อป้องกันโปรแกรมเมอร์อื่น ๆ จากโปรแกรมเมอร์?
Tobia Tesan

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