Năm điều bạn ghét về ngôn ngữ yêu thích của bạn là gì? [đóng cửa]


403

Gần đây đã có một nhóm Perl-ghét trên Stack Overflow, vì vậy tôi nghĩ rằng tôi sẽ mang câu hỏi " Năm điều bạn ghét về ngôn ngữ yêu thích của bạn " cho Stack Overflow. Lấy ngôn ngữ yêu thích của bạn và cho tôi biết năm điều bạn ghét về nó. Đó có thể là những điều khiến bạn khó chịu, thừa nhận lỗi thiết kế, các vấn đề về hiệu suất được công nhận hoặc bất kỳ danh mục nào khác. Bạn chỉ cần ghét nó, và nó phải là ngôn ngữ yêu thích của bạn.

Đừng so sánh nó với ngôn ngữ khác và đừng nói về những ngôn ngữ mà bạn đã ghét. Đừng nói về những điều bạn thích bằng ngôn ngữ yêu thích của bạn. Tôi chỉ muốn nghe những điều mà bạn ghét nhưng chịu đựng để bạn có thể sử dụng tất cả những thứ khác, và tôi muốn nghe về ngôn ngữ mà bạn muốn người khác sẽ sử dụng.

Tôi hỏi điều này bất cứ khi nào ai đó cố gắng đẩy ngôn ngữ yêu thích của họ lên tôi, và đôi khi là một câu hỏi phỏng vấn. Nếu ai đó không thể tìm thấy năm điều đáng ghét về công cụ yêu thích của mình, anh ta sẽ không biết rõ về nó để ủng hộ nó hoặc kiếm được số tiền lớn khi sử dụng nó. Anh ta đã không sử dụng nó trong các tình huống đủ khác nhau để khám phá nó hoàn toàn. Anh ấy ủng hộ nó như một nền văn hóa hoặc tôn giáo, điều đó có nghĩa là nếu tôi không chọn công nghệ yêu thích của anh ấy, tôi đã sai.

Tôi không quan tâm đến việc bạn sử dụng ngôn ngữ nào. Không muốn sử dụng một ngôn ngữ cụ thể? Vậy thì đừng. Bạn có cần mẫn để đưa ra lựa chọn sáng suốt mà vẫn không sử dụng nó? Khỏe. Đôi khi câu trả lời đúng là "Bạn có một đội ngũ lập trình mạnh với các thực tiễn tốt và nhiều kinh nghiệm trong Bar. Thay đổi thành Foo sẽ là ngu ngốc."


Đây là một câu hỏi tốt cho đánh giá mã quá. Những người thực sự biết một cơ sở mã sẽ có tất cả các loại đề xuất cho nó và những người không biết rõ về nó có những khiếu nại không cụ thể. Tôi hỏi những câu như "Nếu bạn có thể bắt đầu lại dự án này, bạn sẽ làm gì khác?" Ở vùng đất giả tưởng này, người dùng và lập trình viên có thể phàn nàn về bất cứ điều gì và mọi thứ họ không thích. "Tôi muốn có giao diện tốt hơn", "Tôi muốn tách mô hình khỏi chế độ xem", "Tôi sẽ sử dụng mô-đun này thay vì mô-đun khác", "Tôi đổi tên bộ phương thức này" hoặc bất cứ điều gì họ thực sự không Tôi không thích tình hình hiện tại. Đó là cách tôi nắm được số lượng nhà phát triển cụ thể biết về cơ sở mã. Nó cũng là một đầu mối về bao nhiêu lập trình viên '

Ghét không phải là chiều kích duy nhất để tìm hiểu xem mọi người biết bao nhiêu, nhưng tôi đã thấy nó là một thứ khá tốt. Những điều họ ghét cũng cho tôi manh mối họ nghĩ về chủ đề này tốt như thế nào.


11
Đây là một spin thực sự tốt đẹp cho câu hỏi "ngôn ngữ yêu thích" cũ của bạn. Tốt biện minh.
Tom Leys

14
Tôi thấy thú vị rằng mặc dù SO có một lượng lớn khán giả .NET, tại thời điểm viết bài này có 24 câu trả lời, chỉ có một câu trong số đó là về ngôn ngữ .NET hoặc ngôn ngữ .NET. Tôi không biết điều này nói gì về SO hay .NET, nhưng thật thú vị ...
Jon Skeet

22
15 năm đầu tiên lập trình với C / C ++, tôi ghét (theo thứ tự bảng chữ cái): 1. Con trỏ 2. Con trỏ 3. Con trỏ 4. Con trỏ 5. Con trỏ
ileon

4
Tôi tự hỏi có bao nhiêu ý kiến ​​mọi người đưa ra về việc ghét ngôn ngữ của họ vì họ không hiểu cách lập trình theo ngôn ngữ họ chọn ....
Kris.Mitchell

3
Đây là một câu hỏi tuyệt vời. Nếu bạn đang tự hỏi một số ngôn ngữ là gì, đọc 3 câu trả lời khác nhau về ngôn ngữ này trên trang này sẽ dễ dàng là thông tin hữu ích tốt nhất dành cho thời gian bạn có thể tìm thấy. Cũng là một cách tuyệt vời để đánh giá mức độ kinh nghiệm (và khiêm tốn) của lập trình viên nếu bạn đã biết ngôn ngữ.
j_random_hacker

Câu trả lời:


182

Năm điều tôi ghét về Java:

  • Không có chức năng hạng nhất.
  • Không suy luận kiểu.
  • Thiếu mặc định lành mạnh trong ví dụ đồ họa.
  • NullPulumException không chứa thêm thông tin về những gì là null.
  • Sự phổ biến của các khung / giao diện nhà cung cấp dịch vụ / các lớp nhà máy / hệ thống tiêm phụ thuộc vô nghĩa. Khả năng cấu hình gần như không bao giờ được sử dụng, DRY bị vi phạm nghiêm trọng, và mã tăng gấp bốn lần kích thước và một nửa về mức độ dễ đọc.

Tôi biết, tôi nên kiểm tra Scala.


7
@both: NPE được hiển thị trong dòng đầu tiên của trạng thái ngăn xếp. Nó chứa (hầu hết thời gian) lớp, tên tệp java và số dòng như: "at your.faulty.code.Instance (Intance.java:1234)" Sau đó, bạn chỉ cần mở tệp đó, đi đến dòng đó và ở đó là, một biến không có gì được gán cho nó.
OscarRyz

35
@Oscar Reyes - Er, chúng tôi biết điều đó. Nhưng có thể có nhiều biến trên dòng đó và thông báo ngoại lệ không cho tôi biết biến nào là null.
Zarkonnen

10
Scala cũng có mụn cóc. Tuy nhiên, nó tốt hơn nhiều so với Java.
Wheaties

10
+1 cho sự phổ biến của các khung, v.v.
Erich Kitzmueller

6
@Valentin, hãy tưởng tượng sự thú vị của NullPulumException trong một logfile khổng lồ từ hoạt động hàng đêm và bạn cần tìm hiểu điều gì đã xảy ra ... Gỡ lỗi không phải là một lựa chọn.
Thorbjørn Ravn Andersen

216

Ồ, tôi ngạc nhiên khi SQL chưa xuất hiện ở đây. Đoán có nghĩa là không ai yêu nó :)

  • Cú pháp không nhất quán trong quá trình thực hiện
  • Sự khác biệt mã tinh tế có thể có sự phân nhánh hiệu suất lớn vì những lý do dường như tối nghĩa
  • Hỗ trợ kém cho thao tác văn bản
  • Chi phí đầu vào dễ dàng nhưng đường cong học tập dốc để làm chủ ngôn ngữ
  • Tiêu chuẩn hóa tối thiểu trên toàn cộng đồng cho các thực tiễn tốt nhất, điều này bao gồm kiểu cú pháp.

... Và một vài lý do thưởng để ghét nó, không tính thêm phí

  • mệnh đề WHERE đi sau cùng, giúp dễ dàng thực hiện sớm CẬP NHẬT hoặc XÓA, phá hủy toàn bộ bảng. Thay vào đó, WHERE nên đi đâu đó lên phía trước.
  • Thật khó để thực hiện phân chia quan hệ.
  • Tôi có thể đặt giá trị thành NULL, nhưng tôi không thể kiểm tra giá trị đó bằng với NULL. Tôi có thể kiểm tra IS NULL, nhưng theo tôi thì điều đó chỉ làm phức tạp mã - không cần thiết như vậy.
  • Tại sao chúng ta cần phải hoàn toàn xác nhận lại công thức cho một cột NHÓM, thay vì đặt bí danh trên cột và sau đó NHÓM theo bí danh (hoặc chỉ mục cột như với SORT)?

7
Có lẽ không ai có thể học cách yêu nó cho đến khi họ ngừng nghĩ về nó như một ngôn ngữ. :)
Alan Moore

4
+1 cho mọi thứ. Nhưng mọi người tự hỏi tại sao tôi lại phải chịu đựng những cơn đau đầu của ORM ...
James Schek

2
@Alan M ... không phải đó là những gì L đại diện cho? :)
Kev

29
Tôi không thể hiểu tại sao cú pháp cho INSERT lại khác với CẬP NHẬT. Và MERGE là không thể hiểu được.
LaJmOn

3
Sự cần thiết của IS NULL phải rõ ràng, nếu bạn cho rằng NULL là kết quả thứ ba có thể, ngay sau TRUE và FALSE. Vì ý nghĩa của nó là "không xác định", bạn không thể biết liệu thứ gì đó chưa biết có khớp với thứ khác không xác định hay không. Một ví dụ khác: nếu NULL bằng NULL thì điều này có nghĩa là toàn bộ khái niệm tạo THAM GIA là không thể, vì bất kỳ giá trị NULL nào cũng có thể được khớp với giá trị NULL khác. Nếu bạn hiểu điều này (cái còn được gọi là logic ternary) thì bạn có thể hiểu lý do giới thiệu toán tử "IS" để thử nghiệm chống lại NULL.
Alex

159

