Yếu tố cú pháp nào bạn ghét nhất trong ngôn ngữ lập trình bạn sử dụng thường xuyên? [đóng cửa]


27

Cho dù bạn yêu thích một ngôn ngữ lập trình đến mức nào, luôn có một vài chi tiết trong đó không hoàn hảo như chúng có thể.

Trong câu hỏi này, tôi muốn đặc biệt tập trung vào các yếu tố cú pháp. Trong ngôn ngữ lập trình mà bạn sử dụng thường xuyên (có thể là ngôn ngữ lập trình yêu thích của bạn hoặc có thể là ngôn ngữ bạn buộc phải sử dụng tại nơi làm việc), yếu tố cú pháp nào bạn thấy khó đọc nhất, không rõ ràng, bất tiện hoặc khó chịu?


@Nathan Taylor, không phải cho câu hỏi này, mà cho một câu hỏi khác .
vây

Câu hỏi này có được sửa đổi không? Bởi vì khi tôi trả lời, nó không tập trung vào "các yếu tố cú pháp" ... Tôi sẽ phải sửa đổi câu trả lời của mình ngay bây giờ.
Talvi Watia

@Talvi: Không, đó là về cú pháp ngay từ đầu.
Timwi

@Timwi thật kỳ lạ, đó phải là một trường hợp 'trả lời một câu hỏi nghĩ rằng đó là một câu hỏi khác'.
Talvi Watia

Nếu bạn có thể bỏ phiếu và nghĩ rằng đây là một câu hỏi hữu ích hoặc nó có câu trả lời hữu ích dưới đây, vui lòng bỏ phiếu. Các trang web StackExchange cần phiếu bầu để xây dựng một cộng đồng tốt. Bạn có thể cho 30 phiếu mỗi ngày, đừng lãng phí chúng. Người dùng đặc biệt có uy tín cao và số phiếu bầu thấp được đưa ra xin vui lòng đọc này: meta.programmers.stackexchange.com/questions/393/ Kẻ
Maniero

Câu trả lời:


39

Chèn dấu chấm phẩy trong JavaScript.

Tôi thực sự không bị nó cắn thường xuyên, nhưng đó chỉ là một ý tưởng tồi tệ đến mức khiến đầu óc tôi quay cuồng.


Đây là các quy tắc (từ ECMA-262 Phần 7.9)

  1. Khi chương trình chứa mã thông báo không được ngữ pháp chính thức cho phép, thì dấu chấm phẩy được chèn nếu (a) có dấu ngắt dòng tại thời điểm đó hoặc (b) mã thông báo không mong muốn là dấu ngoặc kép.
  2. Khi kết thúc tập tin, nếu chương trình không thể được phân tích cú pháp, thì dấu chấm phẩy được chèn vào.
  3. Khi gặp phải "sản xuất bị hạn chế" và chứa dấu kết thúc dòng ở nơi ngữ pháp chứa chú thích "[không có LineTerminator ở đây]", thì dấu chấm phẩy được chèn vào.

Thí dụ:

return 1; // returns 1

return
1; // returns undefined

2
JavaScript: Ngôn ngữ lập trình sai lầm nhất thế giới ~ Douglas Crockford
pramodc84

Đúng, nhiều người kỳ vọng JavaScript là "ngôn ngữ dạng tự do", nhưng thực tế không phải vậy.
Andreas Rejbrand

13
Thật ý nghĩa khi bạn nhận ra rằng JavaScript được thiết kế để tạo HTML, cũng có một lịch sử lâu dài về việc cố gắng diễn giải mã của bạn "thực sự có nghĩa là gì" khi nó không hợp lệ về mặt cú pháp. (Tìm kiếm Nguyên tắc Mạnh mẽ đôi khi - thảm họa lớn nhất trong lịch sử điện toán.)
Mason Wheeler

7
Đối với tôi, các loại lỗi này là một mùi mã mà lập trình viên rất cẩu thả và chưa bao giờ làm việc với hầu hết các ngôn ngữ "nghiêm ngặt" chính thức thường gây ra lỗi cú pháp khi bỏ dấu chấm phẩy.
Talvi Watia

7
Wohoo, cuối cùng, một người khác cũng nghĩ rằng Nguyên tắc mạnh mẽ là một thảm họa đã khiến HTML trở nên lộn xộn hoàn toàn.
Roman Starkov

39

Cú pháp Java-bean do thiếu thuộc tính C #

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

GAH !!!

Những vấn đề tôi có với điều này

  • Quá nhiều mã - Có một trường được ghi lại, một phương thức getter được ghi lại và một phương thức setter được ghi lại. Ví dụ cực kỳ cơ bản này có 20 dòng mã cho một đơn bất động sản
  • Clutters danh sách phương pháp - "Hãy để tôi tìm thấy phương pháp đó, bàn tay lên: getX, getY, getZ, getAnotherAnnoyingField, getWhyIHateJavaBeans, getThisIsVerbose, getGAH... ah có nó là, hashCode.
  • Nhiều tài liệu dẫn đến nhiều tài liệu kém, lỗi thời hoặc thiếu - Làm phiền khi cố gắng hiểu mã nào
  • Thật khó chịu khi một bên thứ 3 đã phải đưa ra một plugin để thực hiện điều này một cách dễ dàng - Spoon , Shark , trong số những người khác.

9
Một lần nữa khi mã quá dài đến nỗi nó cần các công cụ tạo tự động, có gì đó không ổn. Tôi là một anh chàng NetBeans, nhưng nó cũng có khả năng tự động tạo getters và setters. Nhưng Javadoc rơi ra khỏi syn, nó vẫn dài dòng, nó vẫn bị khóa javadoc, v.v.
TheLQ

11
Nếu bạn cần getters cho tất cả mọi thứ thì có gì đó không ổn với mã máy khách .
Finnw

7
Có getters và setters phá vỡ đóng gói. Trường cũng có thể được public. Các thành viên nên ở chế độ riêng tư và nên được thao tác một cách hợp lý bởi lớp có logic cấp cao hơn, không phải với getters và setters từ mã máy khách.
greyfade

6
@greyfade: Nếu công khai, bạn không thể dễ dàng thay đổi mã cài đặt làm gì (bạn sẽ phải thay đổi tất cả mã đặt trường từ bên ngoài).
Bart van Heukelom

3
@SHiNKiROU: Java có vẻ sạch sẽ? Tôi chưa bao giờ nghe điều đó trước đây! Nắm bắt chính của tôi với Java là thực tế là điều có vẻ đơn giản cần hàng tá dòng mã tôi cần bỏ qua về mặt tinh thần.
cấu hình

33

Độ nhạy khoảng trắng.

Python làm phiền tôi về mặt này. Ý tôi là, tôi thụt đúng dù sao, nhưng nó lỗi với tôi rằng tôi nên để. Làm cho phần trình bày của cú pháp làm phiền tôi.


8
bạn sẽ học cách yêu nó
user10008

