ห้าสิ่งที่คุณเกลียดเกี่ยวกับภาษาโปรดของคุณคืออะไร? [ปิด]


403

เมื่อเร็ว ๆ นี้มีกลุ่มของ Perl-hate เกี่ยวกับ Stack Overflow ดังนั้นฉันคิดว่าฉันจะนำคำถาม" ห้าสิ่งที่คุณเกลียดเกี่ยวกับภาษาที่คุณโปรดปราน " มาที่ Stack Overflow ใช้ภาษาที่คุณชื่นชอบและบอกฉันห้าสิ่งที่คุณเกลียดชัง สิ่งเหล่านี้อาจเป็นสิ่งที่รบกวนคุณยอมรับข้อบกพร่องด้านการออกแบบปัญหาเกี่ยวกับประสิทธิภาพที่ได้รับการยอมรับหรือประเภทอื่น ๆ คุณเพียงแค่ต้องเกลียดมันและมันจะต้องเป็นภาษาที่คุณชื่นชอบ

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

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

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


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

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


11
นี่เป็นคำถามที่ "ภาษาโปรดของคุณ" ที่หมุนไปรอบ ๆ เหตุผลที่ดี
Tom Leys

14
ฉันคิดว่ามันน่าสนใจว่าถึงแม้จะมีกลุ่มผู้ใช้. NET จำนวนมากในขณะที่เขียนนี้มี 24 คำตอบมีเพียงหนึ่งคำตอบที่ (ของฉัน) เกี่ยวกับ. NET หรือภาษา. NET ผมมีความคิดว่านี้กล่าวเกี่ยวกับ SO หรือ .NET แต่มันเป็นเรื่องที่น่าสนใจ ...
จอนสกีต

22
15 ปีแรกของการเขียนโปรแกรมด้วยภาษา C / C ++, ฉันเกลียด (ตามลำดับอักษร): 1. ตัวชี้ 2. ตัวชี้ 3. ตัวชี้ 4. ตัวชี้ 5. ตัวชี้
ileon

4
ฉันสงสัยว่ามีคนแสดงความคิดเห็นจำนวนมากเกี่ยวกับการเกลียดภาษาที่พวกเขาเลือกเพราะพวกเขาไม่เข้าใจวิธีการเขียนโปรแกรมในภาษาที่พวกเขาเลือก ....
Kris.Mitchell

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

คำตอบ:


182

ห้าสิ่งที่ฉันเกลียดเกี่ยวกับ Java:

  • ไม่มีฟังก์ชั่นชั้นหนึ่ง
  • ไม่มีการอนุมานประเภท
  • การขาดสติเริ่มต้นในกราฟิกเช่น
  • NullPointerException ไม่ได้มีข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เป็นโมฆะ
  • การแพร่กระจายของเฟรมเวิร์ก "ที่กำหนดค่าได้" / อินเตอร์เฟสผู้ให้บริการ / คลาสโรงงาน / ระบบฉีดพึ่งพา ความสามารถในการกำหนดค่าแทบจะไม่เคยใช้ DRY นั้นถูกละเมิดอย่างร้ายแรงและโค้ดสี่เท่าในขนาดและแบ่งเท่า ๆ กันในความชัดเจน

ฉันรู้ว่าฉันควรตรวจสอบสกาล่า


7
@both: NPE ถูกแสดงในบรรทัดแรกของสแทรนแทรนซ์ มันมีคลาส (เกือบตลอดเวลา) ชื่อไฟล์ java และหมายเลขบรรทัดเช่น: "ที่ your.faulty.code.Instance (Intance.java:1234)" จากนั้นคุณก็เปิดไฟล์นั้นไปที่บรรทัดนั้น คือตัวแปรที่ไม่ได้กำหนดอะไรไว้
OscarRyz

35
@Oscar Reyes - เอ่อเรารู้ดีว่า แต่อาจมีหลายตัวแปรในบรรทัดนั้นและข้อความข้อยกเว้นไม่ได้บอกฉันว่าอันไหนเป็นโมฆะ
Zarkonnen

10
สกาล่ามีหูดด้วย อย่างไรก็ตามมันดีกว่า Java อย่างมาก
wheaties

10
+1 สำหรับการแพร่กระจายของกรอบ ฯลฯ
ริช Kitzmueller

6
@Valentin เพียงแค่จินตนาการถึงความสนุกของ NullPointerException ที่อยู่ในไฟล์บันทึกขนาดยักษ์จากการทำงานทุกค่ำคืนและคุณต้องเข้าใจว่าเกิดอะไรขึ้น ... การดีบักไม่ใช่ตัวเลือก
Thorbjørn Ravn Andersen

216

ว้าวฉันแปลกใจที่SQLยังไม่ได้สร้างที่นี่ เดาว่าหมายความว่าไม่มีใครรักมัน :)

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

... และเหตุผลบางประการที่ทำให้โบนัสเกลียดที่ไม่มีค่าใช้จ่ายเพิ่มเติม

  • ส่วนคำสั่ง WHERE จะเป็นอันดับสุดท้ายทำให้ง่ายต่อการเรียกใช้งาน UPDATE หรือ DELETE ก่อนกำหนดทำลายตารางทั้งหมด สถานที่ควรไปที่ไหนสักแห่งแทน
  • เป็นการยากที่จะใช้งานแผนกสัมพันธ์
  • ฉันสามารถตั้งค่าเป็น NULL แต่ฉันไม่สามารถทดสอบเพื่อความเท่าเทียมกับ NULL ฉันสามารถตรวจสอบ IS NULL ได้ แต่นั่นทำให้โค้ดซับซ้อน - โดยไม่จำเป็นดังนั้นในความคิดของฉัน
  • เหตุใดเราจึงต้องให้การรับรองสูตรสำหรับคอลัมน์ GROUPed อย่างสมบูรณ์แทนที่จะตั้งชื่อแทนในคอลัมน์จากนั้นจัดกลุ่มตามชื่อแทน (หรือดัชนีคอลัมน์เช่นเดียวกับ SORT)

7
บางทีไม่มีใครสามารถเรียนรู้ที่จะรักมันจนกว่าพวกเขาจะหยุดคิดว่ามันเป็นภาษา :)
Alan Moore

4
+1 สำหรับทุกสิ่ง และยังมีคนสงสัยว่าทำไมฉันจะทนกับอาการปวดหัวของออม ...
เจมส์ Schek

2
@ Alan M ... นั่นไม่ใช่สิ่งที่ L หมายถึงใช่มั้ย :)
Kev

29
ฉันไม่เข้าใจว่าทำไมไวยากรณ์สำหรับ INSERT จึงแตกต่างจากการอัปเดต และ MERGE นั้นไม่สามารถเข้าใจได้
LaJmOn

3
ความจำเป็นของ IS NULL ควรชัดเจนหากคุณพิจารณาว่า NULL เป็นผลลัพธ์ที่เป็นไปได้อันดับที่สามทันทีหลังจาก TRUE และ FALSE เนื่องจากความหมายของมันคือ "ไม่ทราบ" คุณจึงไม่สามารถบอกได้ว่ามีอะไรที่ไม่รู้จักตรงกับสิ่งอื่นซึ่งไม่ทราบเช่นกัน อีกตัวอย่างหนึ่ง: ถ้า NULL เท่ากับ NULL นี่หมายความว่าแนวคิดทั้งหมดในการสร้าง JOIN นั้นเป็นไปไม่ได้เนื่องจากค่า NULL ใด ๆ สามารถจับคู่กับค่า NULL อื่นได้ หากคุณเข้าใจสิ่งนี้ (สิ่งที่เรียกว่าตรรกะไตรภาค) มากกว่าที่คุณอาจเข้าใจเหตุผลในการแนะนำตัวดำเนินการ "IS" เพื่อทดสอบกับ NULL
อเล็กซ์

159

จาวาสคริปต์ :

  1. ทุกสิ่งที่เจ๋งที่สุดนั้นซับซ้อนอย่างบ้าคลั่ง แต่หลังจากนั้นความเยือกเย็นทั้งหมดก็ถูกห่อหุ้มด้วยโค้ดจำนวนเล็กน้อยที่คุณรู้สึกงี่เง่าที่ดิ้นรนทำตาม

  2. '+' เป็นตัวเลือกที่ไร้สาระของโอเปอเรเตอร์สำหรับการต่อข้อมูลในภาษาที่พิมพ์ไม่ได้ พวกเขาพยายามทำให้ตกใจ

  3. มันเป็นเขตที่วางทุ่นระเบิดที่เข้ากันได้ข้ามเบราว์เซอร์

  4. โดยทั่วไปจะไม่น่าเชื่อถือ - เกี่ยวข้องกับ scummery เช่นการบล็อกปุ่มย้อนกลับป๊อปอัปที่ไม่เคยตาย ฯลฯ

  5. แทบเป็นไปไม่ได้ที่จะทำการดีบั๊กเนื่องจากมีเพียงข้อความแสดงข้อผิดพลาดที่แตกต่างกันเพียงไม่กี่ประเภทเท่านั้น (หมายเลข, สตริง, วัตถุ, ฯลฯ )

หากไม่ใช่เพื่อ jQuery ฉันอาจยังคงเกลียดชังมากที่สุดเท่าที่ฉันเคย :)


15
ฉันเห็นด้วยกับ mausch ECMAscript ในและของตัวเองเป็นภาษาที่สวยงามและมีประสิทธิภาพ เป็นเบราว์เซอร์ที่น่ารำคาญ (: ไอ: IE) ที่ทำให้ชื่อยุ่งเหยิง
TJ L

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

20
@Chris: ใช่ "+" เป็นตัวดำเนินการที่ดีสำหรับการต่อข้อมูลในภาษาที่พิมพ์อย่างรุนแรง (เช่น Python) ในภาษาที่พิมพ์อย่างอ่อน (เช่น Javascript หรือ C) มันแย่มาก มันตัดสินใจ (เงียบ ๆ ) ว่า 'ผลรวม:' + 2 + 3 ไม่ใช่ 'ผลรวม: 5' แต่ 'ผลรวม: 23' ผู้ที่มีประสบการณ์ Javascript มากขึ้นสามารถเป็นตัวอย่างที่ดีกว่า
ShreevatsaR

5
ใช่ C ถูกพิมพ์อย่างอ่อนเมื่อเทียบกับพูด Python (เช่นคุณสามารถกำหนดจำนวนเต็มให้กับchars โยนอะไรก็ได้ผ่าน void * pointers เป็นต้น) มันถูกพิมพ์แบบสแตติกแทนที่จะพิมพ์แบบไดนามิกและต้องพิมพ์อย่างชัดเจนแทน การอนุมานประเภท แต่ไม่เกี่ยวข้องกับการพิมพ์ที่อ่อนแอ v / s [ตัวอย่างแบบสุ่ม: Python มีการพิมพ์ที่แข็งแกร่งแบบไดนามิกโดยนัย Haskell มีการพิมพ์ที่แข็งแกร่งแบบคงที่ (เป็นทางเลือก) Java มีการพิมพ์ที่รัดกุม (ส่วนใหญ่เป็นแบบคงที่) Java มีการพิมพ์ที่แข็งแกร่งแบบคงที่ "ไม่ได้กำหนดชัดเจน
ShreevatsaR

5
@ShreevatsaR ตัวอย่างแบบดั้งเดิมคือ: '3'+'2'='32', '3'-'2'=1.
โทมัส Ahle

148

PHP:

1) บังคับให้ฉันสร้างตัวแปรที่ไม่จำเป็น:

$parts = explode('|', $string);
$first = $parts[0];

2) การติดตั้งแลมบ์ดาทำให้ง่อยเทียบเท่ากับการใช้eval()และผิดอย่างน่าเกลียดชังที่ฉันไม่เคยใช้ (ดูhttp://www.php.net/create_function )

3) ระบบลอง / จับซึ่งสามารถตรวจจับได้ประมาณ 80% ของข้อผิดพลาดที่อาจเกิดขึ้น

4) Regex ให้การสนับสนุนเช่นเดียวกับ lambda เพราะมันจะต้องถูกเขียนในสตริปกติทำให้หนึ่งในเครื่องมือการเขียนโปรแกรมที่ยากต่อการเรียนรู้มากที่สุดประมาณสามครั้งเป็นเรื่องยาก และ PHP ควรเป็นภาษาที่ "ง่าย"?!?!?

5) ไม่มีทางที่จะดึงสิ่งของออกจาก $ _POST อย่างปลอดภัยโดยไม่ต้องเขียนสองครั้งหรือสร้างฟังก์ชั่นของคุณเองหรือใช้ตัวดำเนินการ '@':

$x = isset($_POST['foo']['bar']) ? $_POST['foo']['bar'] : null;

6) คำตอบโบนัส: '@' หากคุณไม่สามารถเขียนรหัสของคุณได้อย่างถูกต้องเพียงเพิ่ม '@' และไม่ดีสำหรับผู้ที่ต้องแก้ไขข้อบกพร่องในภายหลัง


44
สิ่งที่เกี่ยวกับรายการ ($ first) = explode ('|', $ string); ?
mlarsen

44
เป็นการดีที่ฉันต้องการใช้ some_function (explode ('|', $ string) [0]);
php มากเกินไป

8
การกำหนดขอบเขตตัวแปรแปลกอะไร การมีทุกอย่างในท้องถิ่นและบังคับให้คุณประกาศเมื่อคุณต้องการใช้โกลบอลเป็นความคิดที่ดีมันจะป้องกันไม่ให้ noobs สร้างฟังก์ชั่นที่ใช้แค่วงกลมแทนการใช้อาร์กิวเมนต์และคืนค่าเหมือนที่ควรทำ
scragar

24
คุณลืมเกี่ยวกับฟังก์ชั่นที่มีการสั่งซื้อพารามิเตอร์การเปลี่ยนแปลงแบบสุ่ม
dusoft

39
คุณลืม verbNoun, verb_noun, noun_verb, nounverb, verbnoun, nounVerb และอื่น ๆ > _>
Warty

135

C ++

  • ง่ายเกินไปที่จะทำลายหน่วยความจำแบบสุ่มและสร้างข้อบกพร่องที่แทบจะเป็นไปไม่ได้ในการค้นหา (แม้ว่าValgrindจะไปไกลในการแก้ไขปัญหานี้)
  • ข้อความแสดงข้อผิดพลาดแม่แบบ
  • เมื่อใช้เทมเพลตการรวมทุกอย่างไว้ในไฟล์เดียวนั้นเป็นเรื่องง่าย
  • ไลบรารีมาตรฐานเป็นเรื่องตลกในยุคปัจจุบัน (ยังไม่มีเธรดหรือเครือข่ายโดยค่าเริ่มต้น?)
  • จำนวนบิตที่น่ารังเกียจของ C โผล่ผ่าน (โดยเฉพาะการแปลงทั้งหมดระหว่าง short / int / unsigned / etc .. )

13
ผมเห็นด้วยกับ STL แต่ผมจะพูดในสิ่งที่เป็นมีสวยดี
เบอร์นาร์ด

22
Unicode ฉันเคารพความเรียบง่ายของ ascii แต่เพื่อประโยชน์ของความดีเราเข้ากันได้ดีในศตวรรษที่ 21 ในขณะนี้
wilhelmtell

29
@Kieveli const ความถูกต้องเป็นจริงสิ่งหนึ่งที่ฉันคิดถึงมากที่สุดเมื่อเขียนโปรแกรมในภาษาอื่น โดยเฉพาะอย่างยิ่งคนที่พิมพ์แบบไดนามิก Raii เป็นคุณสมบัติใหญ่ที่ฉันมักจะพลาดเช่นกัน
wilhelmtell

6
ปัญหา C ++ ส่วนใหญ่มาจากการเป็นมาตรฐาน ISO และถูกล็อคเป็นเวลา 10 ปี
graham.reeds

7
+1 "ข้อความข้อผิดพลาดแม่แบบ"
João Portela

129

C # / .NET:

  • คลาสควรถูกปิดผนึกตามค่าเริ่มต้น
  • ไม่ควรมีlockคำสั่ง - แต่คุณควรมีวัตถุล็อคโดยเฉพาะและควรมีวิธีการเช่นAcquireกลับโทเค็นล็อคทิ้ง ผลที่ตามมา: ไม่ควรมีการตรวจสอบสำหรับทุกวัตถุ
  • GetHashCode()และEquals()ไม่ควรอยู่ในSystem.Object- ไม่ใช่ทุกสิ่งที่เหมาะสำหรับการคร่ำครวญ แต่มีIdentityComparerซึ่งจะเป็นสิ่งเดียวกันและให้IComparer<T>, IComparable<T>, IEqualityComparer<T>และIEquatable<T>อินเตอร์เฟซสำหรับการเปรียบเทียบที่กำหนดเอง
  • การสนับสนุนที่ไม่ดีสำหรับการเปลี่ยนไม่ได้
  • วิธีการค้นพบวิธีการขยายที่ไม่ดี - มันควรเป็นการตัดสินใจที่ใส่ใจมากกว่าการใช้เนมสเปซ

สิ่งเหล่านั้นอยู่ด้านบนของหัวของฉัน - ถามฉันในวันพรุ่งนี้และฉันจะมาพร้อมกับ 5 :)


22
ปิดผนึกโดยค่าเริ่มต้น: การสืบทอดควรถูกออกแบบเป็นคลาส (ซึ่งต้องใช้เวลาและ จำกัด ตัวเลือกในอนาคต) หรือห้าม hashCode / เท่ากับ: มันดูดใน Java ด้วย วันหนึ่งฉันจะเขียนบทความยาว ๆ เกี่ยวกับมัน อ่าน Java ที่มีประสิทธิภาพสำหรับรายละเอียดว่าเพราะเหตุใดจึงยากในโซ่สืบทอด
Jon Skeet

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

69
ในกรณีนี้ฉันไม่ฉลาดพอที่คุณจะได้รับมาจากรหัสของฉัน: เพราะฉันไม่สามารถทำนายได้ว่าการเปลี่ยนแปลงในอนาคตฉันจะทำสิ่งใดซึ่งอาจทำให้รหัสของคุณเสียหาย นั่นเป็นปัญหาที่สำคัญมาก IMO การปิดผนึกรหัสนั้นเข้มงวดมากขึ้น แต่นำไปสู่อิสรภาพในการใช้งานและความทนทานที่มากขึ้น
Jon Skeet

11
ฉันไม่อยากจะเชื่อเลยว่าไม่มีใครพูดถึงไวยากรณ์ "goto case" ฉันเกลียดอันนั้น!
Aistina

20
เป็นสิ่งที่ดี Jon Skeet ไม่ได้ออกแบบ C # หรือรายการของฉันจะมีลักษณะเป็น "1. คลาสจะถูกปิดผนึกโดยค่าเริ่มต้น 2. การล็อคซับซ้อนเกินไป 3. วัตถุส่วนใหญ่ไม่แฮช"
Gabe

113

  • การจัดการสตริง

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


50
ตกลง การจัดการสตริงเป็นรายการที่ 1 ถึง 5 ของสิ่งที่ฉันเกลียดเกี่ยวกับซี
BoltBait

1
เพียงใช้ไลบรารีสตริงที่ปลอดภัยของ DJB หรืออะไรบางอย่าง การจัดการ XML เป็นเรื่องยากในภาษาส่วนใหญ่และโปรแกรมจำนวนมากทำการจัดการ XML แต่คุณไม่เห็นโพสต์มากมายที่พูดว่า "Perl เสียทั้งหมดเนื่องจากไม่รองรับโหนด DOM เป็นชนิดข้อมูลดั้งเดิม" พวกเขาใช้ห้องสมุด
Steve Jessop

5
การจัดการสตริง C ดูด แต่เท่าที่ปัญหาทางภาษาดำเนินไปมันไม่ได้เลวร้ายที่สุด
คริสลัทซ์

3
strcat ไปยัง concatenate แต่เดี๋ยวก่อน ... ปลายทางมีพื้นที่เพียงพอหรือไม่ ... ต้องใส่คำสั่งเพื่อตรวจสอบ ... แต่เดี๋ยวก่อนถ้าสตริงของฉันอยู่ในกอง? ตกลงจะต้องเก็บตัวแปรรอบ ๆ เพื่อติดตามขนาด ... และสิ่งนี้สามารถไป
เรื่อย ๆ

4
เราต้องการเธรดสำหรับห้าสิ่งที่เราไม่ได้เกลียดเกี่ยวกับ C ...
L --o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

94

ห้าสิ่งที่ฉันเกลียดเกี่ยวกับรายการ "สิ่งที่ฉันเกลียดเกี่ยวกับบางภาษา" : D

5- การวาดภาพสีส้มแดงไม่ได้ทำให้แอปเปิ้ล

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

โครงการที่ออกแบบมาอย่างดีน่าจะมีรหัสจากหลายภาษา ไม่ได้หมายความว่าคุณไม่สามารถทำโครงการด้วยภาษาเดียวเท่านั้น บางโครงการอาจอยู่ในความสามารถของภาษาที่คุณใช้

4- คุณกำลังยืนบนขาไม้หรือไม่?

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

3- ความผิดของใครมันจริงเหรอ?

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

int a[10];
for (int idx = 0; idx < 15; idx++) a[idx] = 10;

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

2- เราไม่ควรใส่ลงในถังขยะ?

มันง่ายมากที่จะชี้ไปที่คุณลักษณะในภาษาที่เราไม่เข้าใจเพราะเราไม่ได้ใช้บ่อยและเรียกมันว่าโง่ บ่นว่ามันอยู่ที่นั่น ฯลฯ ไปที่ความบันเทิงของฉันเสมอ ผู้คนมักจะบ่นเกี่ยวกับการที่อยู่ในภาษาของโกโตะ แต่ฉันเดิมพันโปรแกรมสุดท้ายของคุณรวมประเภทของ goto หากคุณเคยหยุดพักหรือทำต่อไป นั่นคือสิ่งที่มันเป็น ได้รับมันเป็น "ปลอดภัย" ไปแล้ว แต่มันคือสิ่งที่มันเป็น Goto มีประโยชน์ ไม่ว่าจะเป็นการใช้ "โดยนัย" อย่างการดำเนินการต่อหรือการแตกหรือการใช้งานอย่างชัดเจน (โดยใช้คำหลักที่แท้จริง "goto" สำหรับภาษาใดก็ตาม) ไม่ใช่ว่านักพัฒนาภาษาจะไม่มีที่ติ แต่โดยทั่วไป ... หากการทำงานมีอยู่นับตั้งแต่รุ่งอรุณของเวลา (สำหรับภาษานั้น) มีแนวโน้มว่าลักษณะคือการกำหนดคุณภาพของภาษานั้น ความหมาย .. มัน ' มีการใช้งานและมีแนวโน้มที่จะไม่แขวนอยู่เพราะความเข้ากันได้ย้อนหลัง มันถูกใช้ในวันนี้ เช่นใน 5 นาทีที่ผ่านมา และใช้อย่างเหมาะสม ดี .. เนื้อหาที่มีคนใช้อย่างไม่เหมาะสมเช่นกัน แต่นั่นเกี่ยวข้องกับ # 3 ในรายการของฉัน