JavaScript :

  1. Tất cả những điều tuyệt vời nhất đều cực kỳ phức tạp, nhưng sau đó, tất cả sự mát mẻ cũng được gói gọn trong một số lượng mã nhỏ đến mức bạn cảm thấy ngu ngốc khi phải vật lộn để theo dõi nó

  2. '+' là một lựa chọn vô lý của nhà điều hành để ghép nối trong một ngôn ngữ được gõ yếu. Có phải họ đang cố gắng để sợ các noobs?

  3. Đó là một mỏ khai thác tương thích trình duyệt chéo (đừng bận tâm liệu nó có bật hay không)

  4. Nói chung là không đáng tin cậy - liên quan đến các trò gian lận như chặn nút quay lại, cửa sổ bật lên không bao giờ chết, v.v.

  5. Gần như không thể gỡ lỗi vì chỉ có một vài thông báo lỗi khác nhau và một vài loại khác nhau (Số, Chuỗi, Đối tượng, v.v.)

Nếu nó không dành cho jQuery, có lẽ tôi vẫn ghét nó nhiều như trước đây :)


15
Tôi đồng ý với mausch. ECMAscript trong và bản thân nó là một ngôn ngữ đẹp và mạnh mẽ. Đó là các trình duyệt pesky (: ho: IE) làm rối tên của nó.
TJ L

32
@Mausch: nơi nào javascript sống trong rộng lớn đa số trường hợp? Bạn đang nói tương đương với "ô tô không góp phần vào sự nóng lên toàn cầu, đó là lái xe ô tô" - đúng, tất nhiên, nhưng thiếu điểm - bạn còn làm gì với một chiếc xe hơi?
jTresidder

20
@Chris: Có, "+" là một toán tử tốt để ghép nối trong một ngôn ngữ được gõ mạnh (như Python). Trong một ngôn ngữ được gõ yếu (như Javascript hoặc C), điều đó thật tồi tệ; nó quyết định (âm thầm!) rằng 'sum:' + 2 + 3 không phải là 'sum: 5' mà là 'sum: 23'. Ai đó có nhiều kinh nghiệm Javascript có thể đưa ra ví dụ tốt hơn.
ShreevatsaR

5
Có, C được gõ yếu, so với, giả sử, Python (ví dụ: bạn có thể gán số nguyên cho chars, truyền bất kỳ thứ gì vào bất cứ thứ gì thông qua con trỏ void *, v.v.) Nó đượctĩnh thay vì gõ động , và cũng yêu cầu gõ rõ ràng thay vì kiểu suy luận, nhưng những cái đó không liên quan đến kiểu gõ mạnh v / s. [Ví dụ ngẫu nhiên: Python có kiểu gõ mạnh động ngầm, Haskell có kiểu gõ mạnh tĩnh (Java rõ ràng), kiểu gõ mạnh rõ ràng (chủ yếu là tĩnh), C có kiểu gõ tĩnh (tương đối yếu) rõ ràng.] "Gõ mạnh" và "gõ yếu "Thực sự không được xác định rõ.
ShreevatsaR

5
@ShreevatsaR Ví dụ clasical là: '3'+'2'='32', '3'-'2'=1.
Thomas Ahle

148

PHP:

1) Buộc tôi thực hiện các biến không cần thiết:

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

2) Việc triển khai lambdas rất khập khiễng tương đương với việc sử dụng eval()và rất sai lầm tôi chưa bao giờ sử dụng nó (xem http://www.php.net/create_feft ).

3) Một hệ thống thử / bắt chỉ có thể bắt được khoảng 80% lỗi có thể xảy ra.

4) Hỗ trợ Regex cũng khập khiễng như hỗ trợ lambda vì nó phải được viết bên trong các chuỗi thông thường, làm cho một trong những công cụ lập trình khó học nhất khó gấp ba lần. Và PHP được cho là một ngôn ngữ "dễ dàng"?!?!?

5) Không có cách nào có thể rút nội dung ra khỏi $ _POST một cách an toàn mà không cần viết hai lần hoặc xây dựng chức năng của riêng bạn hoặc sử dụng toán tử '@':

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

6) Trả lời tiền thưởng: '@'. Nếu bạn không thể bận tâm viết mã chính xác, chỉ cần thêm '@' và quá tệ cho bất kỳ ai phải gỡ lỗi mã của bạn sau này.


44
what about list ($ first) = explode ('|', $ string); ?
mlarsen

44
Lý tưởng nhất, tôi muốn sử dụng some_feft (explode ('|', $ string) [0]);
quá nhiều php

8
Phạm vi biến kỳ lạ gì? Có tất cả mọi thứ cục bộ và buộc bạn phải khai báo khi bạn muốn sử dụng toàn cầu là một ý tưởng hay, nó ngăn không cho các noobs tạo các hàm chỉ sử dụng toàn cục, thay vì sử dụng các đối số và trả về các giá trị như họ nên làm.
scragar

24
bạn đã quên các chức năng với thứ tự tham số thay đổi ngẫu nhiên
dusoft

39
Bạn đã quên về verbNoun, verb_noun, noun_verb, nounverb, verbnoun, nounVerb, v.v> _>
Warty

135

C ++

  • Quá dễ dàng để bộ nhớ bị hỏng ngẫu nhiên và tạo ra các lỗi gần như không thể tìm thấy (mặc dù, Valgrind đã đi một chặng đường dài để sửa lỗi này).
  • Thông báo lỗi mẫu.
  • Khi sử dụng các mẫu, thật dễ dàng để kết thúc mọi thứ trong một tệp và sau đó nhận được các lần biên dịch ngu ngốc.
  • Thư viện chuẩn là một trò đùa trong thời hiện đại (mặc định vẫn không có chủ đề hoặc mạng?)
  • Rất nhiều bit nhỏ khó chịu của C chọc qua (đặc biệt là tất cả các chuyển đổi giữa short / int / unsign / etc ..)

13
Tôi đồng ý với STL, nhưng tôi sẽ nói những gì có khá tốt.
Bernard

22
unicode. Tôi tôn trọng sự đơn giản của ascii, nhưng vì lòng tốt, chúng ta đã bước sang thế kỷ 21 bây giờ.
wilmustell

29
@Kieveli const chính xác thực sự là một trong những điều tôi nhớ nhất khi lập trình bằng các ngôn ngữ khác. đặc biệt là những người năng động gõ. raii là một tính năng lớn tôi cũng thường bỏ lỡ.
wilmustell

6
Hầu hết các vấn đề về C ++ đến từ việc trở thành tiêu chuẩn ISO và bị khóa trong 10 năm.
graham.reeds

7
+1 "Thông báo lỗi mẫu."
João Portela

129

CNET:

  • Các lớp nên được niêm phong theo mặc định
  • Không nên có locktuyên bố - thay vào đó, bạn nên có các đối tượng khóa cụ thể và nên có các phương thức như Acquiretrả lại mã thông báo khóa dùng một lần. Hệ quả: không nên có màn hình cho mọi đối tượng.
  • GetHashCode()Equals()không nên ở trong System.Object- không phải mọi thứ đều phù hợp để băm. Thay vào đó, có một IdentityComparermà làm điều tương tự, và giữ cho IComparer<T>, IComparable<T>, IEqualityComparer<T>IEquatable<T>giao diện để so sánh tùy chỉnh.
  • Hỗ trợ kém cho sự bất biến
  • Cách kém để khám phá các phương thức mở rộng - đó sẽ là một quyết định sáng suốt hơn nhiều so với thực tế là tôi đang sử dụng một không gian tên.

Những thứ đó nằm ngoài đỉnh đầu của tôi - hãy hỏi tôi vào ngày mai và tôi sẽ đưa ra một 5 khác nhau :)


22
Được niêm phong theo mặc định: kế thừa nên được thiết kế thành một lớp (làm mất thời gian và giới hạn các tùy chọn trong tương lai) hoặc bị cấm. hashCode / bằng: nó cũng hút trong Java. Một ngày nào đó tôi sẽ viết một bài blog dài về nó. Đọc Java hiệu quả để biết chi tiết về lý do tại sao bằng là khó trong chuỗi thừa kế.
Jon Skeet

88
Niêm phong theo mặc định có nghĩa là bạn đã nghĩ đến mọi lý do có thể mà ai đó có thể muốn thừa kế từ lớp của bạn và bạn không nghĩ bất kỳ ai trong số họ có ý nghĩa. Xin lỗi, nhưng không ai trong chúng ta thông minh đến thế.
Ed S.

69
Trong trường hợp đó, tôi không đủ thông minh để bạn lấy từ mã của mình: bởi vì tôi không thể dự đoán những thay đổi trong tương lai mà tôi có thể thực hiện có thể phá vỡ mã của bạn. Đó là một vấn đề rất quan trọng, IMO. Niêm phong mã là hạn chế hơn, nhưng dẫn đến tự do thực hiện và mạnh mẽ hơn.
Jon Skeet

11
Tôi không thể tin rằng không ai đề cập đến cú pháp "trường hợp goto", tôi ghét cái đó!
Aistina

20
Đó là một điều tốt Jon Skeet đã không thiết kế C #, hoặc danh sách của tôi sẽ giống như "1. các lớp được niêm phong theo mặc định; 2. khóa quá phức tạp; 3. hầu hết các đối tượng không thể băm được"!
Gabe

113

C

  • thao tác chuỗi.

Phải xử lý thủ công với bộ đệm chuỗi là một nỗi đau dễ bị lỗi. Vì rất nhiều máy tính thực sự di chuyển và sửa đổi các chuỗi (máy tính không được sử dụng nhiều cho các công cụ khủng hoảng số lượng lớn như mọi người nghĩ rằng chúng sẽ quay trở lại khi nào), thật tuyệt khi có thể sử dụng ngôn ngữ được quản lý hoặc chuỗi của C ++ đối tượng để đối phó với những điều này. Khi tôi phải làm điều đó trong C thẳng, cảm giác như bơi trong cát lún.


50
Đã đồng ý. Thao tác chuỗi là mục 1 đến 5 điều tôi ghét về C.
BoltBait

1
Chỉ cần sử dụng thư viện chuỗi an toàn của DJB hoặc một cái gì đó. Thao tác XML rất khó đối với hầu hết các ngôn ngữ và rất nhiều chương trình thực hiện thao tác XML, nhưng bạn không thấy nhiều bài đăng có nội dung "Perl bị hỏng hoàn toàn vì nó không hỗ trợ các nút DOM như một kiểu dữ liệu nguyên thủy". Họ sử dụng một thư viện.
Steve Jessop

5
Thao tác chuỗi C không tệ, nhưng theo như các vấn đề ngôn ngữ, thì đó không phải là điều tồi tệ nhất.
Chris Lutz