2
cú pháp là cách trình bày
Winston Ewert

32

Câu switchlệnh (bằng C, C ++, C #, Java, v.v.)

Đây là một ví dụ về lý do tại sao tôi thấy nó rất bất tiện:

switch (someVariable)
{
    case 1:
        int i = something();
        doSomething(i);
        break;

    case 2:
        int i = somethingElse();
        doSomethingElse(i);
        break;
}

Điều này không biên dịch vì biến iđược khai báo lại trong cùng phạm vi. Đây có vẻ như là một chi tiết nhỏ, nhưng nó thực sự cắn tôi. Tôi có thể thêm dấu ngoặc nhọn để giảm thiểu nó, nhưng thật tuyệt nếu dấu ngoặc nhọn là phần bắt buộc của cú pháp và không có mức thụt lề thừa. Tôi cũng thực sự ghét phải viết thêm break. Điều này sẽ đẹp hơn nhiều:

switch (someVariable)
case 1
{
    int i = something();
    doSomething(i);
}
case 2
{
    int i = somethingElse();
    doSomethingElse(i);
}
default
{
    ...
}

Điều này làm cho nó trông giống như một chuỗi if/ else, đó là một điều tốt bởi vì nó cũng tương tự về mặt ngữ nghĩa. Ít nhất là trong C #, nó vẫn không phải là điều tương tự, tuy nhiên, trong một switchtuyên bố, thứ tự của các nhãn trường hợp không quan trọng, nhưng trong một if/ elsenó thì có.


1
Thật không may, cú pháp được cải thiện của bạn không phù hợp với tính năng lớn nhất của chuyển đổi trong hầu hết các ngôn ngữ này: Fall-through. "Thiết bị của Duff" trong C là một ví dụ hoàn hảo về giá trị của "tính năng sai" đặc biệt này. Nó cũng phổ biến trong các ngôn ngữ giống như C để sử dụng thông qua các phiên dịch viên và các chương trình tương tự.
greyfade

7
Không, nó không làm gì với nó. Nó chỉ yêu cầu nó được làm rõ ràng hơn (sử dụng a gotohoặc tương tự), như đã có trong C #.
Timwi

8
@greyfade: Bất kỳ mã nào sử dụng thiết bị của duff trong C đều cần phải chết một cái chết khủng khiếp. Trình biên dịch đưa ra quyết định tốt hơn về những loại điều này hơn bạn làm.
Billy ONeal

4
@greyfade: Delphi giải quyết vấn đề nhiều giá trị bằng cách đơn giản cho phép nhiều chỉ số trong trường hợp : case Foo of 1,3: Result := 'odd'; 2,4: Result := 'even' end;.
Frank Shearar

3
@jkerian: Bây giờ hãy tưởng tượng breaklà mặc định và chỉ có sự sụp đổ cần được chỉ định. Không cần phải nhớ bình luận nó! :)
Timwi

27

Khai báo mảng trong VB.NET

Tôi luôn quên rằng khi khởi tạo các mảng cố định trong VB.NET, bạn chỉ định giới hạn trên của mảng chứ không phải số lượng phần tử như trong C / C ++, PHP hoặc Java. Ngoài VB6 (chúng tôi sẽ không đến đó ...), tôi không thể nghĩ ra một ngôn ngữ khác theo cách này:

Dim myArray(20) as Integer  '# Creates an array with 21 elements,
                            '# indexed from 0 to 20

Tôi nghĩ rằng tất cả các ngôn ngữ BASIC làm điều này ... Tôi biết BASIC cơ bản và QBasic làm.
Michael K

OMG thật sự khủng khiếp .... +1
mikera

25

VB6 - Khai báo và chuyển nhượng biến riêng biệt

Hầu hết các ngôn ngữ cho phép bạn khai báo một biến và gán nó trong một dòng mã; VB6, mặt khác, buộc bạn phải sử dụng hai.

Dim i as Integer
i = 0

Dim derpderp as Collection
Set derpderp = new Collection

Bạn có thể sử dụng dấu hai chấm để đặt hai lệnh trên một dòng, nhưng nó nhanh chóng biến lộn xộn trong mã thực tế.

Dim i as Integer: i = 0
Dim derpderp as Collection: Set derpderp = new Collection

7
+1 khi phải sử dụng VB6 làm ngôn ngữ thường xuyên nhất của bạn.
Walter

9
Tôi sử dụng nó hàng ngày..sob.
systempuntoout

Pascal không có cú pháp tương tự sao? Tôi luôn nghĩ nó thật khó chịu.
greyfade

1
Có một trường hợp đặc biệt: nếu bạn Dim Hurp As New Collection, nếu bạn truy cập Hurpkhi đề cập đến Nothing, nó sẽ được khởi tạo một cách kỳ diệu trước khi truy cập. Nếu bạn đặt nó một cách rõ ràng Nothingvà chạm vào nó một lần nữa, nó sẽ được hồi sinh ... thở hổn hển!
Jeffrey Hantin

1
+ 1 triệu cho Derp. Derp de derp de tiddly tum de derp.
MVCylon

24

Bình luận trong CSS

//không bình luận các dòng mã giống như trong nhiều ngôn ngữ khác, như PHP và Javascript. Mặc dù /* this is commented out */hoạt động, tôi thích sử dụng //.

Thật phiền toái, vì một nửa thời gian tôi quên tôi đang chỉnh sửa CSS và sau đó phải quay lại và sửa lỗi.


Bạn sẽ nghĩ trong thời đại ngày nay rằng CSS thô sẽ được coi là mã đối tượng.
Tom Hawtin - tackline

// chỉ hoạt động tốt để bình luận CSS. Tôi làm nó suốt. Tất cả những gì tôi thực sự làm là gõ rác. nhưng nó dường như hoạt động bằng cách bỏ qua dòng không thể nhìn thấy.
MVCylon

1
@MVCylon Nếu bạn sử dụng // để nhận xét một dòng, bất cứ điều gì sau dòng sau đó cũng bị bỏ qua. {trong phong cách cụ thể đó} Nói cách khác, nó KHÔNG THỂ vì những dòng đó không được bỏ qua.
Talvi Watia

20

PHP - thứ tự nhất quán của các đối số

PHP có một số hàm tiện dụng để thực hiện khá nhiều thao tác bạn có thể nghĩ về một mảng hoặc chuỗi. Nhiều thao tác trong số này yêu cầu sử dụng cả a $needlevà a $haystack, nhưng các chức năng khác nhau thực hiện chúng theo các thứ tự khác nhau. Hàm nào yêu cầu đối số nào là một trong những sự thật mà não tôi không chịu tiếp thu, bất kể tôi có thường xuyên bắt gặp chúng không!

Lấy các hàm in_arraystrstr :

// Check whether $needle occurs in array $haystack
bool in_array (mixed $needle, array $haystack [, bool $strict])

// Check whether $needle is a substring of $haystack
string strstr (string $haystack, mixed $needle [, bool $before_needle=false])