1. - ทุกอย่างเป็นวัตถุ

โอเค .. อันนี้เป็นเซตย่อยของ # 2 แต่นี่คือการร้องเรียนที่น่ารำคาญที่สุดที่ฉันเห็นในรายการที่น่าเกลียด ไม่ใช่ทุกสิ่งที่เป็นวัตถุ มีแนวคิดมากมายที่ไม่ได้เป็นของหรือจำเป็นต้องเป็นวัตถุ การวางสิ่งที่ไม่ได้เป็นของน่าเกลียดและสามารถลดประสิทธิภาพของโปรแกรม แน่ใจ อาจไม่มากขึ้นอยู่กับภาษา สิ่งนี้เกี่ยวข้องกับ # 5 ด้วย หมายความว่า ... ใช่ ทั่วโลกก็โอเค ฟังก์ชั่นตามที่ระบุให้กับวิธีการแบบคงที่ก็โอเค การรวมการเขียนโปรแกรม OO กับฟังก์ชั่นทั่วโลกก็โอเค ตอนนี้ .. นั่นไม่ได้หมายความว่าเราทุกคนควรจะออกไปและ "ฟรี" รหัสของเราจากมันเป็นวัตถุแบบจำลอง เมื่อออกแบบส่วนของรหัสหรือโครงการทั้งหมดเกิดอะไรขึ้นเบื้องหลังควรจะเป็นได้รับการพิจารณาเมื่อนำมารวมกัน ไม่เพียง แต่ที่แนวคิดนั้นมีชีวิตและปัจจัยอื่น ๆ อีกมากมาย ทำไมห่อฟังก์ชั่นทั่วโลกภายในชั้นเรียนหรือแนวคิดพื้นที่ชื่อถ้ามันไม่มีวัตถุประสงค์? รับตัวแปรสมาชิกแบบคงที่ นั่นทำให้ฉันประหลาดใจอย่างมากเพราะ .. ดี .. ขึ้นอยู่กับภาษาและการใช้งานของหลักสูตร แต่โดยทั่วไปแล้วคุณเพิ่งประกาศทั่วโลก ใช่มีเหตุผลบางอย่างที่จะห่อแนวคิดที่ไม่ใช่ OO เหล่านี้ใน wrapper OO หนึ่งในนั้นคือรหัสการทำเอกสารด้วยตนเอง ที่สามารถทำให้รู้สึก ดังนั้น .. เหมือนที่ฉันพูด อย่าออกไปและ "ฟรี" รหัสของคุณ แต่ภาษาสมัยใหม่ที่ดีใด ๆ จะมีแนวคิดระดับโลกนอกเหนือจากแบบจำลอง OO ใช่ฉันหมายถึงเฉพาะเจาะจงที่จะชี้ให้เห็นว่าภาษาการเขียนโปรแกรม OO ที่ไม่มีแนวคิดระดับโลกส่วนใหญ่มีข้อบกพร่องการออกแบบอย่างจริงจัง อีกครั้งแม้ว่า .. ขึ้นอยู่กับความตั้งใจและการออกแบบของภาษาดังนั้นฉันไม่ได้พยายามเลือกภาษาเฉพาะใด ๆ และมีการวิเคราะห์ที่นี่มากเกินไป พิจารณาว่ารหัสใดควรอยู่และมีประสิทธิภาพมากที่สุด การเพิ่มแสงจ้าให้กับสิ่งที่ไม่เพิ่มฟังก์ชั่นหรือรองรับเพียงแค่ใส่คีย์บอร์ดเร็วขึ้น มันไม่ได้ทำให้ใครดี ดี .. เว้นแต่คุณจะชอบคะแนนบราวนี่จากคนที่อาจสอนคุณไม่ถูกต้องว่าทุกอย่างเป็นวัตถุ

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


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

4
หากคุณดูที่ระดับนั้นไม่เพียง แต่ทำลายและดำเนินการต่อเป็น gotos แต่ลูปเป็น gotos (กระโดดจุดเริ่มต้นของลูปถ้าตรงตามเงื่อนไข) ถ้าเป็น goto (หากเงื่อนไขไม่ตรงข้ามข้ามบล็อกการเรียกฟังก์ชัน) คือ goto (ข้ามไปยังจุดเริ่มต้นของฟังก์ชั่นและต่อมาก็กระโดดกลับ), ...
helium

17
การสร้างไฟล์ปฏิบัติการจากซอร์สโค้ด "ไม่มีประโยชน์"? อะไร?
detly

4
Perl สามารถสร้างไฟล์ที่เรียกทำงานได้จากไฟล์ Perl ตั้งแต่ปลายยุค 80 สิ่งหนึ่งที่จะเผยแพร่มีประโยชน์ ไม่จำเป็นต้อง a) ติดตั้ง Perl, b) ติดตั้งส่วนประกอบของโปรแกรม c) อาจเขียนสคริปต์เพื่อตั้งค่าพา ธ และดำเนินการทั้งหมด ... ใช่ไม่ได้ผลจริงๆ
xcramps

1
แต่ถ้าคุณไม่สามารถสร้างไฟล์. exe จากแหล่งที่มาผู้ใช้ windows จะไม่สามารถเรียกใช้ได้ ;)
Evan Plaice

88

ห้าสิ่งที่ฉันเกลียดเกี่ยวกับJava (ซึ่งปัจจุบันเป็นภาษาโปรดของฉัน) โดยไม่เรียงลำดับ

  1. เท่าที่ฉันเป็นแฟนของ Java Generics มีจำนวนมากแปลกที่เกิดขึ้นจากวิธีการออกแบบ เช่นนี้มีข้อ จำกัด ที่น่ารำคาญมากมายกับยาชื่อสามัญ (ซึ่งบางส่วนเป็นผลมาจากการลบประเภท)
  2. วิธีที่ Object.clone () และส่วนต่อประสาน Cloneable นั้นใช้งานไม่ได้โดยสิ้นเชิง
  3. แทนที่จะใช้ถนนสูงและทำให้ทุกอย่างเป็นวัตถุ (a.la. SmallTalk) Sun wimped out ได้สร้างประเภทข้อมูลสองประเภทที่แตกต่างกัน: วัตถุและดั้งเดิม เป็นผลให้มีสองตอนนี้รับรองสำหรับประเภทข้อมูลพื้นฐานและความอยากรู้แปลก ๆ เช่นการชกมวย / การไม่ทำกล่องและไม่สามารถใส่คำนำหน้าในการรวบรวมได้
  4. สวิงซับซ้อนเกินไป อย่าเข้าใจฉันผิด: มีสิ่งดีๆมากมายที่คุณสามารถทำได้กับ Swing แต่มันก็เป็นตัวอย่างที่ยอดเยี่ยมสำหรับงานวิศวกรรมมากเกินไป
  5. การร้องเรียนครั้งสุดท้ายนี้เป็นความผิดของซันและผู้ที่ได้เขียนไลบรารี XML สำหรับ Java ห้องสมุด Java XML นั้นซับซ้อนเกินไป เพื่อให้ง่ายต่อการอ่านในไฟล์ XML ฉันมักจะต้องกังวลกับตัวแยกวิเคราะห์ที่ฉันใช้: DOM หรือ SAX API สำหรับแต่ละรายการมีความสับสนอย่างเท่าเทียมกัน รองรับภาษาพื้นเมืองได้อย่างง่ายดายแยกวิเคราะห์ / เขียน XMLจะดีมาก
  6. java.util.Date sucks ไม่เพียง แต่จะมีความซับซ้อนเกินจำเป็น แต่วิธีการที่เป็นประโยชน์ทั้งหมดได้ถูกเลิกใช้แล้ว (และแทนที่ด้วยวิธีอื่นที่เพิ่มความซับซ้อน)

32
คุณลืมเกี่ยวกับ java.util.Date!
TM

3
นอกจากนี้: อินเทอร์เฟซ "Cloneable" ไม่มีวิธี "clone ()" สิ่งนี้ทำให้อินเทอร์เฟซ Cloneable เป็น Oxymoron และเนื่องจาก clone () ส่งคืนออบเจ็กต์ความปลอดภัยของประเภทจึงไม่ปรากฏที่หน้าต่าง
Ryan Delucchi

2
ตราบใดที่เราทุบตี cloneable ก็อาจรวมถึง "interface" ที่เรียกว่า Serializable เมื่อใดก็ตามที่ใช้มันฉันมักจะต้องการแทงตัวเอง
wds

12
ยากที่จะทำสิ่งง่าย ๆ เช่นเปิดไฟล์และอ่านจากมัน
Eric Johnson เมื่อ

3
@Ryan clone () ไม่จำเป็นต้องส่งคืน "Object" ด้วย J2SE 5.0 Java แนะนำประเภทการคืนค่า covariant ซึ่งหมายความว่าคุณสามารถส่งคืนชนิดย่อยของคลาสพื้นฐานได้ โคลน MyType สาธารณะ () เป็นไปได้!
helpermethod

73

ทับทิมมีข้อบกพร่องมากมายที่เกี่ยวข้องกับความเร็ว แต่ฉันไม่ได้เกลียดมัน นอกจากนี้ยังมีข้อบกพร่องเกี่ยวกับการประกาศของชุมชนที่จะลงน้ำ แต่นั่นไม่ได้รบกวนฉันจริงๆ นี่คือสิ่งที่ฉันเกลียด:

  • การปิด (บล็อก) มีการสร้างไวยากรณ์ 4 แบบที่แตกต่างกันและไม่มีสิ่งใดที่เหมาะสมที่สุด ไวยากรณ์ที่สง่างามไม่สมบูรณ์และคลุมเครือด้วยแฮชและไวยากรณ์ทั้งหมดนั้นน่าเกลียด
  • ชุมชนมีแนวโน้มที่จะขัดแย้งกับเอกสารจริงโดยเลือก 'อ่านรหัส' ฉันพบว่าเด็ก ๆ และขี้เกียจ
  • การใช้เครื่องมือในทางที่ผิดโดยเฉพาะอย่างยิ่งในห้องสมุดทำให้แมลงเป็นฝันร้ายที่ต้องติดตาม
  • ในบันทึกที่เกี่ยวข้อง metaprogramming ที่แพร่หลายทำให้ IDE ที่ครอบคลุมนั้นยากที่จะทำ
  • การบล็อกการส่งผ่านไปยังฟังก์ชั่นเสร็จสิ้นเป็นเรื่องโง่ ไม่มีเหตุผลบล็อกควรถูกส่งออกนอกรายการพารามิเตอร์หรือมีไวยากรณ์พิเศษแปลก ๆ ในการเข้าถึง (ผลผลิต) ฉันเห็นว่าบล็อกควรได้รับไวยากรณ์ที่ไม่ชัดเจนน้อยกว่า (หรือแฮชอาจใช้ตัวคั่นที่ต่างกันบางที <> มากกว่า {}) และการส่งผ่านพารามิเตอร์ไปยังเมธอดควรเหมือนกับพารามิเตอร์อื่น ๆ ทั้งหมด

    object.method(1, {|a| a.bar}, "blah")
    

    สิ่งประหลาดเหล่านี้เช่นบล็อกต้องเป็นพารามิเตอร์สุดท้ายที่ผ่านและผ่านมากกว่าหนึ่งบล็อกจะแตกต่างกับไวยากรณ์ที่ยาวกว่ารบกวนฉันจริงๆ