3
strcat để nối, nhưng chờ ... đích có đủ không gian không ... ok, phải chèn câu lệnh if để kiểm tra ... nhưng chờ đã, nếu chuỗi của tôi nằm trên heap thì sao? Ok, phải giữ một biến xung quanh để theo dõi kích thước ... Và điều này có thể tiếp tục và tiếp tục ...
blwy10

4
Chúng tôi cần một chủ đề cho năm điều chúng tôi không ghét về C ...
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

94

Làm thế nào về năm điều tôi ghét về danh sách "Những điều tôi ghét về một số ngôn ngữ"? : D

5- Vẽ một màu đỏ cam không làm cho nó trở thành một quả táo.

Khi một ngôn ngữ được thiết kế, các nhà thiết kế thường nghĩ rằng nó hữu ích cho việc gì. Sử dụng nó cho một cái gì đó hoàn toàn khác nhau có thể làm việc, nhưng phàn nàn khi nó không chỉ là ngu ngốc. Lấy Python. Tôi chắc chắn ai đó sẽ có ai đó hoặc một ngày nào đó sẽ tạo ra một tiện ích để tạo exe từ mã Python. Tại sao trên trái đất của Thiên Chúa bạn muốn làm điều đó? Nó sẽ gọn gàng không khiến tôi hiểu nhầm nhưng nó không có tác dụng. Vì vậy, hãy ngừng phàn nàn về nó!

Một dự án được thiết kế tốt có thể sẽ chứa mã từ nhiều ngôn ngữ. Điều đó không có nghĩa là bạn không thể hoàn thành một dự án chỉ với một ngôn ngữ. Một số dự án có thể nằm trong khả năng của bất kỳ ngôn ngữ nào bạn đang sử dụng.

4- Bạn đang đứng trên chân gỗ?

Nền tảng có thể là một ảnh hưởng lớn của những gì ngôn ngữ có thể làm. Với những người thu gom rác hiện nay, hoặc thậm chí là những kẻ phát xít cố gắng sớm "thu gom rác", có thể hỗ trợ làm mờ bộ nhớ (có thể là malloc nhiều ram hơn ??). Máy tính nhanh hơn và tất nhiên, chúng tôi mong đợi nhiều ngôn ngữ hơn. Và khá thẳng thắn, có lẽ chúng ta nên. Tuy nhiên, có một cái giá rất lớn để trả cho sự tiện lợi của trình biên dịch để tạo các bảng hoặc chuỗi băm hoặc một loạt các khái niệm khác. Những thứ này có thể không được kế thừa cho nền tảng mà chúng được sử dụng. Để nói rằng chúng dễ dàng bao gồm một ngôn ngữ chỉ cho tôi biết bạn có thể không có chân để đứng.

3- Lỗi thực sự là của ai?

Lỗi. Bạn biết. Tôi yêu bọ. Tại sao tôi yêu bọ. Bởi vì nó có nghĩa là tôi có thể giữ công việc của mình. Nếu không có lỗi, sẽ có nhiều cửa hàng pizza đóng cửa. Tuy nhiên, người dùng ghét lỗi. Nhưng đây là một chút nước lạnh. Mỗi lỗi lỗi lập trình viên. Không phải ngôn ngữ. Một ngôn ngữ có cú pháp chặt chẽ như vậy sẽ làm giảm đáng kể số lượng lỗi có thể tạo ra sẽ là một ngôn ngữ hoàn toàn vô dụng. Khả năng của nó có thể được tính bằng một tay. Bạn muốn linh hoạt hay sức mạnh? Bạn đã có lỗi. Tại sao? Bởi vì bạn không hoàn hảo, và bạn mắc lỗi. Lấy một ví dụ thực sự có thể xác định được trong C:

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

Chúng ta đều biết những gì sẽ làm. Tuy nhiên, điều mà có lẽ một số người trong chúng ta không nhận ra là .. chức năng đó có thể rất có lợi. Tùy thuộc vào những gì bạn đang làm. Bộ đệm tràn là chi phí của chức năng đó. Mã đó ở trên. Nếu tôi thực sự phát hành nó cho công chúng. Đó là một lần nữa .. nói với tôi .. "Lỗi của tôi". Không phải C là cho phép tôi làm điều đó.

2- Chúng ta không nên bỏ nó vào thùng rác?

Rất dễ để chỉ ra một tính năng trong ngôn ngữ mà chúng tôi không hiểu vì chúng tôi không sử dụng nó thường xuyên và gọi nó là ngu ngốc. Khiếu nại rằng nó ở đó, vv Goto luôn luôn giải trí cho tôi. Mọi người luôn phàn nàn về việc goto đang ở trong một ngôn ngữ. Tuy nhiên, tôi đặt cược chương trình cuối cùng của bạn bao gồm một loại goto. Nếu bạn đã từng sử dụng giờ nghỉ hoặc tiếp tục, bạn đã sử dụng goto. Đó là những gì nó được. Cấp, đó là một goto "an toàn", nhưng đó là những gì nó được. Goto có công dụng của chúng. Cho dù gotos "ngầm" như tiếp tục hay phá vỡ được sử dụng hoặc gotos rõ ràng (sử dụng từ khóa "goto" thực tế cho bất kỳ ngôn ngữ nào). Không phải các nhà phát triển ngôn ngữ là hoàn hảo, nhưng thông thường ... nếu chức năng đã tồn tại từ thời bình minh (đối với ngôn ngữ đó). Có khả năng khía cạnh đó là một chất lượng xác định của ngôn ngữ đó. Có nghĩa là .. nó ' s đang được sử dụng và có khả năng không treo xung quanh vì khả năng tương thích ngược. Nó đang được sử dụng ngày hôm nay. Như trong 5 phút trước. Và sử dụng đúng cách. Chà .. có thể nói ai đó đang sử dụng nó không đúng cách, nhưng điều đó liên quan đến # 3 trong danh sách của tôi.

1. - Mọi thứ đều là một đối tượng.

Ok .. cái này thực sự là một tập hợp con của # 2. Nhưng đây là lời phàn nàn khó chịu nhất mà tôi thấy trong danh sách ghét. Không phải tất cả mọi thứ là một đối tượng. Có rất nhiều khái niệm không thuộc hoặc không cần phải là đối tượng. Đặt những thứ mà chúng không thuộc về chỉ là xấu xí và có thể làm giảm hiệu quả của một chương trình. Chắc chắn rồi. Có lẽ không nhiều tùy thuộc vào ngôn ngữ. Điều này cũng liên quan đến # 5. Điều này có nghĩa là ... có. Toàn cầu đều ổn. Các chức năng như được áp dụng cho các phương thức tĩnh là ok. Kết hợp lập trình OO với các chức năng toàn cầu là ok. Bây giờ .. điều đó không có nghĩa là tất cả chúng ta nên ra ngoài và "giải phóng" mã của chúng tôi khỏi các mô hình đối tượng. Khi thiết kế một phần mã hoặc toàn bộ dự án, những gì xảy ra đằng sau hậu trường nênđược xem xét khi đặt nó cùng nhau. Không chỉ nơi khái niệm đó sống và nhiều yếu tố khác. Tại sao bọc các hàm toàn cục trong các lớp hoặc đặt tên cho các khái niệm không gian nếu nó không phục vụ mục đích? Lấy biến thành viên tĩnh. Điều đó rất thú vị với tôi bởi vì .. tốt .. Phụ thuộc vào ngôn ngữ và việc thực hiện tất nhiên, nhưng nói chung, bạn vừa tuyên bố một toàn cầu. Có, có một số lý do để bọc các khái niệm không phải OO này trong các trình bao bọc OO. Một khóa học là tự viết mã. Điều đó có thể có ý nghĩa. Vì vậy, như tôi nói. Đừng ra ngoài và "giải phóng" mã của bạn. Nhưng bất kỳ ngôn ngữ hiện đại tốt nào cũng sẽ có một khái niệm toàn cầu bên ngoài mô hình OO. Có, tôi đặc biệt có ý chỉ ra rằng một ngôn ngữ lập trình OO không có khái niệm toàn cầu rất có thể có một lỗi thiết kế nghiêm trọng. Một lần nữa mặc dù .. phụ thuộc vào ý định và thiết kế của ngôn ngữ, vì vậy tôi không cố gắng chọn bất kỳ ngôn ngữ cụ thể nào và có quá nhiều thứ để phân tích ngay tại đây. Dù sao đi nữa, hãy xem xét nơi mã nên sống và là hiệu quả nhất. Thêm một loạt flare vào thứ gì đó không thêm chức năng hoặc hỗ trợ chỉ làm mòn bàn phím nhanh hơn. Nó không làm ai tốt cả. Chà .. trừ khi bạn thích điểm brownie từ người có lẽ đã dạy bạn không chính xác rằng mọi thứ đều là một đối tượng.

Nói tóm lại, lập trình không chỉ đơn giản là gõ nhẹ vào bàn phím. Có rất nhiều cân nhắc thiết kế cho bất kỳ dự án. Tôi biết đó là sáo rỗng, nhưng bạn phải nhìn nó từ mọi góc độ. Ngay cả với các ngôn ngữ hiện nay loại an toàn. Bạn không chỉ cần tặc mã ra và mong nó hoạt động tốt. Chắc chắn .. nó có thể hoạt động, nhưng nó có thể không phải là cách đúng đắn để đi về nó. Nhìn chung, chọn ngôn ngữ và định dạng phù hợp nhất cho công việc cụ thể VÀ môi trường. Nhưng không có ngôn ngữ nào lấy đi ý nghĩ đằng sau nó. Nếu bạn không suy nghĩ .. bạn chỉ cần gõ.


19
Ngôn ngữ không hoàn hảo và nếu bạn lập danh sách những điều bạn ghét về ngôn ngữ, bạn có thể nhận được một số nhận xét và ý tưởng thú vị. Đầu tiên, nó cho phép người khác cung cấp cho bạn các giải pháp mà bạn không biết đã tồn tại (xem qua các bài đăng, bạn sẽ thấy một vài điều đã được học). Thứ hai, nó tạo thành phản hồi của người dùng cho các nhà phát triển ngôn ngữ (bạn sẽ không quan tâm nếu người dùng của bạn đưa ra danh sách 5 điều họ ghét nhất về phần mềm của bạn?), Và thứ ba, thật thú vị khi suy ngẫm về những sai sót các công cụ của bạn.
Sylverdrag