Thật thú vị, PHP dường như phù hợp nội bộ với các thứ tự này trong đó tất cả các hàm chuỗi dường như sử dụng $haystack, $needletrong khi các hàm mảng là cách khác, nhưng điều này có thể làm quen với một người mới sử dụng PHP. Có một bài viết hay trên ExpressionEngine nói về vấn đề cụ thể này một cách chi tiết hơn, cũng như một cuộc thảo luận về danh sách lỗi PHP , trong đó có phản hồi rất ngắn từ nhóm PHP!

helly@php.net
Sử dụng một IDE tốt sau đó.

2
Việc nhớ thứ tự dễ dàng hơn $needle, $haystackvì nó nhắc nhở cách nói tìm kim trong đống cỏ khô .
kiamlaluno

3
Protip: trong các chức năng mảng, kim đến trước. trong các hàm chuỗi, haystack đến trước.
GSto

17
Tôi yêu tên strstr. Đẹp quá vô nghĩa.
cấu hình

5
Chỉ cần đọc mục được liên kết trong bugtracker của PHP. Nghiêm túc đấy, wtf? Tính nhất quán của Imho là một vấn đề hợp lệ đối với bất kỳ API nào và chỉ phản hồi với "sử dụng một IDE tốt" thì đó không phải là một câu trả lời hợp lệ. Ít nhất nó có thể đã được các nhà phát triển ít bị viêm hơn.
Baelnorn

2
Thành thật mà nói, điều khiến tôi phát điên về điều này là nó hoàn toàn không phải là một chức năng! Nó chỉ nên là một phương thức: $ haystack-> find ($ kim). Thỏa thuận được thực hiện.
riwalk

19

Con trăn

self tham số trong định nghĩa phương thức thể hiện


Trong một phân loại, nó thường được đặt tên là cls và sử dụng tự đi ngược lại quy ước.

Nó thực sự có ý nghĩa nếu bạn nghĩ về nó. Nó giống như khai báo một phương thức riêng tư trong các ngôn ngữ khác, tham số tự chỉ rõ ràng bằng python trong đó nó ẩn trong các ngôn ngữ khác. Nếu bạn muốn nó được ẩn, hãy thêm trang trí @ classmethod trước khi khai báo phương thức. Xem docs.python.org/l Library / fiances.html # classmethod . Tìm hiểu chi tiết về cách thức hoạt động của nó sẽ giúp bạn hiểu rõ hơn về cách nó được thực hiện trong các ngôn ngữ khác.
Evan Plaice

4
Tôi hiểu lý do và lý do tại sao nó bị bỏ lại ở đó neopythonic.blogspot.com/2008/10/ trên nhưng tôi vẫn không thích nó
Goran Peroš

@Evan Plaice: 'tham số tự chỉ rõ ràng trong python, nơi nó ẩn trong các ngôn ngữ khác' Đó chỉ là một phần của câu chuyện. Phần khác là trăn được đánh máy hàng tuần. Cùng nhau, điều đó thật tồi tệ, việc quên selfxảy ra dễ dàng và tốn thời gian.
maaartinus

@maaartinus Sau đó thêm một trình trang trí classmethod cho các phương thức cá thể của bạn. Không có gì để làm với 'đánh máy yếu'. Nó chỉ làm cho mối quan hệ giữa các phương thức / hàm tĩnh (không có tham số 'tự') và các phương thức cá thể (bao gồm 'tự') rõ ràng. Một phương thức cá thể không nhận thức được lớp cha của nó trừ khi bạn cung cấp cho nó một tham chiếu để làm như vậy. Trong các ngôn ngữ khác, đặc điểm phân biệt mà tôi vạch ra chỉ ẩn sau đường cú pháp. Nếu tôi có một lựa chọn để làm tất cả thì tôi đã bắt đầu học OOP bằng Python trước.
Evan Plaice

18

Java

Giai đoạn. Ngừng hẳn. Kết thúc câu chuyện.

Bắt đầu từ đâu? Ồ, tôi biết bắt đầu từ đâu: Java cực kỳ phức tạp, xấu xí và ngu ngốc và vốn đã bị phá vỡ . Tôi cần nói nhiều hơn? :( Được rồi, sau đó: gõ xóa .

Sau đó, có quản lý tài nguyên không xác định. Kewl footcher!

Điều gì tiếp theo? Oh yeah: regexes ngu ngốc của Java là thịt bò khó chịu nhất của tôi. Tôi không thể đếm được bao nhiêu lần tôi đã bị hos vì không có đủ dấu gạch chéo ngược. Điều này thậm chí còn tồi tệ hơn việc không có quyền truy cập vào bất kỳ thuộc tính Unicode nào trong thiên niên kỷ này - đó là con bò hoàn chỉnh. Mười năm hết hạn !!! Hoàn toàn vô dụng. Đồ bỏ đi.

Sau đó, có lỗi mà các phím tắt lớp nhân vật không hoạt động trên phi ASCII. Thật là một nỗi đau hoàng gia! Và thậm chí không cân nhắc sử dụng \p{javaWhiteSpace}; nó không làm đúng với một số điểm mã khoảng trắng Unicode rất phổ biến.

Bạn có biết có một \p{javaJavaIdentifierStart}tài sản? Họ đang nghĩ gì vậy? Rất vui vì họ đã nhận được những cái nhìn thông minh như vậy trên wurkin.

Bạn đã bao giờ thử sử dụng cờ CANON_EQ chưa? Bạn có biết điều đó thực sự xảy ra, và những gì nó không làm? Làm thế nào về cái gọi là trường hợp Unicode Unicode Một loạt các vỏ bọc bình thường hoàn toàn không hoạt động.

Sau đó, họ làm cho nó khó khăn để viết regexes duy trì. Java vẫn chưa tìm ra cách viết các chuỗi nhiều dòng, vì vậy cuối cùng bạn sẽ viết những thứ điên rồ như thế này:

    "(?= ^ [A-Z] [A-Za-z0-9\\-] + $)      \n"
  + "(?! ^ .*                             \n"
  + "    (?: ^     \\d+      $            \n"
  + "      | ^ [A-Z] - [A-Z] $            \n"
  + "      | Invitrogen                   \n"
  + "      | Clontech                     \n"
  + "      | L-L-X-X                      \n"
  + "      | Sarstedt                     \n"
  + "      | Roche                        \n"
  + "      | Beckman                      \n"
  + "      | Bayer                        \n"
  + "    )      # end alternatives        \n"
  + ")          # end negated lookahead   \n" 

Tất cả những dòng mới là gì? Ồ, chỉ là sự ngu ngốc của Java. Họ đã sử dụng các bình luận Perl, không phải các bình luận Java ( những kẻ ngốc! ) Đi đến cuối dòng. Vì vậy, nếu bạn không đặt chúng \nở đó, bạn hãy cắt bỏ phần còn lại của mẫu. Duh và đôi duh!

Đừng sử dụng regexes trong Java: cuối cùng bạn sẽ muốn phá vỡ mọi thứ, tất cả đều rất đau đớn và tan vỡ. Tôi không thể tin mọi người đưa ra điều này. Một số thì không .

Sau đó, chúng ta có thể bắt đầu nói về những điều vớ vẩn của Java với các bảng mã. Đầu tiên, có một thực tế là mã hóa nền tảng mặc định luôn là mã hóa 8 bit khập khiễng mặc dù các ký tự của Java là Unicode. Sau đó, làm thế nào họ không đưa ra một ngoại lệ về lỗi mã hóa. Bạn được đảm bảo để có được tào lao. Hoặc làm thế nào về điều này:

OutputStreamWriter(OutputStream out) 
          Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs) 
          Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
          Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName) 
          Creates an OutputStreamWriter that uses the named charset.