2
m17n ย่อยที่ดีที่สุดและสนับสนุน unicode แม้ว่าจะเริ่มดีขึ้น 1.9 ยังคงซับซ้อน ...
Keltia

37
ผมคิดว่าการละเมิด metaprogramming เรียกว่า "ทับทิมสำนวน" :)
Slartibartfast

2
akway: อีกสองไวยากรณ์มีแลมบ์ดาและProc.new
Myrddin Emrys

2
เรื่องเอกสารฉันเคยได้ยินการพูดคุยของใครบางคนที่ทำงานในสำนักพิมพ์ Pragmatic ซึ่งกล่าวว่าเมื่อ บริษัท ก่อตั้งขึ้นพวกเขาต้องการหนังสือทับทิมเพราะมีเพียงภาษาญี่ปุ่นเท่านั้น ดังนั้นพวกเขาจึงสามารถมีหนังสือแปลและจัดพิมพ์โดย บริษัท ของพวกเขา แต่สิ่งที่พวกเขาทำแทนที่จะอ่านซอร์สโค้ด :-) หนังสือ Ruby เป็นหนึ่งในหนังสือที่เปิดตัว Pragmatic Programmers
Arthur Reutenauer

13
ฉันคิดว่ามันน่าสนใจที่ 3 สิ่งเหล่านี้เกี่ยวข้องกับผู้คนไม่ใช่ภาษาของตัวเอง ทับทิมยังคงเป็นภาษาที่ฉันเกลียดอย่างน้อยที่สุด
โทบี้เฮเด

72

Perl

  • ใช้ผสมของ sigils

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = $array[0]; # not @array[0], you would get the length instead
    my $four = $array->[0]; # definitely not $array[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = @$array[1,2]; # coerce to array first
    
    my $length_a = @array;
    my $length_s = @$array;
    
    my $ref_a = \@array;
    my $ref_s = $array;
    
    • ตัวอย่างเช่น ไม่มีสิ่งใดเหมือนกัน:

      $array[0]   # First element of @array
      @array[0]   # Slice of only the First element of @array
      %array[0]   # Syntax error
      $array->[0] # First element of an array referenced by $array
      @array->[0] # Deprecated first element of @array
      %array->[0] # Invalid reference
      $array{0}   # Element of %array referenced by string '0'
      @array{0}   # Slice of only one element of %array referenced by string '0'
      %array{0}   # Syntax error
      $array->{0} # Element of a hash referenced by $array
      @array->{0} # Invalid reference
      %array->{0} # Deprecated Element of %array referenced by string '0'
      

    ใน Perl6นั้นมีการเขียน :

    my @array = ( 1, 2, 3 );
    my $array = [ 4, 5, 6 ];
    
    my $one  = @array[0];
    my $four = $array[0]; # $array.[0]
    
    my( $two,  $three ) = @array[1,2];
    my( $five, $six   ) = $array[1,2];
    
    my $length_a = @array.length;
    my $length_s = $array.length;
    
    my $ref_a = @array;
    my $ref_s = $array;
    
  • ขาด OO จริง

    package my_object;
    # fake constructor
    sub new{ bless {}, $_[0] }
    # fake properties/attributes
    sub var_a{
      my $self = shift @_;
      $self->{'var_a'} = $_[0] if @_;
      $self->{'var_a'}
    }
    

    ในตัวPerl6มันคือเขียน :

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • คุณสมบัติของ regex ที่ออกแบบมาไม่ดี

    /(?=regexp)/;           # look ahead
    /(?<=fixed-regexp)/;    # look behind
    /(?!regexp)/;           # negative look ahead
    /(?<!fixed-regexp)/;    # negative look behind
    /(?>regexp)/;           # independent sub expression
    /(capture)/;            # simple capture
    /(?:don't capture)/;    # non-capturing group
    /(?<name>regexp)/;      # named capture
    /[A-Z]/;                # character class
    /[^A-Z]/;               # inverted character class
    # '-' would have to be the first or last element in
    # the character class to include it in the match
    # without escaping it
    /(?(condition)yes-regexp)/;
    /(?(condition)yes-regexp|no-regexp)/;
    /\b\s*\b/;              # almost matches Perl6's <ws>
    /(?{ print "hi\n" })/;  # run perl code
    

    ในPerl6นั้นมีการเขียน :

    / <?before pattern>  /;   # lookahead
    / <?after pattern>   /;   # lookbehind
    / regexp :: pattern  /;   # backtracking control
    / ( capture )        /;   # simple capture
    / $<name>=[ regexp ] /;   # named capture
    / [ don't capture ]  /;   # non-capturing group
    / <[A..Z]>           /;   # character class
    / <-[A..Z]>          /;   # inverted character class
    # you don't generally use '.' in a character class anyway
    / <ws>               /;   # Smart whitespace match
    / { say 'hi' }       /;   # run perl code
    
  • ขาดการจัดส่งหลายรายการ

    sub f(   int $i ){ ... }  # err
    sub f( float $i ){ ... }  # err
    sub f($){ ... } # occasionally useful
    

    ในPerl6นั้นมีการเขียน :

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • ผู้ประกอบการแย่เกินไป

    package my_object;
    use overload
      '+' => \&add,
      ...
    ;
    

    ในPerl6นั้นมีการเขียน :

    multi sub infix:<+> (Us $us, Them $them) |
                        (Them $them, Us $us) { ... }
    

5
ฉันไม่เห็นว่าการขาด OO จริงนั้นแย่เท่าที่คุณทำ บางครั้งมันเป็นผู้ช่วยให้รอดโดยเฉพาะอย่างยิ่งเมื่อโมดูล CPAN ที่คุณใช้ไม่ได้คิดว่าจะเปิดเผยสิ่งที่คุณต้องการ และการขาดการจัดส่งหลายครั้งอาจแย่ลง: Perl สามารถพิมพ์ได้มาก ;-)
Tanktalus

3
ฉันชอบที่ Perl ไม่ได้พิมพ์อย่างรุนแรง แต่มันจะมีประโยชน์ในการเพิ่มข้อมูลประเภทบางอย่าง
Brad Gilbert

13
ดูเหมือนว่าคุณเลือกที่จะวิพากษ์วิจารณ์ภาษาที่ไม่ได้เป็นที่ชื่นชอบ (ที่คุณควรจะได้รับการวิพากษ์วิจารณ์ Perl6 ของคุณ)
Frew Schmidt

5
จุดประสงค์ของการเปรียบเทียบกับ Perl 6 คืออะไร คุณแนะนำว่า perl 6 สามารถแก้ไขปัญหาของคุณหรือดำเนินการต่อได้หรือไม่
Robert P

2
ฉันสงสัยว่าฉันต้องพูดมากกว่า: ozonehouse.com/mark/periodic
Arafangion

57

ฉันจะทำPHPตามที่ชอบในบางครั้งและ Python จะทำมากเกินไป

  • ไม่มีเนมสเปซ ทุกอย่างอยู่ในเนมสเปซที่ใหญ่มากซึ่งเป็นนรกในสภาพแวดล้อมที่ใหญ่กว่า

  • การขาดมาตรฐานเมื่อพูดถึงฟังก์ชั่น: ฟังก์ชั่นอาเรย์ใช้เข็มเป็นอาร์กิวเมนต์แรก, กองหญ้าเป็นครั้งที่สอง (ดูarray_search ) ฟังก์ชั่นสตริงมักจะใช้กองหญ้าก่อนเข็มที่สอง (ดู strpos ) ฟังก์ชั่นอื่น ๆ เพียงใช้รูปแบบการตั้งชื่อที่แตกต่างกัน: bin2hex , strtolower , cal_to_jd

    บางฟังก์ชั่นมีค่าตอบแทนแปลก ๆ จากสิ่งที่เป็นเรื่องปกติ: สิ่งนี้บังคับให้คุณมีตัวแปรที่สามที่ประกาศออกมาจากที่ใดก็ได้ในขณะที่ PHP สามารถตีความอาเรย์ที่ว่างเปล่าว่าเป็นเท็จด้วยการเล่นกลประเภท ไม่มีฟังก์ชั่นอื่น ๆ ทำเช่นเดียวกัน

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • ภาษา (จนกระทั่ง PHP6) ทำได้ดีที่สุดในการเคารพความเข้ากันได้แบบย้อนหลังที่ใกล้เคียงกันทำให้มันมีการปฏิบัติที่ไม่ดีและฟังก์ชั่นที่ไม่ดีเมื่อไม่จำเป็น (ดู mysql_escape_stringเทียบกับ mysql_real_escape_string )

  • ภาษาพัฒนาจากภาษาเทมเพลตไปเป็นแบ็กเอนด์แบบเต็ม ซึ่งหมายความว่าทุกคนสามารถแสดงผลอะไรก็ได้ตามต้องการและถูกใช้งานในทางที่ผิด คุณท้ายด้วยเทมเพลตเอ็นจิ้นสำหรับภาษาเทมเพลต ...

  • มันแย่ที่นำเข้าไฟล์ คุณมีวิธีที่แตกต่างกัน 4 วิธี (รวม, include_once, ต้องการ, require_once) พวกเขาทั้งหมดช้า, ช้ามาก อันที่จริงภาษาทั้งหมดช้า อย่างน้อยก็ค่อนข้างช้ากว่างูหลาม (แม้จะมีกรอบ) และ RoR จากสิ่งที่ฉันรวบรวม

ฉันยังคงชอบ PHP อยู่ นี่คือการพัฒนาเว็บไซต์: คุณต้องการให้เว็บไซต์ขนาดเล็กถึงขนาดกลางดำเนินการได้อย่างรวดเร็วและมั่นใจว่าทุกคนสามารถโฮสต์เว็บไซต์ได้ (แม้ว่าการกำหนดค่าอาจแตกต่างกัน) PHP อยู่ตรงนั้นและมันแพร่หลายดังนั้นมันใช้เวลาเพียง 5 นาทีในการติดตั้ง LAMP หรือ WAMP stack เต็มรูปแบบ ฉันจะกลับไปทำงานกับ Python ทันที ...


4
ฉันคิดว่าจุดที่ 1 ถูกนำมาใช้ใน 5.3 :) ในขณะที่การสั่งซื้อพารามิเตอร์กำลังเริ่มดีขึ้นการตั้งชื่อยังคงไม่ดี ฉันเห็นด้วยกับความเข้ากันได้ย้อนหลังแม้ว่า
Ross

4
ต้องรัก # 4 นั่นเป็นหนึ่งในสิ่งที่รบกวนฉันมากที่สุดตลอดเวลาเช่นกัน
Franz

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

17
no_really_now_mysql_escape_the_string_im_serious ()
Salaryman

2
เนมสเปซ schmamespaces PHP อยู่บนเวิลด์ไวด์เว็บดังนั้นทุกอย่างจึงควรเป็นของโลก
Evan Plaice

50