4
Nếu bạn xem nó ở cấp độ đó, không chỉ phá vỡ và tiếp tục là gotos, mà các vòng lặp là gotos (nhảy đầu vòng lặp nếu điều kiện được đáp ứng), nếu là goto (nếu điều kiện không được đáp ứng, hãy nhảy qua khối, gọi hàm là goto (nhảy đến điểm bắt đầu của chức năng và sau đó nhảy trở lại), ...
helium

17
Tạo tập tin thực thi từ mã nguồn "không sử dụng"? Gì?
gièm pha

4
Perl có thể tạo một tệp thực thi từ tệp Perl kể từ cuối thập niên 80. Một điều để phân phối là hữu ích. Không cần a) cài đặt Perl, b) cài đặt các thành phần của chương trình, c) có thể viết một tập lệnh để đặt đường dẫn và thực hiện tất cả ... Vâng, thực sự vô dụng.
xcramp

1
Nhưng, nếu bạn không thể tạo tệp .exe từ nguồn, người dùng windows sẽ không thể chạy nó. ;)
Evan Plaice

88

Năm điều tôi ghét về Java (hiện tại là ngôn ngữ yêu thích của tôi) không theo thứ tự cụ thể.

  1. Nhiều như tôi là một fan hâm mộ của Java Generics, có rất nhiều điều kỳ lạ phát sinh từ cách nó được thiết kế. Như vậy, có vô số hạn chế gây khó chịu với thuốc generic (một số trong đó là kết quả của việc xóa kiểu).
  2. Cách Object.clone () và các giao diện Clonizable hoạt động hoàn toàn bị phá vỡ.
  3. Thay vì đi đường cao tốc và biến mọi thứ thành một đối tượng (a.la. SmallTalk), Sun đã loại bỏ hai loại dữ liệu khác nhau: Đối tượng và nguyên thủy. Kết quả là bây giờ có hai đại diện cho các loại dữ liệu cơ bản và sự tò mò lớn hơn như quyền anh / unboxing và không thể đưa nguyên thủy vào Bộ sưu tập.
  4. Xoay quá phức tạp. Đừng hiểu sai ý tôi: có rất nhiều thứ hay ho có thể làm với Swing nhưng đó là một ví dụ tuyệt vời về kỹ thuật quá mức.
  5. Khiếu nại cuối cùng này cũng là lỗi của Sun và những người đã viết thư viện XML cho Java. Các thư viện Java XML quá phức tạp. Để chỉ cần đọc trong tệp XML, tôi thường phải lo lắng về việc tôi đang sử dụng trình phân tích cú pháp nào: DOM hoặc SAX? Các API cho mỗi loại đều khó hiểu như nhau. Hỗ trợ riêng trong ngôn ngữ để dễ dàng phân tích cú pháp / viết XML sẽ rất hay.
  6. java.util.Date hút. Không chỉ phức tạp không cần thiết mà tất cả các phương pháp hữu ích đã bị phản đối (và được thay thế bằng các phương pháp khác làm tăng độ phức tạp).

32
Bạn đã quên java.util.Date!
TM.

3
Ngoài ra: Giao diện "Clonizable" không có phương thức "clone ()". Điều này làm cho giao diện Clonizable trở thành một Oxymoron. Và vì clone () trả về một Object, loại an toàn nằm ngoài cửa sổ (không xuất hiện bất kỳ nỗ lực nào để khắc phục điều này ngay cả sau khi Generics đã được giới thiệu trong J2SE 5.0).
Ryan Delucchi

2
Miễn là chúng tôi bash clonable, cũng có thể bao gồm cái gọi là "giao diện" Nối tiếp. Bất cứ khi nào sử dụng nó, tôi luôn muốn tự đâm mình.
WDS

12
Khó để làm những việc đơn giản như mở một tập tin và đọc từ nó.
Eric Johnson

3
@Ryan clone () không nhất thiết phải trả về "Object". Với J2SE 5.0 Java, các kiểu trả về covariant được giới thiệu, có nghĩa là bạn có thể trả về bất kỳ kiểu con nào của lớp cơ sở. Vì vậy, công khai bản sao MyType () IS!
helpermethod

73

Ruby có nhiều sai sót liên quan đến tốc độ của nó, nhưng tôi không ghét chúng. Nó cũng có những sai sót với việc truyền giáo cộng đồng quá mức, nhưng điều đó không thực sự làm tôi bận tâm. Đây là những gì tôi ghét:

  • Các bao (khối) có 4 cú pháp tạo khác nhau và không có cú pháp nào là tối ưu. Cú pháp tao nhã không đầy đủ và mơ hồ với các giá trị băm, và cú pháp đầy đủ là xấu.
  • Cộng đồng có xu hướng chống lại tài liệu thực tế, ủng hộ 'đọc mã'. Tôi thấy điều này trẻ con và lười biếng.
  • Lạm dụng siêu lập trình, đặc biệt là trong các thư viện, khiến các lỗi trở thành một cơn ác mộng để theo dõi.
  • Trên một lưu ý liên quan, siêu lập trình phổ biến làm cho một IDE toàn diện trở nên khó khăn, nếu không muốn nói là không thể thực hiện được.
  • Cách khối truyền đến các chức năng được thực hiện là ngớ ngẩn. Không có khối lý do nào được chuyển ra ngoài danh sách tham số hoặc có cú pháp đặc biệt kỳ lạ để truy cập (sản lượng). Tôi cho rằng các khối nên được cung cấp một cú pháp ít mơ hồ hơn (hoặc băm có thể đã sử dụng các dấu phân cách khác nhau; có lẽ <> thay vì {}) và chuyển làm tham số cho các phương thức nên giống như tất cả các tham số khác.

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

    Những điều kỳ lạ này, như khối phải là tham số cuối cùng được truyền và vượt qua nhiều khối khác nhau với cú pháp dài hơn, thực sự làm tôi khó chịu.


2
hỗ trợ m17n & unicode tối ưu mặc dù nó đang trở nên tốt hơn. 1.9 vẫn còn phức tạp ...
Keltia

37
Tôi nghĩ rằng lạm dụng siêu lập trình được gọi là "ruby idiomatic" :)
Slartibartfast

2
akway: Hai cú pháp còn lại là lambdaProc.new .
Myrddin Emrys

2
Tài liệu lại, tôi đã từng nghe một cuộc nói chuyện của một người làm việc tại nhà xuất bản Lập trình viên thực dụng, người nói rằng khi công ty được thành lập, họ muốn có một cuốn sách Ruby vì cuốn duy nhất có sẵn bằng tiếng Nhật. Vì vậy, họ có thể đã có cuốn sách đó được dịch và xuất bản bởi công ty của họ. Nhưng những gì họ đã làm thay vì đọc những gì mã nguồn :-) Cuốn sách Ruby rõ ràng là một trong những cuốn sách ra mắt Lập trình viên thực dụng.
Arthur Reutenauer

13
Tôi thấy thú vị rằng 3 trong số này là để làm với mọi người chứ không phải ngôn ngữ. Ruby vẫn là ngôn ngữ tôi ghét nhất.
Toby Hede

72

Perl

  • Sử dụng hỗn hợp 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;
    
    • Ví dụ, không ai trong số này giống nhau:

      $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'
      

    Trong Perl6đó có viết :

    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;
    
  • Thiếu OO thực sự

    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'}
    }
    

    Trong Perl6đó có viết :

    class Dog is Mammal {
        has $.name = "fido";
        has $.tail is rw;
        has @.legs;
        has $!brain;
        method doit ($a, $b, $c) { ... }
        ...
    }
    
  • Các tính năng regex được thiết kế kém

    /(?=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
    

    Trong Perl6đó có viết :

    / <?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
    
  • Thiếu nhiều công văn

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

    Trong Perl6đó có viết :

    multi sub f( int $i ){ ... }
    multi sub f( num $i ){ ... }
    multi sub f( $i where $i == 0 ){ ... }
    multi sub f(     $i ){ ... } # everything else
    
  • Quá tải vận hành kém

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

    Trong Perl6đó có viết :

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

5
Tôi không thấy thiếu OO thực sự cũng tệ như bạn làm. Đôi khi, đó là một vị cứu tinh, đặc biệt là khi mô-đun CPAN bạn đang sử dụng không nghĩ sẽ phơi bày những gì bạn cần. Và thiếu nhiều công văn có thể tồi tệ hơn: perl có thể đã được gõ mạnh ;-)
Tanktalus

3
Tôi thích rằng Perl không được gõ mạnh, nhưng sẽ hữu ích khi thêm vào một số thông tin loại.
Brad Gilbert

13
Có vẻ như bạn đã chọn chỉ trích một ngôn ngữ không phải là ngôn ngữ yêu thích của bạn (bạn nên chỉ trích perl6)
Frew Schmidt

5
Điểm so sánh với perl 6 là gì? Bạn có gợi ý rằng perl 6 sửa chữa các vấn đề của bạn, hoặc tiếp tục chúng?
Robert P

2
Tôi nghi ngờ tôi cần nói nhiều hơn: ozonehouse.com/mark/ periodic
Arafangion

57

Đôi khi tôi sẽ làm PHP vì tôi thích nó và Python sẽ được thực hiện quá nhiều.

  • Không có không gian tên; mọi thứ đều ở trong một không gian tên rất lớn, là địa ngục trong môi trường lớn hơn

  • Thiếu các tiêu chuẩn khi nói đến các hàm: các hàm mảng lấy kim làm đối số thứ nhất, haystack là thứ hai (xem mảng_search ). Các hàm chuỗi thường lấy haystack trước, kim thứ hai (xem strpose ). Các hàm khác chỉ sử dụng các sơ đồ đặt tên khác nhau: bin2hex , strtolower , cal_to_jd

    Một số hàm có các giá trị trả về kỳ lạ, không bình thường: Điều này buộc bạn phải có một biến thứ ba được khai báo từ hư không trong khi PHP có thể diễn giải một mảng trống là sai với kiểu tung hứng của nó. Gần như không có chức năng khác làm tương tự.

    $var = preg_match_all('/regexp/', $str, $ret);
    echo $var; //outputs the number of matches 
    print_r($ret); //outputs the matches as an array
    
  • Ngôn ngữ (cho đến PHP6) làm hết sức để tôn trọng khả năng tương thích ngược gần như chậm phát triển, khiến nó mang theo các thực tiễn và chức năng xấu khi không cần thiết (xem mysql_escape_opes so với mysql_real_escape_opes ).

  • Ngôn ngữ phát triển từ ngôn ngữ tạo khuôn mẫu sang ngôn ngữ phụ trợ đầy đủ. Điều này có nghĩa là bất cứ ai cũng có thể xuất bất cứ thứ gì khi họ muốn, và nó bị lạm dụng. Bạn kết thúc với các công cụ mẫu cho một ngôn ngữ tạo khuôn mẫu ...

  • Nó hút lúc nhập tập tin. Bạn có 4 cách khác nhau để làm điều đó (bao gồm, bao gồm_once, request, request_once), tất cả đều chậm, rất chậm. Trong thực tế, toàn bộ ngôn ngữ là chậm. Ít nhất, khá chậm hơn python (ngay cả với một khung) và RoR từ những gì tôi thu thập được.