Có gì khác biệt? Bạn có biết rằng chỉ một trong số đó sẽ đưa ra một ngoại lệ nếu bạn có lỗi mã hóa? Phần còn lại chỉ mõm họ.

Sau đó, sự ngu ngốc của các ký tự Java không đủ để chứa một ký tự! họ đang nghĩ cái quái gì vậy? Đó là lý do tại sao tôi gọi chúng là charchars. Bạn phải viết mã như thế này nếu bạn mong đợi nó hoạt động đúng:

private static void say_physical(String s) { 
    System.out.print("U+");
    for (int i = 0; i < s.length(); i++) {
        System.out.printf("%X", s.codePointAt(i));
        if (s.codePointAt(i) > Character.MAX_VALUE) { i++; }  // UG!
        if (i+1 < s.length()) { System.out.printf("."); }
    }
}

ai đã từng nghĩ sẽ làm điều đó? Không có ai bên cạnh.

Có bao nhiêu nhân vật trong đó "\uD83D\uDCA9"? Một hoặc hai? Phụ thuộc vào cách bạn đếm chúng. Công cụ regex tất nhiên xử lý các ký tự logic, do đó một mẫu ^.$sẽ thành công và một mẫu ^..$sẽ thất bại. Sự điên rồ này được thể hiện ở đây:

String { U+61, "\u0061", "a" }  =~ /^.$/ => matched.
String { U+61, "\u0061", "a" }  =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^..$/ => matched.

Sự ngu ngốc đó là tất cả bởi vì bạn không thể viết hoàn toàn hợp lý \u1F4A9, và dĩ nhiên bạn không nhận được bất kỳ cảnh báo nào rằng bạn không thể làm điều đó. Nó chỉ làm điều sai trái.

Ngốc nghếch.