นี่คือบางสิ่งที่ฉันไม่ชอบเกี่ยวกับ Java (ซึ่งไม่ใช่ภาษาที่ฉันชอบ):

  • การลบประเภท Generics (เช่นไม่มีการแก้ไขทั่วไป)
  • ไม่สามารถดักจับข้อยกเว้นหลายชนิด (ของประเภทต่าง ๆ ) ใน catch catch เดียว
  • การขาด destructors (จบ () เป็นตัวเลือกที่แย่มาก)
  • ไม่รองรับการปิดหรือรักษาฟังก์ชั่นเนื่องจากเป็นข้อมูล (คลาสภายในที่ไม่ระบุชื่อเป็นตัวเลือกที่ละเอียดมาก)
  • ข้อยกเว้นที่ตรวจสอบโดยทั่วไปหรือเฉพาะเจาะจงมากขึ้นทำให้มีการตรวจสอบข้อยกเว้นที่ไม่สามารถกู้คืนได้ (เช่น SQLException)
  • ไม่มีการสนับสนุนระดับภาษาสำหรับคอลเลกชันที่แท้จริง
  • ไม่มีการอนุมานประเภทเมื่อคอนสตรัคเตอร์ของคลาสทั่วไปถูกเรียกเช่นพารามิเตอร์ประเภทต้องทำซ้ำทั้งสองด้านของ '='

1
@Svish - ฉันคิดว่าประเด็นคือคุณจะใช้โครงสร้างนี้เฉพาะเมื่อคุณไม่สนใจว่าคุณกำลังจัดการกับข้อยกเว้นประเภทใด ในคำอื่น ๆ เมื่อคุณต้องการที่จะจัดการกับพวกเขาทั้งหมดเหมือนกัน
Dónal

3
ฉันจะไม่เรียกว่าการขาด destructors ข้อบกพร่องเมื่อภาษามี GC และ GC ที่ดีขึ้นและดีขึ้นในแต่ละรุ่น destructors พลาดใน java 1.1.8 แต่ไม่ได้อยู่ใน java 6 เพราะ gc ได้รับการปรับปรุงอย่างมากมาย
Mike Reedell

7
C # แก้ไขสิ่งเหล่านี้ทั้งหมดยกเว้นการตรวจจับหลายข้อยกเว้น Generics จะได้รับการแก้ไขใหม่ destructors จะถูกแทนที่ด้วยการใช้ / IDisposable การปิดจะถูกนำมาใช้โดยวิธี anon และ lambdas ยกเว้นข้อ จำกัด ที่ไม่ได้ตรวจสอบมีตัวอักษรสะสมและมี 'var' เพื่อหลีกเลี่ยงการระบุชนิดที่สร้างขึ้นสองครั้ง
Daniel Earwicker

1
Java มีการปิดแน่นอน คลาสภายในที่ไม่ระบุชื่อปิดเหนือตัวแปรสุดท้ายในท้องถิ่นในขอบเขต ผมยอมรับว่าการเรียนภายในที่ไม่ระบุชื่อไม่ได้เป็นตัวแทนที่เหมาะสมสำหรับฟังก์ชั่นที่ไม่ระบุชื่อ แต่พวกเขามีการปิด
Adam Jaskiewicz

2
คลาสภายใน Anon ไม่ได้ปิด: ลองสร้างการโทรกลับของผู้เยี่ยมชมด้วยบางสิ่งเช่น "sum + = current.amount ()" ในนั้นโดยที่ "sum" เป็นตัวแปรที่ไม่ใช่ค่าสุดท้ายจากขอบเขตการล้อมรอบ ปิด แต่ไม่มีซิการ์
Roboprog

40

C ++

  1. เทมเพลตไวยากรณ์
  2. ปัญหาการสืบทอดเพชร
  3. ความอุดมสมบูรณ์ / ขาดห้องสมุดมาตรฐานที่ภาษาสมัยใหม่มี (แม้ว่าการเพิ่มจะมาใกล้)
  4. IOStreams
  5. ไวยากรณ์ที่ใช้รอบ ๆ IOStreams

หลาม

  1. ช่องว่างมีความหมาย (บางครั้ง)
  2. คำหลักที่ไม่เน้น
  3. การสนับสนุนเธรด จำกัด (อย่างน้อยปัจจุบัน)
  4. "ตนเอง" แทน "สิ่งนี้"
  5. ช่องว่างมีความหมาย (บางครั้ง)

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

36
ไปแล้วฉันจะแสดงรายการความหมายของช่องว่าง (โดยเฉพาะการเยื้อง) ใน Python ในฐานะหนึ่งในข้อดีที่ยิ่งใหญ่ที่สุด ... ;)
Oliver Giesen

22
"ช่องว่างมีความหมาย" เป็นหนึ่งในคุณสมบัติที่ดีที่สุดของงูหลาม !! ps พยายามเรียกใช้งานในล่าม "จากวงเล็บปีกกานำเข้าในอนาคต "
hasen

4
ฉันไม่เห็นด้วยกับรายการไพ ธ อนทั้งหมดยกเว้นการสนับสนุนเธรด ช่องว่างไม่มีความหมายการเยื้องนั้นมีความหมาย มีความแตกต่างใหญ่
Christian Oudard

3
ว้าว. มันไม่มีใครเหมือนผู้คิดค้นโปรแกรมแก้ไขข้อความที่ไฮไลต์ / แสดงช่องว่าง / แท็บเป็นตัวอักษรพิเศษ (คุณเขียนโค้ดอะไรใน Notepad) นอกจากนี้หากคุณขยายแท็บไปยังช่องว่างโปรดไปตายด้วยไฟ
ชื่อปลอม

37

Objective-C

1) ไม่มีเนมสเปซเพียงแค่การตั้งชื่อแบบแมนนวล - ฉันไม่สนใจสิ่งนั้นในแง่ของการแยกคลาส แต่ฉันไม่สามารถนำเข้าคำจำกัดความของคลาสทั้งหมดในเนมสเปซในบรรทัดเดียว (เช่น import com.me.somelibrary *)

2) ไลบรารียังมีช่องโหว่ในพื้นที่สำคัญเช่นการสนับสนุน RegEx

3) ไวยากรณ์ของคุณสมบัติเป็นบิตเงอะงะต้องสามบรรทัด (ในสองไฟล์แยก) เพื่อประกาศคุณสมบัติ

4) ฉันชอบรูปแบบการเก็บ / ปล่อย แต่มันง่ายกว่าที่ควรจะปล่อยการอ้างอิงแล้วตั้งใจใช้มันในภายหลัง

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


2
ยอมรับเกี่ยวกับ namespaces, prefixing คลาสที่มีรหัสตัวอักษรเป็นใบ้ และฉันจะเพิ่มการสนับสนุนที่ขาดหายไปสำหรับตัวแปรคลาสจริงฉันไม่ชอบแกล้งพวกเขาด้วยไฟล์สถิต
โซล

2
คุณสมบัติ Objective-C อย่างจริงจังพวกเขาตกตะลึงฉันไม่เข้าใจ hype โดยเฉพาะอย่างยิ่งการดูว่า C # ทำได้ดีแค่ไหน
Justicle

6
ที่จริงแล้วฉันชอบมุมมองของ Lisp และ ObjC จริงๆ - คุณแค่ต้องการเครื่องมือแก้ไขที่มีการจับคู่ที่ดีเช่น Emacs หรือ XCode ฉันมักจะพิมพ์วงเล็บปีกกาเป็นคู่ก่อนที่ฉันจะพิมพ์อะไรลงไปในนั้นดังนั้นฉันจึงไม่พบปัญหาเกี่ยวกับการจับคู่ ... และ XCode ยังสามารถเน้นบริเวณที่อยู่ในวงเล็บปีกกาด้วยการคลิกสองครั้งที่ประกอบด้วยวงเล็บปีกกา
Kendall Helmstetter Gelner

1
@Chris S: คุณกำลังพูดว่าYES/NObooleans เป็นสิ่งที่ไม่ดีเหรอ? และที่สำคัญคุณกำลังพูดว่าพารามิเตอร์ที่มีชื่อเป็นสิ่งที่ไม่ดีหรือไม่? ฉันเข้าใจ bools ได้ แต่ชื่อ params อาจเป็นหนึ่งในคุณสมบัติที่ดีที่สุดของ ObjC (ในแง่ของการอ่านได้)
jbrennan

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

36

C ++

  • เงื่อนไข
    พวกเขาไม่สามารถทำงานร่วมกับสตริงของแพลตฟอร์มดังนั้นคุณจะสิ้นสุดการใช้ std :: vector ครึ่งหนึ่งของเวลา นโยบายการคัดลอก (คัดลอกเมื่อเขียนหรือสำเนาลึก) ไม่ได้ถูกกำหนดดังนั้นการรับประกันประสิทธิภาพจึงไม่สามารถมอบให้กับไวยากรณ์ได้อย่างตรงไปตรงมา บางครั้งพวกเขาก็ใช้อัลกอริธึม STL ที่ไม่ค่อยใช้งานง่ายนัก ห้องสมุดหลายแห่งมีการม้วนของตัวเองซึ่งน่าเสียดายที่ใช้งานได้สะดวกกว่ามาก นอกเสียจากคุณจะต้องรวมมันเข้าด้วยกัน

  • ความหลากหลายของการเป็นตัวแทนสตริง
    ตอนนี้นี่เป็นปัญหาเล็กน้อยของแพลตฟอร์ม - แต่ฉันก็ยังหวังว่ามันจะดีกว่านี้เมื่อมีคลาสสตริงมาตรฐานที่ดื้อรั้นน้อยกว่าจะมีให้ก่อนหน้านี้ การเป็นตัวแทนสตริงต่อไปนี้ฉันใช้บ่อย:

    • LPCTSTR ทั่วไป
    • LPC (W) STR จัดสรรโดย CoTaskMemAlloc
    • BSTR, _bstr _t
    • (w) สตริง
    • CString,
    • Std :: เวกเตอร์
    • roll-my-own class ( ถอนหายใจ ) ที่เพิ่มการตรวจสอบพิสัยและการทำงานพื้นฐานให้กับ (w) char * buffer ของความยาวที่รู้จัก
  • สร้างแบบจำลอง
    ฉันป่วยจนตายตลอดเวลาที่ยุ่งเหยิงกับใคร - รวม - อะไรประกาศไปข้างหน้าการเพิ่มประสิทธิภาพส่วนหัว precompiled และรวมถึงการสร้างเวลาเพิ่มขึ้นอย่างน้อยก็ไว้ใจได้ ฯลฯ มันเยี่ยมมากในแปดสิบ แต่ตอนนี้? มีอุปสรรค์มากมายในการบรรจุรหัสเพื่อให้สามารถนำมาใช้ซ้ำได้แม้กระทั่งสุนัขที่เป็นแม่ก็เบื่อที่จะฟังฉัน

  • แยกวิเคราะห์ได้ยาก
    ทำให้เครื่องมือภายนอกเขียนได้ยากและถูกต้อง และวันนี้พวกเรา C ++ กำลังขาดส่วนใหญ่ในห่วงโซ่เครื่องมือ ฉันชอบภาพสะท้อน C # และตัวแทนของฉัน แต่ฉันสามารถอยู่ได้โดยปราศจากพวกเขา ฉันจะทำไม่ได้

  • การทำเกลียวเป็น
    ภาษาที่ยากเกินไปภาษายังจำไม่ได้ (ตอนนี้) และเสรีภาพของคอมไพเลอร์ - ในขณะที่ยอดเยี่ยม - ต้องเจ็บปวด

  • การเริ่มต้นแบบคงที่และตามความต้องการ ทางเทคนิคฉันโกงที่นี่: นี่เป็นอีกชิ้นส่วนปริศนาใน "สรุปรหัสเพื่อนำมาใช้ซ้ำ": มันเป็นฝันร้ายที่จะได้รับบางสิ่งบางอย่างเริ่มต้นเมื่อจำเป็นเท่านั้น ทางออกที่ดีที่สุดสำหรับปัญหา redist อื่น ๆ คือการทิ้งทุกอย่างไว้ในส่วนหัวปัญหานี้บอกว่า "neeener - คุณไม่สามารถ"