Tôi vẫn thích PHP, mặc dù. Đó là sự phát triển của web: bạn muốn một trang web vừa và nhỏ được thực hiện nhanh chóng và chắc chắn rằng bất kỳ ai cũng có thể lưu trữ nó (mặc dù cấu hình có thể khác nhau)? PHP ở ngay đó và nó rất phổ biến, chỉ mất 5 phút để cài đặt một ngăn xếp LAMP hoặc WAMP đầy đủ. Chà, giờ tôi sẽ quay lại làm việc với Python ...


4
Tôi cho rằng điểm 1 được thực hiện trong 5.3 :) Trong khi việc đặt hàng param ngày càng tốt hơn thì việc đặt tên vẫn còn kém. Tôi đồng ý với khả năng tương thích ngược mặc dù.
Ross

4
Phải yêu # 4. Đó cũng là một trong những điều khiến tôi bận tâm nhất.
Franz

1
Tôi nghĩ rằng, đối số tốc độ là khá chủ quan. Tốc độ phụ thuộc nhiều vào mức độ hiệu quả của mã so với chính ngôn ngữ. Mã PHP kém có lẽ chậm hơn mã python chất lượng cao nhưng PHP tốt cũng có thể hoạt động tốt hơn Python kém.
selfawaresoup

17
no_really_now_mysql_escape_the_opes_im_serious ()
Salaryman

2
không gian tên schmamespaces. PHP có trên web trên toàn thế giới vì vậy mọi thứ phải toàn cầu
Evan Plaice

50

Đây là một số điều tôi không thích về Java (không phải là ngôn ngữ yêu thích của tôi):

  • Generics loại erasure (tức là không có tướng tổng hợp)
  • Không có khả năng bắt nhiều ngoại lệ (thuộc các loại khác nhau) trong một khối bắt đơn
  • Thiếu các hàm hủy (hoàn thiện () là một thay thế rất kém)
  • Không hỗ trợ cho việc đóng hoặc xử lý các chức năng như dữ liệu (các lớp bên trong ẩn danh là một thay thế rất dài dòng)
  • Các trường hợp ngoại lệ được kiểm tra nói chung, hoặc cụ thể hơn, làm cho các ngoại lệ không thể phục hồi được kiểm tra (ví dụ: SQLException)
  • Không hỗ trợ cấp độ ngôn ngữ cho các bộ sưu tập theo nghĩa đen
  • Không có suy luận kiểu khi các hàm tạo của các lớp chung được gọi, tức là (các) tham số loại phải được lặp lại ở cả hai phía của '='

1
@Svish - Tôi nghĩ vấn đề là bạn sẽ chỉ sử dụng cấu trúc này khi bạn không quan tâm loại ngoại lệ nào bạn đang xử lý. Nói cách khác, khi bạn muốn xử lý tất cả chúng giống hệt nhau
Dónal

3
Tôi sẽ không gọi việc thiếu các công cụ hủy diệt là một lỗ hổng khi ngôn ngữ có một GC và một GC sẽ ngày càng tốt hơn với mỗi bản phát hành. Các cấu trúc hủy đã bị bỏ lỡ trong java 1.1.8 nhưng không phải trong java 6 vì gc được cải thiện rất nhiều.
Mike Reedell

7
C # sửa tất cả những thứ này trừ việc bắt nhiều ngoại lệ. Generics được thống nhất, các hàm hủy được thay thế bằng cách sử dụng / IDis Dùng, các lần đóng được thực hiện bằng phương pháp anon và lambdas, các trường hợp ngoại lệ không được kiểm tra, có các ký tự tập hợp và có 'var' để tránh chỉ định loại được xây dựng hai lần.
Daniel Earwicker

1
Java chắc chắn có đóng cửa. Một lớp bên trong ẩn danh đóng trên các biến cuối cùng cục bộ trong phạm vi của nó. Tôi đồng ý rằng các lớp bên trong ẩn danh không phải là sự thay thế thích hợp cho các hàm ẩn danh, nhưng chúng là các bao đóng.
Adam Jaskiewicz

2
Các lớp bên trong của Anon KHÔNG đóng: thử tạo một cuộc gọi lại của khách truy cập với một cái gì đó như "sum + = current.amount ()" trong đó, "sum" là một biến không phải là cuối cùng từ phạm vi kèm theo. Gần, nhưng không có xì gà.
Roboprog

40

C ++

  1. Cú pháp mẫu
  2. Vấn đề thừa kế kim cương
  3. Rất nhiều / thiếu các thư viện tiêu chuẩn mà các ngôn ngữ hiện đại có (mặc dù tăng đến gần).
  4. Truyền hình
  5. Cú pháp được sử dụng xung quanh IOStreams

Con trăn

  1. Không gian có ý nghĩa (đôi khi)
  2. từ khóa thiếu
  3. Hỗ trợ luồng hạn chế (ít nhất là hiện tại)
  4. "tự" thay vì "này"
  5. Không gian có ý nghĩa (đôi khi)

80
Bạn có thể gọi "bản thân" là "cái này" là bạn thực sự muốn (mặc dù người khác có thể khó theo dõi). "Tự" không phải là một từ khóa và bạn có thể đặt tên cho biến bạn muốn.
mipadi

36
bạn đi rồi, tôi thực sự sẽ liệt kê ý nghĩa của khoảng trắng (đặc biệt là thụt đầu dòng) trong Python là một trong những điểm cộng lớn nhất của nó ...;)
Oliver Giesen

22
"không gian có ý nghĩa" là một trong những tính năng tốt nhất của python !! ps cố gắng chạy này trong một thông dịch viên "từ tương lai niềng răng nhập khẩu"
Hasen

4
Tôi không đồng ý với khá nhiều danh sách python của bạn, ngoại trừ hỗ trợ chủ đề. Khoảng trắng không có ý nghĩa, thụt là có ý nghĩa; có một sự khác biệt lớn
Christian Oudard

3
Ồ Giống như không ai phát minh ra trình soạn thảo văn bản làm nổi bật / hiển thị khoảng trắng / tab dưới dạng ký tự đặc biệt (Cái gì, bạn đang mã hóa trong notepad?). Ngoài ra, nếu bạn mở rộng các tab thành không gian, xin vui lòng chết trong lửa.
Tên giả

37

Mục tiêu-C

1) Không có không gian tên, chỉ có các quy ước đặt tên thủ công - Tôi không bận tâm rằng về mặt phân tách lớp, nhưng tôi không thể nhập tất cả các định nghĩa lớp trong một không gian tên trong một dòng duy nhất (như nhập com.me.somel Library. *).

2) Thư viện vẫn còn một số lỗ hổng trong các lĩnh vực quan trọng như hỗ trợ RegEx.

3) Cú pháp thuộc tính là một chút vụng về, yêu cầu ba dòng (trong hai tệp riêng biệt) để khai báo một thuộc tính.

4) Tôi thích mô hình giữ lại / phát hành, nhưng nó dễ dàng hơn là phát hành một tài liệu tham khảo và sau đó vô tình sử dụng nó sau này.

5) Mặc dù không thực sự là một tính năng ngôn ngữ, Xcode rất đan xen với việc sử dụng Objective-C Tôi không thể không nghĩ về khía cạnh đó ... về cơ bản là tự động hoàn thành, rất iffy. Nó giống như một hệ thống thưởng cho bạn vì đã tìm thấy thứ bạn muốn tồn tại, và sau đó trình bày nó như một sự lựa chọn sau đó. Nhưng sau đó tôi cho rằng tôi chưa bao giờ thích động cơ tự động hoàn thành.


2
Đồng ý về các không gian tên, các lớp tiền tố với mã chữ cái là ngu ngốc. Và tôi sẽ thêm hỗ trợ còn thiếu cho các biến lớp thực, tôi không thích giả mạo chúng bằng thống kê tệp.
zoul

2
Tính chất khách quan-C. Nghiêm túc mà nói, họ đang gây sốc, tôi không thể hiểu được sự cường điệu đặc biệt là xem C # làm họ tốt như thế nào.
Justicle

6
Trên thực tế tôi thực sự thích khía cạnh đó của Lisp và ObjC - bạn chỉ cần một trình soạn thảo có kết hợp niềng răng tốt, như Emacs hoặc XCode. Tôi thường gõ niềng răng theo cặp trước khi tôi nhập bất cứ thứ gì vào chúng, vì vậy tôi không thực sự gặp vấn đề với khớp ... và XCode cũng có thể làm nổi bật vùng được bao quanh bởi một dấu ngoặc chỉ bằng cách nhấp đúp vào một trong hai nẹp.
Kendall Helmstetter Gelner

1
@Chris S: Bạn đang nói YES/NOvề booleans là một điều xấu? Và quan trọng hơn, bạn đang nói Thông số được đặt tên là một điều xấu ?? Tôi có thể hiểu bool, nhưng params có tên có thể là một trong những tính năng tốt nhất của ObjC (về khả năng đọc).
jbrennan

3
Có lẽ tôi là một masochist, nhưng tôi thích tên lớp có tiền tố. Nó làm cho google và các tài liệu tìm kiếm rõ ràng, không bao giờ có bất kỳ sự nhầm lẫn nào về loại chuỗi bạn sử dụng nếu lớp được gọi là NSString.
kubi

36