Trong khi chúng ta đang ở đó, toàn bộ \uXXXXký hiệu bị chết não bẩm sinh. Bộ tiền xử lý Java ( vâng, bạn đã nghe tôi nói ) trước khi Java thực hiện, do đó bạn bị cấm viết những thứ hoàn toàn hợp lý như thế "\u0022", bởi vì vào thời điểm Java thấy rằng, bộ tiền xử lý của nó đã biến nó thành """, do đó bạn mất. Oh chờ đã, không phải nếu nó trong một regex! Vì vậy, bạn có thể sử dụng "\\u0022"tốt.

Riiiiiii!

Bạn có biết Java không có cách nào để thực hiện isatty(0)cuộc gọi không? Bạn thậm chí không được phép nghĩ những suy nghĩ như vậy. Nó sẽ không tốt cho bạn.

Và sau đó là sự ghê tởm cả lớp.

Hoặc thực tế là không có cách nào để chỉ định mã hóa tệp nguồn Java của bạn trong cùng một tệp nguồn đó để bạn không bị mất nó? Một lần nữa tôi yêu cầu được biết: CÁI GÌ ĐÃ NGHINK

Dừng cơn điên! Tôi không thể tin rằng mọi người bỏ rác này. Đó là một trò đùa hoàn chỉnh. Tôi thà là một người chào đón Walmart còn hơn chịu đựng những cú đá và mũi tên của sự điên rồ thái quá của Java. Tất cả đều hỏng, và họ không chỉ không thể sửa nó, họ sẽ không sửa nó.

Điều này bởi cùng một người foxy-grapey tự hào về một ngôn ngữ làm cho nó bất hợp pháp để có một printf()chức năng. Trời ạ, chắc chắn là nó hoạt động rất tốt, mặc dù vậy!?

Tê giác tuyệt vời. Bitch-tát là quá tử tế với họ. Nếu tôi muốn lập trình trong trình biên dịch chương trình, tôi sẽ. Đây không phải là một ngôn ngữ có thể cứu được. Hoàng đế không có quần áo.

Chúng tôi ghét nó. Chúng tôi ghét nó mãi mãi . Hãy để nó chết chết !


Haha, tốt quá, tôi không chạm vào java vì nó quá thiếu lịch sự như bạn mô tả. Đối với \ uD83D ... tôi cho rằng một cách tốt hơn để nói điều này là bạn thay vào đó là các chuỗi không phải là UTF-16 mà là UTF-32. Nếu bạn chấp nhận UTF-16-ness thì regex thực hiện đúng; đó là cuộc gọi .length mà nhảy lên.
Roman Starkov

4
-1. Ngoại trừ các bình luận regrec và thoát Unicode, không một trong những điều bạn đề cập là một yếu tố cú pháp.
Jörg W Mittag

3
@ Jörg, bạn muốn cú pháp? Được rồi: Java cho phép bạn đặt các ký tự điều khiển, bao gồm ESC và NUL, trong các mã định danh. WTH họ đã nghĩ gì ???
tchrist

4
@tchrist: Chà! Nếu tôi từng viết lại một chương trình Java, tất cả các biến của tôi sẽ có các tên bao gồm số lượng ký tự backspace khác nhau ( ^H) :)
j_random_hacker

1
@tchrist, cảm thấy tốt hơn bây giờ?

16

Cú pháp khai báo con trỏ hàm trong C và C ++:

(int)(*f)(int, int);

Điều đó khai báo một con trỏ hàm có tên là fpointee có thể mất hai ints và trả về một int.

Tôi rất thích một cú pháp như thế này:

f: (int, int) => int

Giả sử bạn muốn khai báo một con trỏ hàm gcó con trỏ có thể lấy hai ints và một hàm từ intintđến intvà trả về một int.

Với ký hiệu C hoặc C ++, bạn sẽ khai báo nó là:

(int)(*g)(int, int, int(int, int));

Với ký hiệu được đề xuất ở trên, điều tương tự có thể được khai báo là:

g: (int, int, (int, int) => int) => int

Latter là IMO trực quan hơn nhiều.


Ngoài ra: Ngôn ngữ lập trình được gọi là OOC sửa lỗi cú pháp này (và nhiều vấn đề cú pháp khác trong C và C ++). Kiểm tra trang chủ của nó ở đây .


Đồng ý, một số "plain C" / "C ++" không hỗ trợ nó hoặc hỗ trợ nó với cú pháp khác nhau. Một cú pháp đặc biệt, giúp chỉ ra khi một tính năng ngôn ngữ lập trình được hỗ trợ. Đó là lý do tại sao C # thêm cú pháp "đại biểu".
umlcat

Các đại biểu không chỉ là cú pháp cú pháp vì họ còn lưu trữ đối tượng (trái với các con trỏ hàm thành viên C ++, có cú pháp thậm chí còn tệ hơn các con trỏ hàm thông thường)
Tamás Szelei

14

Độ dài trong Java.

I E:

public static final int 

6
So với? (15 ký tự)
TheLQ

7
So với: const intví dụ.
OscarRyz

11
"chung tĩnh tĩnh int x = 4;" so với "x = 4" trong Haskell.
Jared Updike

24
Đó không phải là dài dòng. Hãy thử viết a+(b*c)/d*e+f/g^20bằng BigIntegerJava. Tại sao ngôn ngữ này không cho phép người vận hành quá tải?
MAK

4
@Michael: lập trình viên cần được bảo vệ khỏi bản thân với chi phí này có thể tự bảo vệ mình tốt nhất (và giảm đau cho những người khác) bằng cách không lập trình gì cả: D.
MAK

12

\ we \ wouldnt \ fix \ cú pháp không gian tên của trình phân tích cú pháp trong PHP

Cú pháp không chỉ xấu, nó dẫn đến sự nhầm lẫn khi các nhà phát triển mới hơn phải suy nghĩ về không gian tên trong chuỗi. (PHP nội suy dấu gạch chéo ngược trong chuỗi trích dẫn kép dưới dạng chuỗi thoát. Cố gắng biểu diễn một không gian tên như \you\should\never\do\thattrong chuỗi trích dẫn kép thay vì chuỗi trích dẫn đơn sẽ dẫn đến dòng mới, tab và thảm họa.)


Vâng, ai đó đã nghĩ ra một cách tốt hơn :: để làm điều này, nhưng PHP nhấn mạnh rằng mọi toán tử phải khác nhau. Tôi tò mò không biết vấn đề lạm dụng ở đây là gì.
Alan Pearce

Đồng ý. PHP yêu cầu không gian tên, nhưng cú pháp đó làm
hỏng

9

Tôi coi thường thực tế rằng niềng răng xoăn có thể là tùy chọn sau một câu lệnh if / while / for.

Đặc biệt là khi tôi thấy mã như,

if (...)
    for(...)
        ... One line of stuff ...

Xin vui lòng chỉ cần đặt niềng răng trong và được thực hiện với nó.


6
Hmm .. điều này phụ thuộc. Đối với "Abort Ifs" chỉ kiểm tra một điều kiện và trả về mã lỗi (hoặc ném ngoại lệ), tôi không muốn nhìn thấy dấu ngoặc nhọn.
Billy ONeal

4
Tôi sẽ đồng ý nếu bạn giới hạn bản thân trong các trường hợp đa cấp cực đoan, nhưng tuyên bố của bạn quá trống trải. Có một tiện ích tuyệt vời trong khả năng có các biểu mẫu ngắn cho các câu lệnh và vòng lặp đơn, câu lệnh đơn.
Timwi

2
Quy tắc của tôi: chỉ khi một câu lệnh yêu cầu nhiều thay thế hoặc nếu nó chứa một câu lệnh như vậy thì nó sẽ được bọc trong dấu ngoặc nhọn. Do đó, for (...) while (...) if (...) { x(); y(); }tốt hơn là viết lại như for (...) { while (...) { if (...) { x(); y(); } } }, với thụt đầu dòng thích hợp, tất nhiên.
Jon Purdy

6
Tôi thì ngược lại - tôi khinh thường những người khăng khăng đòi niềng răng khi họ hoàn toàn không cần thiết. Chỉ cần học lập trình.
Jerry Coffin

3
Tôi thực sự thích dấu ngoặc ngay cả trong câu lệnh if. Nó làm cho tôi theo dòng chảy của một chương trình tốt hơn.
Ricardo Santos

9

VBScript không có toán tử logic

Không giống như gần như mọi ngôn ngữ hợp lý, VBScript sử dụng các toán tử bit thay vì các toán tử logic. Điều này có ý nghĩa gì trong thực tế? Vâng, như Eric Lippert chỉ ra :

If Blah = True Then Print "True!" Else Print "False!"

If Blah Then Print "True!" Else Print "False!"

KHÔNG giống nhau trong VBScript!

Mặc dù tệ hơn, điều này có nghĩa là không có đánh giá ngắn mạch trong VBScript để câu lệnh sau sẽ làm hỏng chương trình của bạn nếu BlahNothing

If (Not Blah Is Nothing) And (Blah.Frob = 123) Then
...

Điều đó đúng, VBScript sẽ đánh giá cả hai phần của phép so sánh AND, ngay cả khi phần đầu tiên là sai! Chỉ để điều đó chìm trong...


3
Cho đến ngày bạn săn được một lỗi bên trong If x Then ... If Not x Then ... End If ... End Ifvà nhận ra rằng x là 2, bạn chưa thực sự được lập trình trong VB / VBScript.
cấu hình

7

EDIT: Sau phần thảo luận trong các bình luận, tôi quyết định cập nhật câu trả lời này để giải thích rõ hơn về bản thân.

Tôi thực sự ghét cách con trỏ hàm tìm trong C. Thông thường, bất kỳ khai báo biến nào trông giống như một tuple của: type varname; Mặt khác, khai báo con trỏ hàm trông giống như một khai báo của hàm với * trước tên hàm. Tôi có thể chấp nhận điều này như là một mô tả về một loại con trỏ, nhưng trong C này khai báo cả loại và tên của một biến của loại đó. Điều này có vẻ không nhất quán với tôi vì khai báo kiểu khác với khai báo biến. struct myStruct{int X; int Y;}chỉ định nghĩa một loại, nó không định nghĩa một biến có tên myStruct. Tương tự như vậy, tôi thấy không có lý do nào để khai báo kiểu và khai báo biến được nhóm thành một câu lệnh nguyên tử trong các con trỏ hàm, tôi cũng không đánh giá cao độ lệch khỏi type varname;cấu trúc.

Ai đó đã chỉ ra rằng nó phù hợp với một số quy tắc xoắn ốc, và đó có thể là trường hợp, nhưng dấu hiệu của một cú pháp tốt là nó tự giải thích và logic bên trong của nó là rõ ràng. Quy tắc xoắn ốc không rõ ràng bằng bất kỳ phương tiện.


1
Nó phù hợp với phần còn lại của ngôn ngữ, vì vậy có lẽ sự hiểu biết của bạn về cú pháp của người khai báo C nói chung? Bạn có thích cú pháp được sử dụng trong Go ?
Finnw

Nhất quán theo cách nào? Thông thường nó đi: gõ varname; Và khi chúng ta tạo một kiểu hỗn hợp mới, như một cấu trúc, đầu tiên là khai báo, có thể bằng một typedef, và sau đó chúng ta tạo một biến của kiểu đó. Khi chúng ta khai báo một con trỏ hàm, nó là int (* foo) (int arg1, int arg2), sau đó được sử dụng làm kiểu của một đối số được truyền cho một hàm: void newFoo (int (* foo) (int arg1, int art2 )) .... và dưới dạng một biến: foo = a_compiverse_func; Tôi nghĩ rằng một khai báo hàm trước, và sau đó là một khai báo var tiếp theo sẽ phù hợp hơn, như vậy: typedef int (* foo) (int, int) MyFoo; MyFoo myfoo;
EpsilonVector

Đó là lý do tại sao bạn có typedef.
zneak

4
@EpsilonVector: Tôi có xu hướng đồng ý rằng cú pháp con trỏ hàm là khó chịu, nhưng có một quy tắc đơn giản để làm theo để dễ đọc hơn. Quy tắc xoắn ốc theo chiều kim đồng hồ (có lẽ bạn đã nhìn thấy nó?): C-faq.com/decl/spirus.anderson.html
greyfade

1
EpsilonVector: Tôi không chắc chắn những gì bạn mong đợi từ một khai báo biến con trỏ để khai báo khác với tên của biến.

6

Dấu chấm phẩy trong VBScript - hoặc thiếu chúng

Tôi dành cả ngày để làm việc trong các ngôn ngữ mong đợi dấu chấm phẩy ở cuối mỗi dòng. Thêm một vào cuối dòng trong VBScript và mã của bạn không chạy nữa.


4
bỏ phiếu này, không phải vì tôi đặc biệt thích dấu chấm phẩy, mà vì tôi thực sự ghét cách VB khuyến khích các dòng thực sự dài bằng cách thực hiện ngắt dòng rất bất tiện.
Shog9

6

Đối số vào / ra. Tôi là tất cả đối với các cuộc tranh luận (điều tốt là tôi), các cuộc tranh luận cũng tốt, nhưng một cuộc tranh luận phải truyền tải hai trạng thái này làm tôi bực mình.

Những gì tôi nhắm đến ở đây là các hàm lấy đầu vào từ một tham số sau đó ghi đè đầu vào đó bằng một số đầu ra. Bạn có thể vượt qua một đối tượng bằng cách tham khảo để cập nhật nó. Nhưng, chủ yếu là cho các kiểu nguyên thủy, lấy một đối tượng, sử dụng nó, sau đó thay đổi hoàn toàn, không phải là quyền của tôi. Bạn không nên thay đổi ý nghĩa của đối số thông qua đầu vào.


Bạn có ngôn ngữ gì trong tâm trí? Nếu C # thì tôi sẽ không đồng ý rằng điều đó gây phiền nhiễu vì nó luôn rõ ràng (không giống như trong C ++.) Ngoài ra tôi không biết bất kỳ ngôn ngữ chính nào mà bạn buộc phải khai báo các đối số là vào / ra.
Finnw

@finnw Tôi chưa bao giờ thấy một ngôn ngữ mà bạn phải nói inđể intranh luận, tôi chỉ nói về chúng. Ngoài ra, theo tôi, không có gì có thể bào chữa cho một cuộc tranh cãi vào / ra, và làm cho chúng rõ ràng không làm giảm nỗi đau. Không có lý do gì để phải khởi tạo một biến cục bộ có giá trị hữu ích cho hàm và có cùng biến này sau đó đột nhiên chứa bất cứ thứ gì hàm quyết định đặt ở đó. Hai nên được phân biệt. Luôn luôn.
zneak

Xin lỗi tôi đã không rõ ràng ở đó. Tôi có ý nói "Tôi không biết bất kỳ ngôn ngữ nào trong đó tất cả các đối số đều ẩn + out" tức là bạn không bị buộc phải sử dụng tính năng đó, nhưng có những trường hợp sử dụng hợp pháp (ví dụ: cập nhật một structgiá trị mới phụ thuộc vào giá trị của một lĩnh vực khác cũng vậy struct.)
finnw

@finnw Các đối tượng được truyền bởi tham chiếu (như phiên bản của classcác đối tượng trong C #) được sửa đổi bởi một chức năng là tốt đối với tôi. Bên cạnh đó tôi không thích cấu trúc không liên tục, đi qua một structvới reftừ khóa để cập nhật nó không quan trọng, quá. Điều tôi thực sự ghét là khi đầu vào bị ghi đè bằng đầu ra. Ví dụ tốt nhất tôi có thể nghĩ đến là acceptchức năng của ổ cắm Berkeley : nó cần một socklen_t*đối số rằng, trên đầu vào, phải chứa kích thước của struct sockaddr*bạn đã vượt qua; và trên đầu ra, sẽ chứa số byte đã được ghi vào nó. Đây phải là hình sự.
zneak

Tôi đồng ý rằng điều đó là xấu (IIRC một số hàm I / O Win32 làm tương tự) nhưng đó là việc sử dụng sai tính năng (lệnh gọi hàm thay đổi ý nghĩa của biến được truyền vào, không chỉ giá trị của nó) và nó không có nghĩa là tính năng bản thân nó là xấu
Finnw

6

Khai báo mảng trong C và C ++.

Thông thường, một khai báo biến là định dạng type variable_name. Bạn có thể dễ dàng đọc những tuyên bố đó theo cách từ trái sang phải. Nhưngint foo[size] thoạt nhìn giống như nó khai báo foonhư một int, và sau đó bạn đọc thêm và thấy rằng foo thuộc loại "mảng số nguyên". int[size] foođọc tốt hơn nhiều.

Và tôi cũng ghét nó khi các lập trình viên tuyên bố con trỏ như thế này vì một lý do tương tự : int *foo. Vì một số lý do tôi chưa tìm ra, đó là cách viết điển hình .


1
Khai báo con trỏ lại: chúng được viết như thế bởi vì ' ' liên kết với tên biến chứ không phải kiểu. Vì vậy, int* a, b;* không khai báo abnhư con trỏ; chỉ alà Do đó, tốt hơn là viết nó thành int *a, b;(hoặc thậm chí tốt hơn để viết chúng thành hai khai báo).
Steve Melnikoff

Điểm tốt. Thật tệ *khi không liên kết với các loại.
Jacob

2
Và đây là không nói gì về con trỏ hàm ... void(int) *f;? Không:void (*f)(int);
Lưu ý đến bản thân - nghĩ về một cái tên

Trong C ++ hiện đại, có rất ít nhu cầu về con trỏ và mảng.
dòng chảy

2
@Steve Melnikoff: Mặc dù tôi đã trả lời câu hỏi này nhưng tôi nghĩ rằng int* a, b;vấn đề mà bạn đề cập còn nghiêm trọng hơn nhiều.
j_random_hacker

5

Tham số dự phòng trong Java:

HashMap<String,HashMap<String,String>> foo = new HashMap<String, HashMap<String, String>>();

Trình biên dịch nghĩ loại foo nào khác có thể có?


4
Tôi hy vọng bạn biết về suy luận kiểu (giới hạn) của Java? HashMap<String,HashMap<String,String>> foo = Maps.newHashMap();
vây

1
Java 7:HashMap<String,HashMap<String,String>> foo = new HashMap<>();
Bart van Heukelom

5
Chà, nó có thể có bất kỳ loại nào nó muốn, các loại vẫn bị xóa ...
cấu hình

Thiếu suy luận kiểu, ý bạn là gì?
missingfaktor

What other type parameterization does the compiler think foo could have?- Vì bất kỳ lý do gì, đó là loại nguyên liệu - như thể bất kỳ ai lành mạnh thậm chí sẽ trộn lẫn các loại thô và tham số.
maaartinus

5

Vì mọi người đã phàn nàn về =vs. ==, hãy để tôi chỉ ra một sự thay thế tồi tệ hơn nhiều. PL / Tôi đã có cả hai :==, nhưng khi một cái gì đó "rõ ràng" là một nhiệm vụ, nó sẽ cho phép bạn thoát khỏi việc sử dụng =để làm điều đó. Sử dụng:= cho phép bạn buộc một cái gì đó là một bài tập trong một tình huống trong đó trình biên dịch sẽ giải thích nó như là một so sánh.

Thật không may, trình biên dịch không phải lúc nào cũng quyết định mọi thứ theo cách bạn mong đợi. Hãy xem xét chỉ một ví dụ rõ ràng:

A = B = 0;

Bây giờ, đối với hầu hết mọi người quen thuộc với hầu hết các ngôn ngữ "thông thường", ý nghĩa của điều này khá rõ ràng - gán 0 cho cả A và B. PL / I chỉ là một chút ... khác nhau. Vì những lý do chỉ được biết đến với các nhà thiết kế ngôn ngữ (điên rồ), thứ nhất =được hiểu là một bài tập, nhưng thứ hai =được hiểu là so sánh. Do đó, điều này so sánh B với 0, và sau đó gán kết quả so sánh đó với A (theo quy ước kiểu C là "sai" kết quả là 0 và "đúng" trong 1).

Vì vậy, nếu B bằng 0, thì A trở thành 1. Mặt khác, A trở thành 0. Nói cách khác, thay vì gán cùng một giá trị cho A và B, điều này thực sự đảm bảo rằng A không thể có cùng giá trị với B.

Tóm lại: mặc dù C / C ++ / PHP phong cách ban đầu dường như là một nỗi đau, sự lựa chọn là tồi tệ hơn nhiều 1 .

1 Về mặt kỹ thuật, có một cách khác: phong cách Pascal, trong đó =luôn có nghĩa là so sánh và gán luôn luôn yêu cầu :=. Sau khi sử dụng một thời gian, điều khá rõ ràng (ít nhất là đối với tôi) rằng việc chuyển nhượng đó đủ phổ biến hơn so với việc so sánh rằng nếu bạn sẽ cần thêm "công cụ" để phân biệt hai thứ đó, bạn chắc chắn nên giữ các bài tập sạch sẽ và đơn giản và yêu cầu thêm "grunge" trên các so sánh, không phải ngược lại.


1
Tôi thậm chí còn đề xuất sử dụng ==cho bình đẳng và :=phân công. Bằng cách này bạn có nhiều thứ để gõ, nhưng tránh sự cô đơn =giúp tránh lỗi.
maaartinus

@maartinus: ít nhất là với tôi, nghe có vẻ như là khả năng tồi tệ nhất tuyệt đối, nhưng đó là cuộc sống ...
Jerry Coffin

3

Perl

  1. Tôi muốn Perl cho tôi viết if($x < 10) do_something();. Tại thời điểm này, bạn phải viết nó như là do_something() if($x < 10);hoặc là if($x < 10) { do_something(); }.

9
do_something() if ($x < 10);điều đó không tệ
zneak

Không, và trong nhiều trường hợp, sạch hơn nhiều so if(..) ...với khởi động, vì bạn có thể nhận được tất cả các biểu thức xếp hàng ở bên phải. Nhưng có những lúc tôi thực sự muốn nói if($x < 10) do_something();, và thật không may là Perl sẽ không cho phép tôi.
Gaurav

7
Thật không may cho đến khi bạn viết if ($x<10) do_something(); and_call_me(); và sau đó tự hỏi tại sao bạn không bao giờ nhận được một cuộc gọi. Tôi ước C và gia đình sẽ yêu cầu niềng răng, để ngăn ngừa loại lỗi đó.
AShelly

2
@AShelly: hoặc tại sao bạn luôn nhận được một cuộc gọi, thực sự.
zneak

1
@zneak Ngoại trừ không có elses. (Tôi ước nó có EXPR1 if COND else EXPR2như Python có)
Ming-Tang

3

reinterpret_cast<unsigned long>trong c ++. Hoạt động này rất hữu ích trong việc xử lý các API nước ngoài và đảm bảo độ chính xác về số, tại sao nó lại gây khó chịu như vậy và rất xấu khi nhìn vào?


17
Thật xấu xí khi nhắc nhở bạn rằng bạn nên cố gắng viết mã không yêu cầu nó. :)
greyfade

Đối với tôi đó là một loại lý luận khoa học máy tính lý thuyết tốt, nhưng theo kinh nghiệm của tôi, nó quá hữu ích để tránh (Tuy nhiên, phần lớn kinh nghiệm của tôi là C cũ, vì vậy tôi có thể có thành kiến).
HỎI

5
Đây không thực sự là một đối số CS lý thuyết: Sử dụng reinterpret_casttrong C ++ là một mùi mã rất mạnh. 99% thời gian, khi bạn chuẩn bị sử dụng nó, rất có thể, bạn không cần phải làm vậy - có lẽ bạn đã làm sai điều gì đó. 1% thời gian còn lại, bạn đang giao tiếp với C. reinterpret_castphá vỡ hệ thống loại để làm cho một cái gì đó hoạt động khi không thể. Đó thường là một điều xấu.
greyfade

3

Cấu trúc for ... trong JavaScript và foreach xây dựng trong PHP khi lặp qua các mảng. Cả hai đều làm cho việc viết lỗi dễ dàng hơn so với mã chính xác.


3
Wow, thật là nhảm nhí. Mã hơn so với mã chính xác. Biến đi.
Jonathan Sterling

Nếu tôi phải viết thêm mã để sử dụng chúng một cách an toàn, chúng sẽ dễ sử dụng sai trong sách của tôi. Đối với ... trong yêu cầu kiểm tra thêm để đảm bảo bạn không lặp lại các đối tượng từ nguyên mẫu và foreach yêu cầu bạn dọn sạch các tham chiếu sau đó hoặc có nguy cơ ghi đè giá trị cuối cùng trong mảng.
Joeri Sebrechts

foreach với thay đổi tham chiếu (& toán tử) là một lỗi nổi tiếng ...
umlcat

1
Tôi bối rối, tôi nghĩ rằng kiến ​​thức phổ biến là cấu trúc "for..in" trong javascript bị hỏng ... tại sao điều này gây khó chịu?
lvilni

2

Con trỏ của mảng hoặc mảng con trỏ trong C / C ++. Tôi vẫn còn bối rối về những điều này.


3
Đọc kiểu ngược. int[]*là một con trỏ tới một mảng các số nguyên và int*[]là một mảng các con trỏ tới các số nguyên. Hoạt động tốt với consts quá: int* constlà một con trỏ không đổi cho các số nguyên, trong khi đó const int*int const*là con trỏ tới các số nguyên không đổi (hoặc các hằng số nguyên).
zneak

@zneak: "Phải sang trái" không hoạt động, hãy xem quy tắc "xoắn ốc theo chiều kim đồng hồ" / "từ trong ra ngoài" được đề cập .

Hoặc, chỉ sử dụng typedefs và không có nhầm lẫn.
Billy ONeal

Trong C ++ hiện đại, có rất ít nhu cầu về con trỏ và mảng.
dòng chảy

4
@tchrist: Không đúng. int (*p)[10];tuyên bố plà một con trỏ tới một mảng 10 ints. Nếu sizeof (int) == 4, sau đó p++sẽ tăng pthêm 40.
j_random_hacker

2

Thực tế là Python dựa vào định dạng văn bản.


1

Javascript / Java, v.v, bằng so sánh, ví dụ if (a == 1)

Tôi viết bao nhiêu lần nếu (a = 1)?

Là một con người tôi đọc nó một cách hoàn hảo. Nhưng trình thông dịch / trình biên dịch darn nói: "hey tôi sẽ gán 1 cho a, sau đó kiểm tra xem a có bằng 1 không, và bạn có tin là có không!

Đưa tôi lên tường.

if (a == 1) ít đọc hơn và trình thông dịch / trình biên dịch nên biết ý tôi là gì; nhiều ngôn ngữ nhỏ hơn (VB) đã hoạt động thành công trong hàng trăm năm.


if (a = true)nghĩa là gì?
Tom Hawtin - tackline

2
Bài tập chỉ không nên trả về một giá trị. Nó đôi khi hữu ích, nhưng trong hầu hết các trường hợp, nó chỉ là một cơn đau ở cổ.
cấu hình

trong Javascript JSLint sẽ bắt cái đó cho bạn.
Zachary K

Vấn đề là, sự phân công trong điều kiện có thể hữu ích. Tôi thấy <tt> while (phần tử = list-> next ()) </ tt> khá dễ đọc. Vì vậy, tôi không chắc chắn tôi muốn loại bỏ nó.
Inca

3
@Tom: Có nghĩa là bạn không hiểu về booleans. Nếu bạn có ý nghĩa if (a == true), chỉ cần viết if (a). Nếu bạn có ý a = true, thì iftuyên bố là dư thừa.
dan04

1

Độ dài trong các lớp ẩn danh Java. Hy vọng sẽ được khắc phục sớm.


Trừ khi bạn muốn nhiều hơn một phương pháp.
Tom Hawtin - tackline

0

structPointer->membertrong C / C ++. Có thể tốt để đọc mã của người khác, nhưng tôi không thích nó. Hai nhân vật thay vì một ... thật lãng phí không gian!


2
Thật không may, nó phải được phân biệt với ., áp dụng cho các thành viên của một đối tượng không phải là con trỏ. Cú pháp mơ hồ là xấu, mmmkay?
greyfade

2
@greyfade: Đúng! Bởi vì trình biên dịch có thể không thể sử dụng các quy tắc hệ thống kiểu của nó để biết khi nào bạn đang sử dụng kiểu con trỏ tới cấu trúc và áp dụng ngầm định. Không, đó là một cuộc nói chuyện điên rồ! (Tuy nhiên, bằng cách nào đó nó vẫn có thể cung cấp cho bạn một thông báo lỗi khi bạn hiểu sai.) Không có gì mơ hồ về cú pháp. Nó chỉ là C là một mớ hỗn độn, như thường lệ. Delphi thực hiện các cuộc hội thảo ngầm hoàn toàn tốt, nếu bạn thực sự làm việc trong các góc tối đòi hỏi con trỏ để ghi lại, vì vậy nó chắc chắn có thể được thực hiện mà không gây nhầm lẫn cho trình phân tích cú pháp ...
Mason Wheeler

5
@Mason: Thế còn các trường hợp như shared_ptr, nơi ->truy cập các loại có chứa và .truy cập các thuộc tính của shared_ptrchính nó? Tôi xin lỗi, nhưng tôi hoàn toàn không đồng ý ở đây.
Billy ONeal

2
có thể tồi tệ hơn Có thể là PHP, nơi bạn phải sử dụng ->để truy cập các thành viên của bất cứ điều gì .
Carson Myers

1
@maaartinus: Bất kỳ mã nào phụ thuộc nhiều vào thứ tự hoạt động không rõ ràng không phải là mã tôi sẽ viết.
Billy ONeal

0

Mã nhiều dòng Scala trong ngoặc

Ví dụ:

class Foo(
         val bar: String,
         val baz: Int,
         val bing: String,
         val bong: Boolean
 ) extends Model {
   // body here
 }

Những gì bạn thực sự nhận được từ nó là tuyệt vời. Nó tạo ra hàm tạo và các getters và setters cho bạn. Nhưng nó chắc chắn là xấu và phá vỡ tất cả các mô hình tinh thần của tôi về cách thụt mã và về cơ bản khiến tôi cảm thấy như mình đang ở trong một loại bánh sandwich kỳ quái với Java ở một bên và bên kia là Lisp. (Ồ, đợi đã ... đó đúng là quan điểm của Scala.)


Tôi bối rối - bạn có nghĩa là phần trong ngoặc đơn ( val barvân vân) hoặc phần trong dấu ngoặc nhọn (phần sau extends Model)? (Không có dấu ngoặc trong mã đó)
Billy ONeal

3
Phần trong ngoặc đơn. Tôi là người Anh. Chúng tôi gọi những cái đó là dấu ngoặc, chết tiệt, bởi vì trong tình huống đó, chúng không phục vụ vai trò chính.
Tom Morris

2
Nó trông không tệ lắm nếu được thụt lề theo cách này: pastebin.com/h9qC8XGg
mấtfaktor

Tôi thấy dễ đọc hơn khi viết các danh sách tham số hàm tạo này theo chiều ngang, đặc biệt khi tôi chỉ có một vài tham số.
MJP

Trông giống như một phương pháp với tôi. Giống như Simula. Tốt trường cũ.
Tom Hawtin - tackline
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.