จริงอยู่ที่จำนวนมากนั้นอยู่นอกเหนือขอบเขตของภาษาที่เข้มงวด แต่ IMO จะต้องได้รับการตัดสินและจำเป็นต้องพัฒนา toolchain ทั้งหมด


การดูเอกสารเกี่ยวกับ STL นั้นเหมือนกับการค้นหาคู่มือเกี่ยวกับวิธีการสร้างกราฟิกการ์ดจากศูนย์
aviraldg

ตรงไปตรงมาประเด็นเหล่านี้ส่วนใหญ่ฟังดูเหมือนคุณไม่เคยสนใจที่จะเรียนรู้ C ++ อย่างถูกต้อง ... สิ่งนี้ค่อนข้างชัดเจนใน # 3 เนื่องจากการรวมการ์ดเป็นสิ่งที่โปรแกรมเมอร์ C ++ ทุกคนควรรู้ ฉันไม่แน่ใจว่าจะเข้าใจประเด็นที่ 1 เช่นกันคุณสับสนstd::stringอย่างไร อาจจะอ่านเอกสารที่ดีและ / หรือการสอนเกี่ยวกับstd::vector(และทำไมคุณไม่ควรใช้std::stringในสถานที่ที่มันไม่เคยออกแบบมา) สามารถล้างที่สำหรับคุณ

@nebukadnezzar: ฉันพบเมเยอร์สส่องสว่างบน STL แต่มันไม่ได้แก้ปัญหาพื้นฐาน ตรงไปตรงมานี้ดูเหมือนว่าคุณไม่ต้องรักษาโครงการขนาดใหญ่คุณไม่เคยต้องตามล่าการพึ่งพาแบบวนเป็นวงกลมในลำดับชั้นที่ลึกลงไปหลายสิบ ฉันรู้ว่ามีเจ้าหน้าที่รักษาความปลอดภัยด้วย แต่ทำไมเราต้องไปรบกวนพวกเขาด้วย? BTW พวกเขาไม่ได้แก้ไขปัญหาทุกข้อ "มาตรฐาน" เป็นstd::stringอย่างไรถ้าฉันไม่สามารถใช้งานได้ครึ่งเวลา (C ++ 0x เป็นอย่างน้อยแก้ไขได้ แต่ฉันยังคงติดอยู่กับห้องสมุดหลายสิบที่ใช้การเป็นตัวแทนสตริงที่แตกต่างกัน)
peterchen

but why do we have to bother with them (inclusion guards)- เนื่องจาก C ++ ไม่มีโมดูล How "standard" is a std::string if I can't use it half of the time?- std::stringผมคิดว่าขึ้นอยู่กับวิธีการใช้งาน คลาสสตริงอนุญาตให้คุณเข้าถึงข้อมูลสตริงเป็นconst char*ผ่านstd::string::c_strซึ่งทำให้std::stringเข้ากันได้อย่างสมบูรณ์กับทุกคลาส / ฟังก์ชันที่ใช้const char*อาร์กิวเมนต์

เพราะ C ++ ไม่มีโมดูล - สิ่งที่ฉันร้องเรียน: โมเดลบิลด์เป็นของเก่า (ฉันแค่ยอมรับโซลูชันอื่น ๆ นอกจากโมดูลด้วย) ----- เข้ากันได้อย่างสมบูรณ์แบบ - แต่เข้ากันไม่ได้อย่างสมบูรณ์แบบกับสถานการณ์อื่น ๆ อีกมากมาย (ฉันเถียง C ++ 0x การแก้ไขนี้บอกว่าฉันมีจุดที่นี่) ฉันจะมีความสุขถ้า std :: string ได้แพร่หลายพอที่จะ ได้ถูกนำมาใช้เป็นคลาสสตริงเมื่อ 10 ปีที่แล้ว แต่ไม่ใช่ - ข้อร้องเรียนอื่น
peterchen

35

จาวาสคริปต์ :

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

  • วัตถุทั้งหมดเป็นแผนที่แฮช แต่มันก็ยากที่จะใช้มันอย่างปลอดภัย โดยเฉพาะอย่างยิ่งหากมีหนึ่งในกุญแจของคุณเกิดขึ้นแสดงว่า__proto__คุณกำลังมีปัญหา

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

    • ผลที่ตามมา: การเรียกใช้ฟังก์ชั่นที่ไม่มีเครื่องหมายออบเจกต์หรือnewผลลัพธ์ของโอเปอเรเตอร์ในthisการตั้งค่าเท่ากับออบเจ็กต์ทั่วโลกทำให้เกิดการแตกหักมาก
  • ผู้ประกอบการเพิ่มเติมมากเกินไปที่จะทำการเรียงต่อกันสตริงแม้ว่าการดำเนินการทั้งสองจะแตกต่างกันโดยพื้นฐาน ส่งผลให้เกิดความเจ็บปวดเมื่อค่าที่คุณคาดว่าจะเป็นตัวเลขนั้นอันที่จริงแล้วเป็นสตริง

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

  • ทั้งสองnullและundefinedมีอยู่ด้วยความหมายที่แตกต่างกันอย่างละเอียด แต่ซ้ำซ้อน ทำไม?

  • ไวยากรณ์แปลกสำหรับการตั้งค่าเชนต้นแบบ

  • parseInt(s)คาดว่าจะเป็นหมายเลขรูปแบบ C ดังนั้นควรปฏิบัติต่อค่าที่มีเลขศูนย์นำหน้าเป็นเลขฐานแปดเป็นต้นอย่างน้อยที่สุดคุณสามารถทำได้parseInt(s, 10)แต่พฤติกรรมเริ่มต้นสับสน

  • ไม่มีขอบเขตบล็อก

  • สามารถประกาศตัวแปรเดียวกันได้มากกว่าหนึ่งครั้ง

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

  • with { }.

  • เอกสารยากจริง ๆด้วย JavaDoc เช่นเครื่องมือ


3
สำหรับnullและundefined: บางครั้งคุณต้องการทราบว่าตัวแปรได้รับการกำหนดค่าหรือไม่ เนื่องจาก null เป็นค่าการไม่ได้กำหนดเป็นวิธีเดียวที่จะบอกได้ ได้รับครั้งเดียวที่ฉันพบว่ามีประโยชน์นี้สำหรับการสร้างฟังก์ชั่น getter / setter
Zach

1
"ถ้าหนึ่งในกุญแจของคุณเป็นโปรโต " - มันเป็นคำสงวนที่มีความหมายพิเศษ มันเหมือนกับการบ่นว่าคุณไม่สามารถใช้forเป็นชื่อตัวแปรได้
nickf

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

2
โทมัส: ขึ้นบรรทัดใหม่มักจะไม่จบประโยค ดังนั้นรหัสที่สมเหตุสมผลจึงยกเลิกคำสั่งทุกคำด้วยเครื่องหมายอัฒภาคเพื่อทำให้รหัสชัดเจนยิ่งขึ้น
Daniel Cassidy

2
newline may or may not end a statement depending on contextเป็นหนึ่งใน 5 อันดับแรกของฉัน
reinierpost

34

งูหลาม:

  • ขาดการพิมพ์คงที่
  • การจัดการอาร์กิวเมนต์เริ่มต้น (โดยเฉพาะข้อเท็จจริงที่ว่าคุณสามารถเปลี่ยนอาร์กิวเมนต์เริ่มต้นได้สำหรับผู้โทรในอนาคต!)
  • มีขีดล่างที่จำเป็นมากเกินไป (ต้องเรียกตัวสร้าง __init__ )
  • การขาดสมาชิกและฟังก์ชั่นส่วนตัวที่เหมาะสม (การประชุมบอกว่าสิ่งที่เริ่มต้นด้วยการขีดเส้นใต้นั้นเป็นเรื่องส่วนตัวยกเว้นเรื่องทั้งหมดเช่น __getattr__ที่ไม่ใช่ทั้งหมด)
  • ไวยากรณ์ที่สนุกสนานสำหรับการprintเข้าสู่ไฟล์ (แต่พวกเขากำลังแก้ไขสิ่งนั้นใน Python 3)

10
สิ่งที่ฉันต้องการคือตัวเลือกในการใช้ประเภทคงที่
Greg Hewgill

4
BTW: initไม่ใช่ตัวสร้างจริง ๆ วัตถุถูกสร้างขึ้นแล้วเมื่อคุณเข้าไปที่นั่น (เดาว่าตัวเองคืออะไร ... ) คอนสตรัคเตอร์เป็นของใหม่ที่คุณสามารถเข้าถึงคลาสได้อย่างทันทีทันใด
André

90
ถ้าคุณชอบการพิมพ์แบบคงที่ทำไม Python เป็นภาษาโปรดของคุณ?
finnw

9
finnw: การพิมพ์แบบสแตติกเหมาะอย่างยิ่งสำหรับโปรแกรมบางประเภทและไม่จำเป็นสำหรับประเภทอื่น ๆ ฉันมักจะไม่รังเกียจการขาดการพิมพ์แบบสแตติก แต่เมื่อคุณต้องการมันเป็นเรื่องดีจริง ๆที่มีตัวเลือกอย่างน้อย
Greg Hewgill

8
ผมจะบอกว่าการขาดการพิมพ์แบบคงที่เป็นคุณลักษณะที่ไม่หายไปการทำงาน ...
arnorhs

32

ค#

  • ฉันหวังว่าฉันจะทำได้switch()ทุกประเภทและนั่นcaseอาจเป็นการแสดงออกใด ๆ

  • ไม่สามารถใช้ initializer วัตถุไวยากรณ์ด้วย 'อ่านได้อย่างเดียว' ฟิลด์ / private setautoprops โดยทั่วไปฉันต้องการความช่วยเหลือด้านภาษาในการสร้างประเภทที่ไม่เปลี่ยนรูป

  • ใช้{}สำหรับnamespaceและระดับและวิธีการและสถานที่ให้บริการ / บล็อกทำดัชนีและหลายคำสั่งบล็อกและinitializers อาร์เรย์ ทำให้ยากที่จะคิดออกว่าคุณอยู่ที่ไหนเมื่อพวกเขาอยู่ห่างไกลหรือไม่ตรงกัน

  • (from x in y ... select).Z()ฉันเกลียดการเขียน ฉันไม่ต้องการกลับไปใช้ไวยากรณ์การเรียกเมธอดเนื่องจากไวยากรณ์เคียวรีหายไป

  • ฉันต้องการdoประโยคในไวยากรณ์แบบสอบถามซึ่งเป็นเช่นforeachนั้น แต่มันไม่ใช่แบบสอบถามจริงๆ

ฉันมาถึงที่นี่จริงๆ ฉันคิดว่า C # นั้นยอดเยี่ยมมากและมันก็ยากที่จะพบว่ามันหัก