C ++

  • Dây.
    Chúng không thể tương tác với các chuỗi nền tảng, vì vậy cuối cùng bạn sử dụng std :: vector một nửa thời gian. Chính sách sao chép (sao chép trên ghi hoặc sao chép sâu) không được xác định, do đó không thể đưa ra đảm bảo hiệu suất cho cú pháp đơn giản. Đôi khi, họ dựa vào các thuật toán STL không trực quan để sử dụng. Quá nhiều thư viện tự cuộn mà không may sử dụng thoải mái hơn nhiều. Trừ khi bạn phải kết hợp chúng.

  • Sự đa dạng của các biểu diễn chuỗi
    Bây giờ, đây là một chút vấn đề về nền tảng - nhưng tôi vẫn hy vọng nó sẽ tốt hơn khi một lớp chuỗi tiêu chuẩn ít cố chấp hơn đã có sẵn trước đó. Các đại diện chuỗi sau đây tôi sử dụng thường xuyên:

    • LPCTSTR chung,
    • LPC (W) STR được phân bổ bởi CoTaskMem ALLoc,
    • BSTR, _bstr _t
    • (w) chuỗi,
    • Chuỗi C,
    • std :: vector
    • một lớp roll-my-own ( thở dài ) thêm kiểm tra phạm vi và các hoạt động cơ bản vào bộ đệm (w) char * có độ dài đã biết
  • Xây dựng mô hình.
    Tôi phát ốm với tất cả thời gian dành cho việc nhầm lẫn với những người bao gồm những gì, tuyên bố chuyển tiếp, tối ưu hóa các tiêu đề được biên dịch trước và bao gồm để giữ cho thời gian xây dựng tăng ít nhất có thể chịu được, v.v. Có rất nhiều trở ngại để đóng gói một đoạn mã để nó có thể được sử dụng lại đến nỗi ngay cả chó mẹ cũng cảm thấy chán khi nghe tôi nói.

  • Khó phân tích
    Điều này làm cho các công cụ bên ngoài đặc biệt khó viết và đúng. Và ngày nay, những người C ++ của chúng ta đang thiếu chủ yếu trong chuỗi công cụ. Tôi yêu sự phản ánh C # của tôi và các đại biểu nhưng tôi có thể sống mà không có họ. Nếu không tái cấu trúc tuyệt vời, tôi không thể.

  • Việc phân luồng quá khó
    Ngôn ngữ thậm chí không nhận ra nó (bây giờ) và các quyền tự do của trình biên dịch - trong khi tuyệt vời - là đau đớn.

  • Khởi tạo tĩnh và theo yêu cầu Về mặt kỹ thuật, tôi gian lận ở đây: đây là một mảnh ghép khác trong "mã bọc để tái sử dụng": Thật là một cơn ác mộng khi chỉ cần khởi tạo một cái gì đó khi cần thiết. Giải pháp tốt nhất cho tất cả các vấn đề phân phối lại khác là ném mọi thứ vào tiêu đề, vấn đề này nói "neeener - bạn không thể".


Cấp, rất nhiều trong số đó vượt quá phạm vi ngôn ngữ nghiêm ngặt, nhưng IMO toàn bộ chuỗi công cụ cần phải được đánh giá và cần phát triển.


Tìm tài liệu về STL giống như tìm hướng dẫn sử dụng về cách xây dựng card đồ họa từ đầu.
aviraldg

Thành thật mà nói, hầu hết những điểm này nghe có vẻ như bạn chưa bao giờ bận tâm để học C ++ đúng cách ... điều này trở nên khá rõ ràng trong # 3, vì các trình bảo vệ bao gồm là điều mà mọi lập trình viên C ++ nên biết. Tôi cũng không chắc làm thế nào để hiểu Điểm 1, bạn có bối rối std::stringkhông? có thể đọc một tài liệu tốt và / hoặc hướng dẫn về std::vector(và tại sao bạn không nên sử dụng std::stringở những nơi không bao giờ được thiết kế) có thể làm rõ điều đó cho bạn.

@nebukadnezzar: Tôi tìm thấy Meyers chiếu sáng trên STL, nhưng nó không giải quyết được các vấn đề cơ bản. Thành thật mà nói, điều này có vẻ như bạn không bao giờ phải duy trì một dự án lớn, bạn không bao giờ phải tìm kiếm một sự phụ thuộc vòng tròn trong một hệ thống phân cấp bao gồm hàng chục sâu. Tôi biết bao gồm các vệ sĩ, nhưng tại sao chúng ta phải bận tâm với họ? BTW. họ không sửa chữa mọi vấn đề. Làm thế nào "tiêu chuẩn" là std::stringnếu tôi không thể sử dụng nó một nửa thời gian? (C ++ 0x ít nhất sửa nó, nhưng tôi vẫn bị mắc kẹt với hàng tá thư viện sử dụng các cách biểu diễn chuỗi khác nhau).
peterchen

but why do we have to bother with them (inclusion guards)- vì C ++ không có mô-đun. How "standard" is a std::string if I can't use it half of the time?- Tôi nghĩ rằng điều đó phụ thuộc vào cách bạn sử dụng std::string. Lớp chuỗi cho phép bạn truy cập dữ liệu chuỗi như const char*thông qua std::string::c_str, điều này đã std::stringtương thích hoàn hảo với mọi lớp / hàm cũng có các const char*đối số.

bởi vì C ++ không có mô-đun - chính xác là khiếu nại của tôi: mô hình xây dựng là cổ (tôi cũng chỉ chấp nhận bất kỳ giải pháp nào khác ngoài mô-đun). ----- hoàn toàn tương thích - nhưng hoàn toàn không tương thích với nhiều kịch bản khác (Tôi cho rằng C ++ 0x đang sửa lỗi này nói rằng tôi có một điểm ở đây.) Tôi rất vui nếu std :: chuỗi đã đủ phổ biến để đã được thông qua là lớp chuỗi 10 năm trước, nhưng nó đã không - khiếu nại khác.
peterchen

35

JavaScript :

  • Các Objectnguyên mẫu có thể được sửa đổi. Mỗi đối tượng trong chương trình của bạn đều có các thuộc tính mới và một cái gì đó có thể bị phá vỡ.

  • Tất cả các đối tượng là bản đồ băm, nhưng thật khó để sử dụng chúng một cách an toàn như vậy. Đặc biệt, nếu một trong những chìa khóa của bạn xảy ra __proto__, bạn sẽ gặp rắc rối.

  • Không có đối tượng đóng cửa tại thời điểm tham chiếu chức năng. Trong thực tế, không có sự đóng cửa đối tượng nào cả - thay vào đó, thisđược đặt bất cứ khi nào một hàm được gọi với ký hiệu đối tượng hoặc newtoán tử. Kết quả là có nhiều nhầm lẫn, đặc biệt là khi tạo các cuộc gọi lại sự kiện, vì thiskhông được đặt thành những gì lập trình viên mong đợi.

    • Hệ quả: gọi một hàm không có ký hiệu đối tượng hoặc newtoán tử dẫn đến thisviệc được đặt bằng với đối tượng toàn cục, dẫn đến phá vỡ nhiều.
  • Toán tử bổ sung bị quá tải để thực hiện nối chuỗi, mặc dù hai thao tác khác nhau về cơ bản. Kết quả là đau đớn khi một giá trị bạn mong đợi là một số trên thực tế là một chuỗi.

  • ==và các !=nhà khai thác thực hiện cưỡng chế loại. So sánh giữa các loại khác nhau liên quan đến một danh sách các quy tắc mà không người phàm nào có thể nhớ đầy đủ. Điều này được giảm nhẹ bởi sự tồn tại của ===và các !==nhà khai thác.

  • Cả hai nullundefinedtồn tại, với ý nghĩa tinh tế khác nhau, nhưng dư thừa. Tại sao?

  • Cú pháp lạ để thiết lập chuỗi nguyên mẫu.

  • parseInt(s)mong đợi một số kiểu C, do đó, coi các giá trị với các số 0 đứng đầu là bát phân, v.v. Ít nhất bạn có thể parseInt(s, 10)nhưng hành vi mặc định là khó hiểu.

  • Không có phạm vi khối.

  • Có thể khai báo cùng một biến nhiều lần.

  • Có thể sử dụng một biến mà không cần khai báo nó, trong trường hợp đó là toàn cầu và có thể phá vỡ chương trình của bạn.

  • with { }.

  • Thực sự rất khó để làm tài liệu với JavaDoc như các công cụ.


3
Cho nullundefined: đôi khi bạn thực sự muốn biết liệu biến đã được gán một giá trị hay chưa. Vì null là một giá trị, không xác định là cách duy nhất để nói. Cấp, lần duy nhất tôi thấy điều này hữu ích là để tạo các hàm getter / setter.
Zach

1
"Nếu một trong các khóa của bạn là proto " - tốt, đó là một từ dành riêng với ý nghĩa đặc biệt. nó giống như phàn nàn rằng bạn không thể sử dụng fornhư một tên biến.
nickf

5
@nickf: Chìa khóa để băm là một chuỗi. Chuỗi có thể có bất kỳ giá trị bao gồm các từ dành riêng. Cụ thể, giá trị "for"này là hợp lệ dưới dạng khóa băm. __proto__không phải là một từ dành riêng. Các giá trị chuỗi đặc biệt không hoạt động như mong đợi khi được sử dụng làm khóa băm vi phạm các kỳ vọng hợp lý về cách các mảng kết hợp hoạt động trong bất kỳ ngôn ngữ nào. Họ cũng vi phạm thông số EcmaScript.
Daniel Cassidy

2
Thomas: Newline không phải lúc nào cũng kết thúc một tuyên bố. Do đó, các lập trình viên hợp lý chấm dứt mọi tuyên bố bằng dấu chấm phẩy để làm cho mã rõ ràng hơn.
Daniel Cassidy

2
newline may or may not end a statement depending on contextlà một trong danh sách top 5 của tôi
Revierpost

34

Con trăn

  • Thiếu gõ tĩnh
  • Xử lý đối số mặc định (cụ thể là bạn có thể thay đổi đối số mặc định cho những người gọi trong tương lai!)
  • Quá nhiều dấu gạch dưới yêu cầu (hàm tạo phải được gọi __init__)
  • Thiếu các thành viên và chức năng riêng tư thích hợp (quy ước chỉ nói rằng hầu hết mọi thứ bắt đầu bằng dấu gạch dưới là riêng tư, ngoại trừ tất cả những thứ như __getattr__ không phải là)
  • Cú pháp vui printđể lấy tệp (nhưng họ đang sửa nó trong Python 3)

10
Những gì tôi muốn là một tùy chọn để sử dụng các loại tĩnh.
Greg Hewgill

4
BTW: init không thực sự là hàm tạo, đối tượng đã được tạo, khi bạn vào đó (đoán xem bản thân là gì ...). Hàm tạo hoàn toàn mới , nơi bạn có quyền truy cập vào lớp để được khởi tạo.
André

90
Nếu bạn thích gõ tĩnh, tại sao Python là ngôn ngữ yêu thích của bạn?
vây

9
finnw: Gõ tĩnh là tuyệt vời cho một số loại chương trình, và không thực sự cần thiết cho các loại khác. Tôi thường không bận tâm đến việc thiếu kiểu gõ tĩnh, nhưng khi bạn cần nó, thật tuyệt khi có ít nhất tùy chọn.
Greg Hewgill

8
Tôi có thể nói rằng thiếu gõ tĩnh là một tính năng, không thiếu chức năng ...
arnorhs

32

C #

  • Tôi ước tôi có thể switch()trên bất kỳ loại nào, và đó casecó thể là bất kỳ biểu hiện nào.

  • Không thể sử dụng cú pháp trình khởi tạo đối tượng với các trường / tự động đọc 'chỉ đọc' private set. Nói chung, tôi muốn trợ giúp ngôn ngữ với việc tạo ra các loại bất biến.

  • Sử dụng {}cho không gian tênlớpphương thứckhối thuộc tính / bộ chỉ mụckhối đa câu lệnhkhởi tạo mảng . Làm cho nó khó khăn để tìm ra bạn đang ở đâu khi chúng cách xa nhau hoặc không khớp.

  • Tôi ghét viết lách (from x in y ... select).Z(). Tôi không muốn phải quay lại cú pháp cuộc gọi phương thức vì cú pháp truy vấn bị thiếu một cái gì đó.

  • Tôi muốn một domệnh đề về cú pháp truy vấn, nó giống như foreach. Nhưng nó không thực sự là một truy vấn sau đó.

Tôi thực sự đạt đến đây. Tôi nghĩ C # thật tuyệt vời và thật khó để tìm thấy nhiều thứ bị hỏng.


14
+1 cho chuyển đổi trên bất kỳ loại nào
oɔɯǝɹ

+1 cho các sự cố chuyển đổi và {} sự cố mà tôi chưa thực sự nghĩ đến cho đến bây giờ
Maslow

Tôi ghét {}. Họ trông quá giống như (). Sự không phù hợp chưa bao giờ là vấn đề đối với tôi bởi vì tôi luôn đặt chúng ở cùng cấp độ trừ khi về cơ bản chúng là một lớp lót.
Loren Pechtel

2
+1 cho truy vấn linq. Đặc biệt là khi bạn chỉ muốn một đối tượng trở lại. Thay vì (từ x trong y chọn) .first (), tại sao không phải là (từ x trong y chọn top 1) hoặc một cái gì đó để phù hợp hơn với cú pháp sql thực tế.
admSteck

nếu bạn muốn bạn có thể chuyển đổi () trên bất kỳ loại nào và trường hợp đó có thể là bất kỳ biểu thức nào, hãy kiểm tra khớp mẫu F #. c-sharpcorner.com/UploadFile/mgold/ từ
gradbot

26

PHP

  1. Không có tính năng sửa lỗi nếu bạn không điều khiển máy chủ và thậm chí sau đó chúng còn bị hút
  2. Số lượng cực lớn của mã PHP xấu nổi xung quanh cung cấp cho tất cả các lập trình viên PHP một tên xấu
  3. Đặt tên hàm không nhất quán
  4. Không thể có biến gõ tĩnh nếu tôi muốn (Tôi là một fan hâm mộ lớn của việc gõ động 90% thời gian)
  5. REGISTER_GLOBALS là ma quỷ

25
REGISTER_GLOBALS đã ăn con chó của tôi :(
Pim Jager

2
1: Tôi khuyên dùng xdebug và máy khách GUI như MacGDBp. Điều đó thực sự làm giảm bớt một số nỗi đau ... Tôi đồng ý về những điểm khác.
Jonas Because Vesterheden

5
# 2: Trời ơi, đừng để tôi bắt đầu về điều đó. Tôi luôn phải tự bảo vệ mình là một nhà phát triển PHP trước những người chỉ nhìn thấy mớ hỗn độn mà nhiều người tạo ra với PHP.
selfawaresoup

1
+1 cho # 2 Tôi đã dành quá nhiều thời gian để tự bảo vệ mình là một nhà phát triển PHP.
UnkwnTech

+1 cho # 2 - cũng dẫn đến mức lương tệ :(
Shiki

25

C (OK, nó không phải là sở thích của tôi, nhưng nó chưa được thực hiện.)

  • Cú pháp thư viện socket.
  • Không có chức năng quá tải.
  • Dây kiểu C.
  • Bộ đệm tràn ngập.
  • Cú pháp mật mã. Tôi không biết bao nhiêu lần tôi đã nhìn lên những thứ như atoi, vỗ vào trán tôi và hét lên "Tất nhiên rồi!"

EDIT: Tôi có thể có thể tìm ra nhiều hơn nếu tôi sử dụng nhiều mã thư viện hơn (như tôi đã làm với các socket, nhưng chúng đặc biệt tệ), nhưng tôi đã cảm thấy như mình gian lận khi chọn C. Vì vậy, nhiều ngôn ngữ chỉ tồn tại những phần tốt của C và thay thế phần xấu giống như đánh một con ngựa chết.


22
Cú pháp socket nào? C không có khái niệm về ổ cắm.
Ferruccio

3
Oh C'mon! Bạn có thể đến với năm. Không con trỏ số học chỉ hút? :)
brian d foy

8
+1 Tôi đã cười vào "chuỗi kiểu C." Và @brain_d_foy: số học con trỏ chỉ hút nếu bạn không hiểu nó.
Chris Lutz

1
@Chris Luts: Ngay cả khi tôi học tiếng C đơn giản (trước khi tôi biết C ++ hoặc bất kỳ ngôn ngữ OO nào khác) tôi chỉ biết có điều gì đó không ổn về mảng char. :)
Bill the Lizard

2
số học con trỏ là một máy cưa công suất - rất hiệu quả, nhưng bạn có nguy cơ chiếm toàn bộ chân của mình
Thorbjørn Ravn Andersen

24

Lisp thường gặp:

  1. Từ khóa thường quá dài dòng.
  2. Thư viện hỗ trợ thật đáng thương.
  3. Không hoạt động tốt trong các hệ điều hành muốn xử lý bộ nhớ nghiêm ngặt hơn.
  4. Không có phương tiện tốt để tương tác với HĐH.
  5. Tiện ích "vòng lặp" không được xác định rõ và chắc chắn không nhìn Lispy.

2
'vòng lặp' có thể không lispy, nhưng những gì được định nghĩa kém về nó?
Daniel Cassidy

2
Bản thân tôi chưa đọc tiêu chuẩn, tôi chủ yếu đọc "On Lisp" của Paul Graham. Ông nói rằng tiêu chuẩn chủ yếu là các ví dụ và hoàn toàn không xác định các trường hợp góc.
David Thornley

3
bạn không có nghĩa là từ khóa-quá-từ?
GClaramunt

Tôi đồng ý rằng đó không phải là "lispy", nhưng CLtLv2 dành nhiều thời gian cho nó. Tôi chỉ nghĩ rằng nó được thiết kế để làm quá nhiều. sunsite.univie.ac.at/textbooks/cltl/clm/ triệt
Hans Van Slooten

Ngoài "vòng lặp", "định dạng" cũng không giống Lisplike. Tôi ghét "định dạng" và "lặp" cả mặc dù Lisp là ngôn ngữ yêu thích của tôi.
Paul củng cố

24

BrainF * ck

  • Điểm nổi bật của bạn là bạn đã hoàn thành Turing ?! Tôi có thể làm nhiều hơn trong biểu thức chính quy Perl!

  • Thiếu đồ vật. Mọi người ơi! Giống như, xin chào ...

  • Không có thư viện mạng. Tất cả những gì tôi muốn là cạo một trang web, GOSH.

  • Không có chức năng hạng nhất. Xin chúc mừng - bạn có thể giao lưu với bạn bè Java của mình.

  • Một băng vô hạn để lưu trữ và không có gì khác. Điều này rất tự phụ đến nỗi chúng tôi cũng có thể viết Lisp.


6
Không có không gian tên hoặc hỗ trợ mô-đun động. Làm thế nào chúng ta có thể mong đợi để viết các hệ thống kiểm soát nhà máy hóa chất mà không có những điều cơ bản như vậy?
Donal Fellows

Không có đường cú pháp, chẳng hạn như> 10 (di chuyển 10 lần), 0 (chèn số không), +5 (thêm 5).
Squall

23

JavaScript

  1. các số dưới dạng chuỗi - Toán học có thể gây khó chịu khi các số được hiểu là các chuỗi. 5 + 2 = 52? Ơ ...
  2. quyền - tất cả những thứ tốt nhất cần có sự cho phép của người dùng!
  3. cập nhật màn hình - Trình duyệt phải ở trạng thái ổn định để cập nhật màn hình. Dường như không có cách nào để buộc màn hình cập nhật ở giữa tập lệnh.
  4. Chậm - mặc dù Chrome của Chrome rất hay ...
  5. Sự khác biệt của trình duyệt làm cho việc sử dụng ngôn ngữ [bị kiểm duyệt].

4
Các số dưới dạng chuỗi dễ dàng cố định. Nếu bạn đã từng có một chuỗi, bạn cần phân tích cú pháp (x, 10). Thất bại lớn là khi bạn rời khỏi số 10, và nó diễn giải '017' là OCTAL
Orion Edwards

3
sai == 0 == [] == "" nhưng null và NaN thì không. NaN! = NaN. null == null.
Jimmy

7
gõ "một chuỗi" == "chuỗi". typeof new String ("Another string") == "object. new String ('a'). constructor ==" a ".constructor. typeof new Array () == 'object'
Jimmy