14
+1 เพื่อเปิดสวิตช์ชนิดใด ๆ
oɔɯǝɹ

+1 สำหรับประเด็นที่สวิทช์และ {} ปัญหาซึ่งผมไม่เคยคิดเกี่ยวกับมันจนถึงขณะนี้
Maslow

ฉันเกลียด {}. พวกเขาดูเหมือนมากเกินไป () ไม่ตรงกันไม่เคยมีปัญหามากสำหรับฉันเพราะฉันมักจะทำให้พวกเขาอยู่ในระดับเดียวกันเว้นแต่พวกเขาโดยทั่วไปหนึ่งสมุทร
Loren Pechtel

2
+1 สำหรับเคียวรี linq โดยเฉพาะอย่างยิ่งเมื่อคุณต้องการส่งคืนวัตถุหนึ่งเดียว แทน (จาก x ใน y เลือก) .first () ทำไมไม่ (จาก x ใน y เลือก top 1) หรือบางสิ่งบางอย่างเพื่อให้พอดีกับไวยากรณ์ sql จริง
AdmSteck

หากคุณต้องการคุณสามารถสลับ () กับรูปแบบใดก็ได้และในกรณีนั้นอาจเป็นการแสดงออกที่ตรวจสอบการจับคู่รูปแบบ F # c-sharpcorner.com/UploadFile/mgold/…
gradbot

26

PHP

  1. ไม่มีคุณสมบัติการแก้จุดบกพร่องหากคุณไม่ได้ควบคุมเซิร์ฟเวอร์และแม้กระทั่งพวกเขาก็ดูด
  2. จำนวนโค้ด PHP ที่แย่มากที่ลอยอยู่รอบ ๆ ทำให้โปรแกรมเมอร์ PHP ทุกคนมีชื่อไม่ดี
  3. การตั้งชื่อฟังก์ชั่นที่ไม่สอดคล้องกัน
  4. ไม่สามารถมีตัวแปรที่พิมพ์แบบคงที่หากฉันต้องการหนึ่ง (ฉันเป็นแฟนตัวยงของการพิมพ์แบบไดนามิก 90% ของเวลา)
  5. REGISTER_GLOBALS เป็นปีศาจ

25
REGISTER_GLOBALS ครั้งหนึ่งเคยกินสุนัขของฉัน :(
Pim Jager

2
1: ฉันแนะนำ xdebug และไคลเอนต์ GUI เช่น MacGDBp นั่นช่วยลดความเจ็บปวดลงได้จริง ... ฉันเห็นด้วยกับประเด็นอื่น
Jonas Due Vesterheden

5
# 2: โอ้พระเจ้าอย่าเริ่มต้นจากฉัน ฉันมักจะต้องปกป้องตัวเองในฐานะนักพัฒนา PHP กับคนที่เห็นความยุ่งเหยิงที่หลายคนสร้างด้วย PHP
selfawaresoup

1
+1 สำหรับ # 2 ฉันใช้เวลามากเกินไปในการป้องกันตัวเองในฐานะนักพัฒนา PHP
UnkwnTech

+1 สำหรับ # 2 - ส่งผลให้เงินเดือนไม่ดีเช่นกัน :(
ชิกิ

25

C (ตกลงมันไม่ใช่ของฉันที่ชอบ แต่ก็ยังไม่ได้ทำ)

  • ไวยากรณ์ไลบรารีซ็อกเก็ต
  • ไม่มีฟังก์ชั่นโอเวอร์โหลด
  • สตริงแบบ C
  • บัฟเฟอร์โอเวอร์รัน
  • ไวยากรณ์ที่เป็นความลับ ฉันไม่รู้ว่าฉันค้นหาอะเท่ยกี่ครั้งแล้วตบหน้าผากของฉันและตะโกนว่า "แน่นอน!"

แก้ไข: ฉันอาจจะเกิดขึ้นได้มากกว่านี้หากฉันใช้รหัสห้องสมุดเพิ่มเติม (เหมือนที่ฉันทำกับซ็อกเก็ต แต่มันแย่มาก) แต่ฉันรู้สึกเหมือนว่าฉันกำลังนอกใจในการเลือก C. ดังนั้นหลายภาษาจึงมีอยู่เท่านั้น ชิ้นส่วนที่ดีของ C และแทนที่สิ่งเลวร้ายที่เป็นเหมือนการตีม้าที่ตายแล้ว


22
ไวยากรณ์ของซ็อกเก็ตคืออะไร C ไม่มีแนวคิดของซ็อกเก็ต
Ferruccio

3
โอ้ c'mon! คุณสามารถเกิดขึ้นกับห้า การคำนวณทางคณิตศาสตร์ไม่เพียงแค่ดูด :)
brian d foy

8
+1 ฉันหัวเราะที่ "สตริงสไตล์ C" และ @brain_d_foy: ตัวชี้เลขคณิตเท่านั้น sucks ถ้าคุณไม่เข้าใจ
คริสลัทซ์

1
@ Chris Luts: แม้กระทั่งตอนที่ฉันเรียนธรรมดา C (ก่อนที่ฉันจะรู้ C ++ หรือภาษา OO อื่น ๆ ) ฉันเพิ่งรู้ว่ามีบางอย่างผิดปกติเกี่ยวกับอาร์เรย์อาร์เรย์ :)
Bill the Lizard

2
เลขคณิตของตัวชี้เป็นพลังที่เห็น - มีประสิทธิภาพมาก แต่คุณเสี่ยงที่จะได้รับผลประโยชน์ทั้งหมด
Thorbjørn Ravn Andersen

24

เสียงกระเพื่อมสามัญ:

  1. คำหลักมักจะพูดมากเกินไป
  2. การสนับสนุนห้องสมุดน่าสงสาร
  3. ทำงานได้ไม่ดีในระบบปฏิบัติการที่ต้องการจัดการกับหน่วยความจำอย่างเข้มงวดมากขึ้น
  4. ไม่มีสิ่งอำนวยความสะดวกที่ดีสำหรับการโต้ตอบกับระบบปฏิบัติการ
  5. สิ่งอำนวยความสะดวก "การวนรอบ" ไม่ได้ถูกกำหนดไว้อย่างดีและแน่นอนว่าไม่ได้ดู Lispy

2
'ลูป' อาจไม่ได้ดูไร้สาระ แต่มีคำจำกัดความเกี่ยวกับเรื่องนี้อย่างไร
Daniel Cassidy

2
ฉันไม่ได้อ่านมาตรฐานตัวเองฉันส่วนใหญ่จะเป็น "On Lisp" ของ Paul Graham เขาบอกว่ามาตรฐานส่วนใหญ่เป็นตัวอย่างและไม่ได้นิยามมุมกรณีใด ๆ เลย
David Thornley

3
คุณไม่ได้หมายถึงคำหลัก - เกินไป - คำเกินไปหรือ
GClaramunt

ฉันยอมรับว่าไม่ใช่ "lispy" แต่ CLtLv2 ใช้เวลากับมันมาก ฉันแค่คิดว่ามันถูกออกแบบมาให้ทำมากเกินไป sunsite.univie.ac.at/textbooks/cltl/clm/…
Hans Van Slooten

นอกเหนือจาก "ลูป" แล้ว "รูปแบบ" ก็ไม่ใช่ Lisplike มาก ฉันเกลียด "รูปแบบ" และ "วนซ้ำ" ทั้งคู่แม้ว่า Lisp เป็นภาษาที่ฉันโปรดปราน
Paul Reiners

24

BrainF * CK

  • ไฮไลท์ของคุณคือคุณทัวริงสมบูรณ์หรือไม่! ฉันสามารถทำเพิ่มเติมในการแสดงออกปกติ Perl!

  • การขาดวัตถุ C'mon ผู้คน! มันเหมือนสวัสดี ...

  • ไม่มีห้องสมุดเครือข่าย ทั้งหมดที่ฉันต้องการคือการขูดหน้าเว็บ GOSH

  • ไม่มีฟังก์ชั่นชั้นหนึ่ง ขอแสดงความยินดี - คุณได้ติดต่อกับเพื่อน Java ของคุณ

  • เทปที่ไม่มีที่สิ้นสุดสำหรับการจัดเก็บและไม่มีอะไรอื่น นี่เป็นการแสร้งทำโดย anally จนเราอาจจะเขียน Lisp


6
ไม่มีการสนับสนุนเนมสเปซหรือโมดูลแบบไดนามิก เราคาดว่าจะเขียนระบบควบคุมโรงงานเคมีโดยไม่มีพื้นฐานดังกล่าวได้อย่างไร
Donal Fellows

ไม่มีน้ำตาล syntactic เช่น> 10 (ย้าย 10 ครั้ง), 0 (ใส่ศูนย์), +5 (เพิ่ม 5)
พายุ

23

JavaScript

  1. numbers as strings - คณิตศาสตร์สามารถทำลายเมื่อตัวเลขถูกตีความว่าเป็นสตริง 5 + 2 = 52? ฮึ่ม ...
  2. สิทธิ์ - ทุกสิ่งที่ดีที่สุดต้องได้รับอนุญาตจากผู้ใช้!
  3. การอัพเดตหน้าจอ - เบราว์เซอร์จะต้องอยู่ในสถานะคงที่เพื่ออัปเดตหน้าจอ ดูเหมือนจะไม่มีวิธีบังคับให้หน้าจออัปเดตระหว่างกลางสคริปต์
  4. ช้า - แม้ว่า Chrome ของ Google จะดี ...
  5. ความแตกต่างของเบราว์เซอร์ทำให้การใช้ภาษาเป็น [เซ็นเซอร์]

4
แก้ไขหมายเลขเป็นสตริงได้อย่างง่ายดาย หากคุณเคยมีสตริงคุณจะต้องแยกวิเคราะห์ (x, 10) ความล้มเหลวครั้งใหญ่คือเมื่อคุณละทิ้ง 10 และมันตีความ '017' ว่าเป็น OCTAL
Orion Edwards

3
false == 0 == [] == "" แต่ null และ NaN ไม่ใช่ NaN! = NaN null == null
จิมมี่

7
พิมพ์of "a string" == "string" typeof new String ("สตริงอื่น") == "วัตถุสตริงใหม่ ('a'). constructor ==" a ". constructor. typeof new Array () == 'object'
Jimmy

1
สำหรับ (x in object) จะคืนค่าฟังก์ชัน
Jimmy

14
-1 รายการนี้ส่วนใหญ่เกี่ยวกับปัญหาเบราว์เซอร์ไม่ใช่ภาษาเอง
Mauricio Scheffer

20

PHP:

  • ไม่มีใครสามารถมั่นใจได้ว่าส่วนขยายบางอย่างที่พบได้ทั่วไปมีอยู่ในเว็บเซิร์ฟเวอร์ทั้งหมด
  • พยายามเป็นทุกอย่างในอนาคต (กลับไป, ปิด, ... )
  • ความเสี่ยงด้านความปลอดภัยมากมายสำหรับผู้ใช้ที่ไม่มีประสบการณ์
  • ผู้ประกอบการมากไปจะดี
  • โปรแกรมเมอร์ที่ไม่ดีทุกคนที่ไม่เรียนรู้วิธีทำให้มันทำงานอย่างถูกต้องและตั้งชื่อเสีย

อย่างไรก็ตาม PHP เป็น(สคริปต์) ภาษา ;-)


ตกลงอีกหนึ่งสิ่งที่จะไป!
brian d foy