1
for (x in object) trả về các hàm
Jimmy

14
-1, danh sách này chủ yếu là về các vấn đề trình duyệt, không phải ngôn ngữ.
Mauricio Scheffer

20

PHP:

  • Không bao giờ có thể chắc chắn rằng một số tiện ích mở rộng gần như phổ biến có sẵn trên tất cả các máy chủ web.
  • cố gắng trở thành tất cả mọi thứ trong tương lai (goto, đóng cửa, ...)
  • nhiều rủi ro bảo mật cho người dùng chưa có kinh nghiệm
  • quá tải toán tử sẽ tốt hơn
  • tất cả các lập trình viên nghèo không học cách làm cho nó hoạt động đúng và đặt tên xấu

Tuy nhiên PHP là các (kịch bản) ngôn ngữ. ;-)


OK, chỉ còn một điều nữa!
brian d foy

4
Hoàn toàn đồng ý với điểm 5 - cũng sẽ nằm trong danh sách Javascript.
Steve Claridge

Tôi không đồng ý với "tất cả các lập trình viên nghèo không học cách làm cho nó hoạt động đúng và đặt cho nó một tên xấu". Tôi sẽ thay thế nó bằng "xử lý lớn các tùy chọn cấu hình ngôn ngữ thời gian chạy".
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

18

VB6

  1. Chỉ có Windows.
  2. Không còn được hỗ trợ.
  3. Mảng có thể bắt đầu ở bất kỳ số nào, thay vào đó tất cả được chuẩn hóa thành 0.
  4. các ứng dụng được biên dịch phụ thuộc vào nhiều dll để chạy đúng.
  5. Nhiều điều khiển phức tạp như điều khiển trình duyệt hoặc các đoạn mã phức tạp có xu hướng phá vỡ IDE khi bạn chạy mã không được biên dịch, nhưng chỉ hoạt động tốt khi được biên dịch.

13
VB là ngôn ngữ yêu thích của ai đó? Ôi. Tại sao "cú pháp hoàn toàn khác biệt và không tương thích với các ngôn ngữ khác" và "tạo thói quen xấu liên quan đến các ngôn ngữ khác" ở đây?
Jonta

3
Tôi thực sự tìm thấy # 3 một tính năng rất mạnh mẽ, không phải là một lỗi - Tôi thực sự yêu thích VB.NET. AWK có nó, theo một nghĩa nào đó, nhưng sau đó trong mảng AWK thực sự băm trong ngụy trang :(
Joe Pineda

3
Trên 1 và 4, và .NET C # không yêu cầu HOÀN TOÀN KHUNG VÀ Hệ điều hành ??? (này, tôi nghe nói rằng bạn là một gã khổng lồ ... nó vẫn là một "khuôn khổ hoàn chỉnh" cho bạn, và tôi nghi ngờ một người làm công tác tranh luận đã từng ăn nó). Về 5, không có lập trình viên VB6 có đầu óc đúng đắn (trở lại trong ngày) giữ nguyên tùy chọn "Biên dịch theo yêu cầu" mặc định BẬT ...
jpinto3912

2
Vẫn phải thỉnh thoảng hỗ trợ vb6. Thú cưng: không thể khởi tạo một biến khi khai báo, không có cấu trúc tham số hóa, một lớp cho mỗi tệp, v.v ... Nếu chúng sẽ khắc phục các vấn đề này, ngôn ngữ có thể tiếp tục trong 10 năm nữa.
AngryHacker

14
Điều gì về "On Error Resume Next" ... giống như nói "mã này là F ** KED, nhưng hãy tiếp tục chạy nó. =)
StingyJack

18

Ruby là ngôn ngữ yêu thích của tôi, đây là những gì tôi không thích:

  • Chủ đề xanh + chặn thư viện C = thất bại khổng lồ
  • VẬY
  • Thư viện tiêu chuẩn tự nó không phù hợp với việc sử dụng tiếng nổ! phương pháp
  • Mô-đun bao gồm + mở rộng là lộn xộn.
  • "Các lớp mở" không thể nằm trong phạm vi - Tôi muốn thêm Chuỗi # do do, nhưng tôi không muốn điều đó bị rò rỉ vào tất cả các thư viện của bên thứ ba
  • Không có giải pháp đóng gói triển khai nhị phân.

3
Bạn đã thử Ruby 1.9.1 chưa? Nó cung cấp một tốc độ tăng tốc lớn so với Ruby 1.8.6
Christian Stade-Schuldt

Hãy thử jrubyc. JVM JIT FTW!
KitsuneYMG

+1 để bao gồm các vấn đề hợp lý, trái ngược với 'ghét' từ câu trả lời được xếp hạng cao nhất của Ruby.
Phrogz

17

Delphi:

  • IDE hơi không ổn định.
  • Cái nhìn sâu sắc mã đôi khi bị nhầm lẫn.
  • Gỡ lỗi đôi khi là lỗi.
  • Cập nhật một số tập tin dự án có thể là cồng kềnh.
  • Nếu bắt đầu khi một hoặc nhiều gói không có sẵn, thông báo lỗi sẽ xuất hiện nhiều lần.

5
Tất cả những điều này dường như là những lời phàn nàn về Delphi IDE chứ không phải Delphi ngôn ngữ (AKA Object Pascal)
Dónal

11
Có lẽ đó là vì Object Pascal hoàn hảo ;-)
Mark Bessey

3
Tôi đến bữa tiệc hơi muộn, nhưng dù sao đi nữa: - phải ghi lại chữ ký phương thức hai lần (giao diện + triển khai) - Tên đơn vị được BẮT BUỘC giống hệt với tên tệp. WTF?!?
Martijn

1
Tôi tìm thấy sự khởi đầu..có vẻ vượt trội - chúng rõ ràng hơn nhiều so với {}. Bạn dành nhiều thời gian hơn để đọc mã hơn là viết nó. Mặc dù vậy, để hiểu rõ hơn - bạn không thể sử dụng các kiểu con được xác định của các kiểu liệt kê trong một trường hợp mặc dù điều đó hoàn toàn hợp pháp nếu bạn khai báo phạm vi ngay trong trường hợp đó. Ngoài ra, không có tài liệu tham khảo chuyển tiếp giữa các đơn vị.
Loren Pechtel

1
@AlexanderN: Không, nó chưa bao giờ sống động hơn, phổ biến hay tuyệt vời hơn.
Andreas Rejbrand

16

JavaScript

  • Mỗi tập lệnh được thực thi trong một "không gian tên" toàn cầu duy nhất ... một cái gì đó mà bạn phải chú ý khi làm việc với các tập lệnh từ các nguồn khác nhau

  • Nếu một biến được sử dụng nhưng chưa được xác định trước, nó được coi là biến toàn cục

  • Các nhà cung cấp trình duyệt tạo ra các tiêu chuẩn theo ý họ, làm cho mã hóa cho các nhà phát triển của chúng tôi sử dụng một ngôn ngữ đẹp như vậy khó hơn nó nên

  • Phân biệt chữ hoa chữ thường - xem xét rằng không có IDE phù hợp để phát triển js với kiểm tra thời gian biên dịch

  • Giải pháp thay thế (chẳng hạn như sử dụng hasOwnPropertyphương pháp) để thực hiện một số thao tác đơn giản.


AFAIK, tất cả các phần mở rộng cho ngôn ngữ JS (không phải DOM) của các nhà cung cấp trình duyệt ít nhất đã được thúc đẩy để áp dụng tiêu chuẩn, ngay cả khi quy trình tiêu chuẩn đã không đạt được điều đó. hasOwnProperty / cách giải quyết: con dao hai lưỡi. Để buộc "sự đơn giản", chúng ta mất rất nhiều sức mạnh và tính linh hoạt. Khiếu nại đó luôn làm tôi bực mình. Viết các vòng lặp của bạn ngay (và kiểm tra các thành viên đối tượng của bạn ngay)!
mí mắt

15

Haskell:

  1. Không gian rò rỉ từ đánh giá lười biếng.
  2. Phân cấp số không được xây dựng liên quan đến trừu tượng toán học.
  3. IO đơn điệu nghiêm ngặt có thể làm cho việc gỡ lỗi khó khăn hơn.
  4. Các triển khai lớn xử lý I / O theo những cách có vẻ không tương thích với tiêu chuẩn. (Cụ thể, xuất ra các ký tự chỉ xuất ra 8 bit thấp - và sau đó mã được xây dựng sử dụng giả định này để thực hiện I / O nhị phân. Ick.)
  5. Sự kết hợp của ($)toán tử có thể được thay đổi để làm cho một số biểu thức đẹp hơn.

Hầu hết trong số này không tăng đến mức độ ghét và có những người đang cố gắng khắc phục hoặc xây dựng các cách giải quyết vững chắc cho từng điều này.

Chỉnh sửa: Có một số nhầm lẫn về điểm 5. Đặc biệt một số người dường như nghĩ rằng tôi có nghĩa là thứ tự của các đối số, mà tôi không. Thay vì giải thích những gì tôi muốn nói, tôi sẽ chỉ cho mọi người vào liên kết sau, http://hackage.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity , thể hiện điều đó tốt.


3
Tại sao bạn muốn thay đổi tính kết hợp của ($)? 'fghx' ngoặc là '((fg) h) x' và 'f $ g $ h $ x' ngoặc là 'f (g (hx))' ...
Erik Hesselink

1
Tôi <3 Haskell. Thư viện chuẩn cần bao gồm hàng núi trừu tượng toán học, bao gồm cả không gian vectơ et al. Khúc dạo đầu cũng cần một toán tử có chuỗi giống như ($) nhưng từ trái sang phải {source |> func1 |> lọc func2 |> map (func3 10)}.
yfeldblum

10
Bạn đã bỏ lỡ một điều thực sự tồi tệ: xu hướng lập trình viên Haskell sử dụng tên biến một chữ cái.
Benjamin Confino

1
Một toán tử liên kết trái ($) chỉ là ứng dụng hàm, trong Haskell được biểu thị bằng ký tự khoảng trắng. @Justice: Hãy thử chức năng lật. (|>) = flip ($)
Apocalisp

1
Ai đó có thể giải thích quan điểm của # 5? Tôi nghĩ rằng sự kết hợp đúng là toàn bộ quan điểm của ($).
Tim Matthews
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.