4
เห็นด้วยกับประเด็น 5 - จะอยู่ในรายการ Javascript ด้วย
Steve Claridge

ฉันไม่เห็นด้วยกับ "โปรแกรมเมอร์ผู้น่าสงสารทุกคนที่ไม่ได้เรียนรู้วิธีทำให้มันทำงานอย่างถูกต้องและตั้งชื่อเสีย" ฉันจะแทนที่ด้วย "ตัวเลือกการกำหนดค่าภาษารันไทม์จำนวนมาก"
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

18

VB6

  1. Windows เท่านั้น
  2. ไม่รองรับอีกต่อไป
  3. อาร์เรย์สามารถเริ่มต้นที่หมายเลขใดก็ได้จากนั้นทั้งหมดจะถูกปรับเป็น 0
  4. แอปพลิเคชั่นที่คอมไพล์ขึ้นอยู่กับ dll หลายตัวเพื่อให้ทำงานได้อย่างถูกต้อง
  5. การควบคุมที่ซับซ้อนหลายอย่างเช่นการควบคุมเบราว์เซอร์หรือโค้ดที่ซับซ้อนมักจะทำลาย IDE เมื่อคุณรันโค้ดที่ไม่ได้คอมไพล์ แต่ทำงานได้ดีเมื่อคอมไพล์

13
VB เป็นภาษาโปรดของใครบางคน? O_o ทำไม "ซินแทซที่แตกต่างและเข้ากันไม่ได้กับภาษาอื่น" และ "ให้นิสัยที่ไม่ดีเกี่ยวกับภาษาอื่น" ที่นี่
Jonta

3
จริง ๆ แล้วฉันพบคุณลักษณะที่ทรงพลัง # 3 ไม่ใช่ข้อผิดพลาด - ฉันรัก VB.NET จริงๆที่มีสิ่งนี้ AWK มีมันในความรู้สึก แต่แล้วใน AWK อาร์เรย์จริงๆ hashes ในการปลอมตัว :(
โจ Pineda

3
ในวันที่ 1 และ 4 และ. NET C # ไม่ต้องการเฟรมเวิร์กและระบบปฏิบัติการที่สมบูรณ์ (เฮ้ฉันได้ยินมาว่าคุณโมโนคนโต ... มันยังคงเป็น "กรอบงานที่สมบูรณ์" สำหรับคุณและฉันสงสัยว่าคนเดเบียนมักจะกินมัน) เกี่ยวกับ 5 ไม่มีโปรแกรมเมอร์ VB6 ที่ถูกต้อง (ย้อนกลับไปในวัน) เก็บค่าเริ่มต้น "Compile On Demand" ตัวเลือก ON ...
jpinto3912

2
ยังคงต้องสนับสนุน vb6 เป็นครั้งคราว Pet pieves: ไม่สามารถเริ่มต้นตัวแปรเมื่อมีการประกาศไม่มีตัวสร้างแบบ parametrized, หนึ่งคลาสต่อไฟล์, ฯลฯ ... หากพวกเขาจะแก้ไขปัญหาเหล่านี้ภาษาสามารถดำเนินต่อไปได้อีก 10 ปี
AngryHacker

14
สิ่งที่เกี่ยวกับ "ในข้อผิดพลาดประวัติต่อไป" ... นั่นก็เหมือนกับการพูดว่า "รหัสนี้เป็น F ** KED แต่ให้ทำงานต่อไปได้เลย =)
StingyJack

18

Ruby เป็นภาษาโปรดของฉันนี่คือสิ่งที่ฉันไม่ชอบ:

  • เธรดเขียว + การบล็อกไลบรารี C = ยักษ์ล้มเหลว
  • ช้าดังนั้นอย่างช้าๆ
  • ไลบรารี่มาตรฐานนั้นไม่สอดคล้องกับการใช้ปัง! วิธีการ
  • โมดูลรวมถึงการขยายเป็นยุ่ง
  • "Open Classes" ไม่สามารถกำหนดขอบเขต - ฉันต้องการเพิ่ม String # dostuff แต่ฉันไม่ต้องการให้รั่วไหลลงในห้องสมุดบุคคลที่สามทั้งหมด
  • ไม่มีโซลูชันบรรจุภัณฑ์การปรับใช้ไบนารี

3
คุณเคยลอง Ruby 1.9.1 แล้วหรือยัง มันให้ความเร็วที่มากขึ้นเมื่อเทียบกับ Ruby 1.8.6
Christian Stade-Schuldt

ลอง jrubyc JVM JIT FTW!
KitsuneYMG

+1 สำหรับการรวมปัญหาที่สมเหตุสมผลซึ่งตรงข้ามกับคำว่า "เกลียด" จากคำตอบ Ruby อันดับต้น ๆ
Phrogz

17

Delphi:

  • IDE ค่อนข้างเสถียร
  • บางครั้งความเข้าใจโค้ดผิดพลาด
  • การแก้จุดบกพร่องบางครั้งก็บั๊ก
  • การอัปเดตไฟล์โครงการหลายไฟล์อาจเป็นเรื่องยุ่งยาก
  • หากเริ่มต้นเมื่อไม่มีแพ็คเกจใดแพ็คเกจหนึ่งข้อความแสดงข้อผิดพลาดจะปรากฏหลายครั้ง

5
ทั้งหมดเหล่านี้ดูเหมือนจะเป็นข้อร้องเรียนเกี่ยวกับ Delphi IDE ที่มากกว่า Delphi ภาษา (AKA วัตถุปาสคาล)
Dónal

11
สันนิษฐานว่าเป็นเพราะ Object Pascal นั้นสมบูรณ์แบบ ;-)
Mark Bessey

3
ฉันมาช้าไปงานปาร์ตี้ แต่ที่นี่จะไปต่อไป: - ต้องมีการเขียนลงนามวิธีการสองครั้ง (interface + การใช้งาน) - ชื่อหน่วยจะต้องเป็นเหมือนชื่อไฟล์ WTF?!?
Martijn

1
ฉันพบว่าการเริ่มต้น .. มีความเป็นเลิศ - ชัดเจนกว่า {} คุณใช้เวลาในการอ่านรหัสมากกว่าการเขียน อย่างไรก็ตามสำหรับ Gripe - คุณไม่สามารถใช้รูทีนย่อยของประเภทที่ระบุในกรณีได้แม้ว่าจะถูกกฎหมายถ้าคุณประกาศช่วงในกรณีนั้น นอกจากนี้ยังไม่มีการอ้างอิงไปข้างหน้าข้ามหน่วย
Loren Pechtel

1
@AlexanderN: ไม่มันไม่เคยเป็นที่นิยมหรือยิ่งใหญ่กว่านี้อีกแล้ว
Andreas Rejbrand

16

JavaScript

  • สคริปต์ทุกตัวจะถูกดำเนินการใน 'namespace' ระดับโลกเดียว ... สิ่งที่คุณต้องระวังเมื่อทำงานกับสคริปต์จากแหล่งต่าง ๆ

  • หากมีการใช้ตัวแปร แต่ยังไม่ได้กำหนดไว้ก่อนมือถือว่าเป็นตัวแปรทั่วโลก

  • ผู้ค้าเบราว์เซอร์สร้างมาตรฐานตามที่พวกเขาต้องการสร้างรหัสให้กับนักพัฒนาของเราโดยใช้ภาษาที่สวยงามกว่าที่ควรจะเป็น

  • Case-Sensitivity - พิจารณาว่าไม่มี IDE ที่เหมาะสมสำหรับการพัฒนา js ด้วยการตรวจสอบเวลาแบบคอมไพล์

  • วิธีแก้ปัญหา (เช่นการใช้hasOwnPropertyวิธีการ) เพื่อดำเนินการบางอย่างหรือดำเนินการอย่างง่าย


AFAIK ส่วนขยายทั้งหมดไปยังภาษา JS (ไม่ใช่ DOM) โดยผู้ขายเบราว์เซอร์ได้รับการผลักดันอย่างน้อยสำหรับการยอมรับมาตรฐานแม้ว่ากระบวนการมาตรฐานจะล้มเหลว hasOwnProperty / วิธีแก้ปัญหา: ดาบสองคม เพื่อบังคับให้ "ความเรียบง่าย" เราสูญเสียพลังและความยืดหยุ่นมากมาย การร้องเรียนนั้นทำให้ฉันโกรธ เขียนลูปของคุณถูกต้อง (และตรวจสอบสมาชิกวัตถุของคุณด้วย)!
...... ไม่มีตาเปล่า

15

Haskell:

  1. พื้นที่รั่วไหลจากการประเมินผลที่ขี้เกียจ
  2. ลำดับชั้นแบบตัวเลขไม่ได้สร้างขึ้นสำหรับนามธรรมทางคณิตศาสตร์
  3. monadic IO ที่เข้มงวดสามารถทำให้ยากต่อการดีบัก
  4. การใช้งานขนาดใหญ่จัดการ I / O ในรูปแบบที่ดูไม่เข้ากันกับมาตรฐาน (โดยเฉพาะอย่างยิ่งอักขระที่แสดงผลจะแสดงผลเพียง 8 บิตต่ำ - จากนั้นโค้ดจะถูกสร้างขึ้นซึ่งใช้สมมติฐานนี้เพื่อทำไบนารี I / O Ick.)
  5. ความเกี่ยวข้องของ($)ตัวดำเนินการอาจมีการเปลี่ยนแปลงเพื่อทำให้นิพจน์บางส่วนสวยขึ้น

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

แก้ไข: มีความสับสนเกี่ยวกับประเด็นที่ 5 โดยเฉพาะอย่างยิ่งบางคนดูเหมือนจะคิดว่าฉันหมายถึงลำดับของการขัดแย้งซึ่งฉันไม่ได้ แทนที่จะอธิบายสิ่งที่ฉันหมายถึงฉันจะชี้คนไปที่ลิงก์ต่อไปนี้http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativityซึ่งแสดงออกได้ดี


3
ทำไมคุณต้องการเปลี่ยนความสัมพันธ์ของ ($) วงเล็บ 'fghx' เป็น '((fg) h) x' และ 'f $ g $ h $ x' วงเล็บเหลี่ยมเป็น 'f (g (hx))' ...
Erik Hesselink

1
ฉัน <3 Haskell ห้องสมุดมาตรฐานต้องมีภูเขาที่เป็นนามธรรมของคณิตศาสตร์รวมถึงปริภูมิเวกเตอร์และคณะ โหมโรงยังต้องการโอเปอเรเตอร์ที่เชื่อมโยงเช่น ($) แต่จากซ้ายไปขวา {source |> func1 |> filter func2 |> map (func3 10)}
yfeldblum

10
คุณพลาดสิ่งที่แย่จริงๆ: แนวโน้มของโปรแกรมเมอร์ Haskell ที่จะใช้ชื่อตัวแปรตัวอักษรหนึ่งตัว
เบนจามิน Confino

1
ตัวดำเนินการที่อยู่ด้านซ้าย ($) เป็นเพียงแอปพลิเคชันฟังก์ชันซึ่งใน Haskell จะแสดงด้วยอักขระช่องว่าง @ Justice: ลองใช้ฟังก์ชั่นการพลิก (|>) = flip ($)
Apocalisp

1
ใครสามารถอธิบายจุด # 5 ฉันคิดว่าความสัมพันธ์ที่ถูกต้องคือจุดรวมของ ($)
ทิมแมตทิวส์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.