Niềng răng xoăn nên xuất hiện trên dòng riêng của họ? [đóng cửa]


273

Có nên niềng răng xoăn trên đường dây của mình hay không? Bạn nghĩ gì về nó?

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

hoặc nó nên

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

hoặc thậm chí

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

Hãy xây dựng! Giải thích tại sao, chia sẻ kinh nghiệm, sao lưu nó với các sự kiện và tài liệu tham khảo.


104
Tôi thấy "== true" gây mất tập trung hơn so với lựa chọn vị trí niềng răng.
Dan Dyer

11
@Dan: Tôi nghĩ rằng luôn luôn khám phá các biểu thức có điều kiện giúp ích rất nhiều cho sự rõ ràng.
Wizard79

4
Lý do duy nhất điều này sẽ là vấn đề nếu IDE / trình soạn thảo của bạn không hỗ trợ nhận dạng khung cong.
leeand00

4
@ leeand00: một số người trong chúng ta vẫn in ra mã phức tạp / không quen thuộc để nghiên cứu / chú thích nó. Một máy in đẹp tốt giảm thiểu hầu hết các vấn đề mặc dù.
Shog9

2
buồn câu hỏi đã khép lại. Sau một thời gian sử dụng cú pháp dựa trên thụt lề, tôi chuyển sang (có thể kỳ lạ) một cấu trúc niềng răng khác. Giống như cú đúp đầu tiên nhưng kết thúc của bạn trong dòng cuối cùng của khối. (sau dòng mã)
cnd

Câu trả lời:


88

Khi còn là sinh viên, tôi thường đặt các dấu ngoặc nhọn trên cùng một dòng, để có ít dòng hơn và mã được in trên ít trang hơn. Nhìn vào một ký tự dấu ngoặc đơn được in là điều duy nhất trong một dòng là khó chịu. (môi trường, lãng phí giấy)

Nhưng khi mã hóa các ứng dụng lớn, cho phép một số dòng chỉ có niềng răng trong đó có giá cả phải chăng, xem xét cảm giác 'nhóm' mà nó mang lại.

Cho dù bạn chọn kiểu nào, hãy nhất quán để nó không trở thành chi phí cho bộ não của bạn để xử lý nhiều kiểu trong các đoạn mã liên quan . Trong các kịch bản khác nhau (như ở trên) tôi sẽ nói sử dụng các phong cách khác nhau là ổn, việc 'chuyển ngữ cảnh' ở mức cao sẽ dễ dàng hơn.


6
Mặt khác, niềng răng trên dòng mới là TIÊU CHUẨN ANSI, K & R thì không. Nhưng cái hay của các tiêu chuẩn là, có rất nhiều cái khác nhau (xem thêm từ điển bách khoa.wikia.com/wiki/AAAAAAAAA ! Trên cuốn bách khoa toàn thư).
Quandary

"Có ít dòng hơn" Tôi có Terabyte of Space và rất nhiều Pixels. Tại sao tôi nên quan tâm đến việc sử dụng nhiều dòng hơn?
12431234123412341234123

1
@ 12431234123412341234123: Tôi nghĩ rằng anh ấy có nghĩa là vì một số người in mã ra để xem xét mã. Và mỗi dòng mới không hoàn toàn cần thiết là lãng phí giấy, hoặc một km² bị lãng phí ở quy mô. Tuy nhiên, nếu bạn không in nó ra (tôi chắc chắn không) thì ANSI tốt hơn nhiều so với K & R. Ngoài ra, bất kỳ ai có ý định in có lẽ nên sử dụng một trình định dạng mã tự động - vì vậy đây sẽ là một câu hỏi về công cụ, không phải là một kiểu mã hóa.
Quandary

247

Bạn không bao giờ nên làm phương pháp thứ 3.

Lướt qua niềng răng lần đầu tiên có thể giúp bạn tiết kiệm một vài lần nhấn phím, nhưng lập trình viên tiếp theo đi kèm, thêm điều gì đó vào mệnh đề khác của bạn mà không nhận thấy khối bị thiếu niềng răng sẽ gây ra rất nhiều đau đớn.

Viết mã của bạn cho người khác.


113
Tôi ước tôi biết rằng chút trí tuệ đó ​​bắt nguồn từ đâu. Bởi vì viết mã của bạn cho những người không muốn đọc nó là vô nghĩa như bạn có thể nhận được ...
Shog9

69
Lập trình viên thứ hai có thể thêm niềng răng của riêng mình khi anh ta thêm một cái gì đó. Anh ta không ngu ngốc, và trong một hội nghị mã hóa khuyến khích bỏ niềng răng cho những thứ đơn giản như thế này, anh ta sẽ biết để nhìn.
Ken Bloom

25
Niềng răng tùy chọn không phải là tùy chọn. Có một vài quyết định thiết kế tồi tệ hơn được đưa ra trong C và được chuyển cho con cháu của nó. Rằng nó tồn tại trong một ngôn ngữ gần đây như C # khiến tôi nổi giận.
Adam Crossland

28
Không quan trọng bạn thông minh đến mức nào hoặc ăn sâu vào tiêu chuẩn mã hóa xung quanh các đường cong bị bỏ sót một dòng là: nếu bạn đang tìm cách giải quyết vấn đề hoặc lỗi, bạn có thể sẽ bỏ lỡ rằng các đường cong bị bỏ qua. Và trong tổng cộng 2 giây làm việc, nó có thực sự tệ đến mức không thể nói rõ?
Jordan

11
Có một lợi thế cho kiểu số 3 mà bạn đang thiếu: Bạn nhận được nhiều mã hơn trên màn hình của mình cùng một lúc.
Loren Pechtel

203

Trong một thời gian dài, tôi lập luận rằng chúng có giá trị như nhau, hoặc rất gần bằng với mức tăng có thể bằng cách đưa ra lựa chọn đúng là rất xa, thấp hơn nhiều so với chi phí tranh luận về nó.

Sự nhất quán là quan trọng , mặc dù. Vì vậy, tôi đã nói hãy lật một đồng xu và viết mã.

Tôi đã thấy các lập trình viên chống lại sự thay đổi như thế này trước đây. Hãy vượt qua nó! Tôi đã chuyển đổi nhiều lần trong sự nghiệp của mình. Tôi thậm chí sử dụng các kiểu khác nhau trong C # của mình so với PowerShell.

Vài năm trước tôi đã làm việc trong một nhóm (~ 20 nhà phát triển) đã quyết định yêu cầu đầu vào, sau đó đưa ra quyết định và sau đó thực thi điều đó trên tất cả các cơ sở mã. Chúng tôi sẽ có 1 tuần để quyết định.

Rất nhiều tiếng rên rỉ & đảo mắt. Rất nhiều "Tôi thích cách của tôi, bởi vì nó tốt hơn" nhưng không có chất.

Khi chúng tôi đang nghiên cứu những điểm chính xác hơn của câu hỏi, có người đã hỏi làm thế nào để giải quyết vấn đề này theo kiểu giằng co:

void MyFunction(
    int parameterOne,
    int parameterTwo) {
    int localOne,
    int localTwo
}

Lưu ý rằng không rõ ràng ngay lập tức khi danh sách tham số kết thúc và phần thân bắt đầu. So với:

void MyFunction(
    int parameterOne,
    int parameterTwo) 
{
    int localOne,
    int localTwo
}

Chúng tôi đã đọc một số cách mọi người trên khắp thế giới đã giải quyết vấn đề này và tìm thấy mô hình thêm một dòng trống sau cú đúp mở:

void MyFunction(
    int parameterOne,
    int parameterTwo) {

    int localOne,
    int localTwo
}

Nếu bạn sẽ làm cho một phá vỡ thị giác, bạn cũng có thể làm điều đó với một cái nẹp. Sau đó, phá vỡ thị giác của bạn trở nên nhất quán, quá.

Chỉnh sửa : Hai lựa chọn thay thế cho giải pháp 'dòng trống thêm' khi sử dụng K & R:

1 / Ấn định các đối số hàm khác với thân hàm

2 / Đặt đối số đầu tiên trên cùng một dòng với tên hàm và căn chỉnh thêm các đối số trên các dòng mới cho đối số đầu tiên đó

Ví dụ:

1 /

void MyFunction(
        int parameterOne,
        int parameterTwo) {
    int localOne,
    int localTwo
}

2 /

void MyFunction(int parameterOne,
                int parameterTwo) {
    int localOne,
    int localTwo
}

/Biên tập

Tôi vẫn lập luận rằng tính nhất quán là quan trọng hơn các cân nhắc khác, nhưng nếu chúng ta không có tiền lệ được thiết lập , thì bước đi tiếp theo là cách tốt nhất.


33
FYI, tôi có vẻ như là một người hợp lý, nhưng tôi thực sự là một người dở hơi. Đối với các khối đơn giản, một dòng, tôi sẽ không sử dụng dấu ngoặc nhọn cũng như dòng mới, tạo 'if (foo) bar ()' tất cả một dòng. Tôi cố gắng làm cho mã của tôi đủ đơn giản để nó không thành vấn đề.
Jay Bazuzi

38
Đến đây để đăng chính xác điều này. Hàng tấn người giữ nẹp mở trên cùng một dòng theo sau nó bằng một dòng trống (đặc biệt là khi bắt đầu các lớp và phương thức) bởi vì nếu không, thật khó để tách tiêu đề lớp / phương thức khỏi phần thân. Chà, dù sao bạn cũng sẽ sử dụng một dòng phụ, bạn cũng có thể đặt nẹp ở đó và nhận được lợi ích bổ sung của việc thụt đầu dễ dàng hơn.
Yevgeniy Brikman

27
Tôi chưa thấy dòng trống - Tôi quen thuộc hơn với hai lần tham số cho MyFactor () khi chúng đi lạc vào dòng khác.
Armand

34
Việc phá vỡ các tham số thành nhiều dòng như thế là điên rồ.
Fosco

10
Đối số "tham số hàm" là một cá trích đỏ. Rõ ràng các đối số nên được dự định gấp đôi. Không có vấn đề gì để phân biệt với mã sau đây.
David Ongaro

99

Các quy tắc chính là:

  1. Thực hiện theo tiêu chuẩn mã hóa hiện có của dự án.
  2. Nếu không có tiêu chuẩn mã hóa và bạn đang chỉnh sửa một cơ sở mã hiện có thuộc sở hữu của người khác - hãy nhất quán với phong cách của mã hiện tại, bất kể bạn thích / không thích nó đến mức nào.
  3. Nếu bạn đang làm việc trong một dự án trường xanh - thảo luận với các thành viên khác trong nhóm và đi đến thống nhất về một tiêu chuẩn mã hóa chính thức hoặc không chính thức.
  4. Nếu bạn đang làm việc trong một dự án lĩnh vực xanh với tư cách là nhà phát triển duy nhất - tạo nên tâm trí của riêng bạn, và sau đó nhất quán một cách tàn nhẫn.

Ngay cả khi bạn không có ràng buộc bên ngoài nào, tốt nhất bạn nên tìm kiếm một hướng dẫn mã hóa hoặc tiêu chuẩn mã hóa hiện có (được sử dụng rộng rãi) và thử làm theo. Nếu bạn cuộn theo phong cách của riêng bạn, có một cơ hội tốt mà bạn sẽ phải hối tiếc trong một vài năm.

Cuối cùng, một kiểu được triển khai / thực hiện bằng cách sử dụng trình kiểm tra kiểu và trình định dạng mã hiện có sẽ tốt hơn một kiểu cần được "thi hành" theo cách thủ công.


10
Câu trả lời này xứng đáng được nhiều phiếu hơn.
AShelly

1
tính nhất quán là chìa khóa
MediaVince

70

Lợi ích của phương pháp đầu tiên là nó nhỏ gọn hơn theo chiều dọc, do đó bạn có thể phù hợp với nhiều mã hơn trên màn hình của mình và đó là lý do tại sao tôi thích nó hơn. Đối số duy nhất tôi nghe thấy có lợi cho phương pháp thứ hai là nó giúp việc ghép ngoặc mở và đóng dễ dàng hơn, nhưng hầu hết các IDE đều có một phím tắt cho điều đó và thực sự là một câu lệnh sai - thay vì ghép một dấu ngoặc mở với một đóng khung bạn có thể ghép một dấu ngoặc đóng với biểu thức "bắt đầu khối" (if, other, for, while) trên cùng một mức thụt đầu dòng, vì vậy thật dễ dàng để xác định vị trí bắt đầu của khối.

Tôi thấy không có lý do gì để lãng phí toàn bộ một dòng chỉ cho một dấu ngoặc khi trước đó cho / while / nếu cấu trúc đã trực quan chỉ ra sự bắt đầu của một khối.

Điều đó nói rằng, tôi tin rằng khung đóng phải nằm trong dòng riêng của nó bởi vì chúng ta cần một cái gì đó để chỉ ra sự kết thúc của một khối và cấu trúc thụt đầu dòng của nó theo một cách có thể nhìn thấy.


12
Không ... Tôi đang nói tại sao giảm số lượng mã có thể vừa trên màn hình của bạn bằng cách làm điều gì đó không thêm vào sự rõ ràng của mã?
EpsilonVector

6
Khi tôi bắt đầu viết mã, tôi thích mỗi cú đúp trên dòng riêng của mình, bây giờ tôi thích phương thức đầu tiên
NimChimpsky

57
Có một khối lượng lớn các nghiên cứu, quay trở lại thời kỳ đầu của Steam (Weinberg, "Tâm lý học lập trình máy tính"), cho thấy sự hiểu biết của lập trình viên rơi ra khỏi DRAMATICALLY khi số lượng mã phải xem nhiều hơn có thể được nhìn thấy cùng một lúc (nghĩa là một màn hình, một trang máy in). Hiện tượng này lập luận NGHIÊM TÚC để xem không gian dọc là một nguồn tài nguyên quý giá, không bị lãng phí một cách vô cớ, và do đó phương pháp đầu tiên được ưa thích.
John R. Strohm

10
LOL @ "lãng phí một dòng ENTIRE". CHÚA ƠI! Không phải cái đó!! = P
Nick Spreitzer

6
@Julio Ở trường đại học, tôi rất thích phương pháp 1 và không thể đọc được phương pháp 2. Sau khi đi làm tại một công ty sử dụng C #, trong đó tiêu chuẩn là phương pháp 2, tôi cũng rất thích điều đó. Bây giờ tôi có thể đọc hoặc sử dụng; không ai làm phiền tôi Những người có phản ứng ác cảm mạnh mẽ với người này hay người khác thường phản ứng thái quá với điều gì đó mà họ không quen thuộc.
KChaloux

46

tôi thích

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

kết thúc

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

bởi vì dòng you.postAnswer();này dễ đọc và dễ nhìn hơn từ cái nhìn đầu tiên. Theo cách thứ hai, nó được hòa trộn với dòng phía trên nó ( you.hasAnswer()) khiến mắt tôi phải tập trung hơn để đọc nó.


7
Điều này đúng cho đến khi chương trình của bạn vượt quá chiều cao màn hình của bạn. ;)
weberc2

13
@ weberc2 Tôi nghĩ rằng khi chương trình của bạn vượt quá chiều cao của màn hình, hai dòng sẽ không thay đổi nhiều.
Mageek

13
10 năm trước, tôi đã đồng ý về không gian màn hình. Hôm nay, tôi sử dụng màn hình 1920 * 1200. Nó phù hợp với rất nhiều mã, nhiều hơn bộ não của tôi có thể xử lý cùng một lúc. Phương pháp đầu tiên cho phép tôi kéo lại và xem phạm vi mở / đóng khác nhau mà không cần phải đọc nó.
LightStriker

3
Tôi không bao giờ có thể hiểu tại sao tôi thích phương pháp này nhưng nó chính xác là như vậy.
Declan McKenna

2
@Mageek Đây là muộn, nhưng nó không phải là 2 dòng, nó là 2 dòng cho mọi phạm vi. Đó là O (N), không phải O (1). Tôi thực sự không cảm thấy điều đó mạnh mẽ về nó; điều quan trọng hơn là bạn chọn một kiểu làm cho danh sách tham số dài có thể đọc được.
weberc2

38

Tôi thích phương pháp đầu tiên. Niềng răng hoàn toàn không có giá trị riêng biệt.

Có điều là niềng răng không quan trọng. Chúng chỉ là rác tổng hợp , điều hoàn toàn không cần thiết để hiểu mã là gì, về mục đích và cách thức triển khai. Chúng chỉ là một sự tôn vinh đối với các ngôn ngữ giống như kiểu C cũ, nơi việc nhóm các nhà khai thác trực quan là không thể do không gian màn hình thấp có sẵn.

Có những ngôn ngữ (Python, Haskell, Ruby) vẫn ổn mà không cần niềng răng. Điều này chỉ xác nhận rằng niềng răng là rác, và không nên xứng đáng có một dòng cho chúng bất cứ khi nào có thể:

if (you.hasAnswer()){
    you.postAnswer();
}else{
    you.doSomething();
}

7
Tôi không biết về Haskell hoặc Ruby, nhưng Python nhạy cảm với khoảng trắng, đó là lý do tại sao nó không yêu cầu niềng răng hoặc các dấu phân cách khác để biểu thị các khối. Niềng răng không chỉ là tiếng ồn cú pháp; họ phục vụ một mục đích thực tế.
Robert Harvey

14
@Robert, Trong C bạn phải làm cả khoảng trắng và dấu ngoặc nhọn. Trong Python bạn chỉ nên làm khoảng trắng. Cái nào tốt hơn?
P Shved

5
@Pavel, trong C 'bạn không phải làm whitepace.
Ken Bloom

7
Các chương trình @KenBloom C không có khoảng trắng là không thể đọc được. Vì vậy, bạn phải làm chúng bằng cách nào.
P Shved

6
Bất kể liệu niềng răng có phải là một ý tưởng tốt hay không, sự tồn tại đơn thuần của các ngôn ngữ không sử dụng chúng dường như không phải là một cuộc tranh cãi hoặc chống lại chúng. Nó chỉ gợi ý rằng có thể có một ngôn ngữ mà không có chúng, không phải là một thiết kế ngôn ngữ tốt hay kém.
Jason

37

Sử dụng Python và bỏ qua hoàn toàn đối số.


17
+1SyntaxError: not a chance
Seth

6
Điều này chỉ đơn giản không phải là một lựa chọn cho phần lớn, phần lớn các dự án. Thêm vào đó, việc thụt lề để phân nhóm có một số vấn đề.
Bryan Oakley

@Bryan, tôi nhận ra rằng điều này không thực tế lắm. Tôi chỉ nghĩ rằng đó là một quan điểm cần phải được đưa ra ngoài, mạnh mẽ hơn chỉ là một nhận xét. Và tôi chưa bao giờ gặp phải những vấn đề gây ra bởi sự thụt dòng mà bạn ám chỉ, có lẽ vì tôi không trộn lẫn các tab và khoảng trắng.
Đánh dấu tiền chuộc

Sử dụng Go và bỏ qua hoàn toàn đối số (cộng với gõ tĩnh, tốc độ và trình biên dịch!) :)
weberc2

4
Sau đó nhấn phím cách một lần quá nhiều lần và xem trình biên dịch / thông dịch viên cười nhạo bạn. Điều đó sẽ không xảy ra trong hầu hết các ngôn ngữ.
Pharap 2/2/2015

27

Vị trí của niềng răng nên

metadata

cấu hình trong IDE bởi lập trình viên. Bằng cách đó, những dấu ngoặc nhọn trong tất cả các mã, bất kể tác giả, trông giống nhau.


7
Hoàn toàn đồng ý. Đó là phần trình bày và không phải dữ liệu.
Petruza

Vấn đề là nếu bạn để mọi người tự thiết lập, mọi thứ sẽ trở nên lộn xộn rất nhanh khi các cam kết được thực hiện.
Andy

1
@Andy: Đó chính xác là vấn đề, IDE sẽ thay đổi giao diện, nhưng chỉ trong IDE! Nguồn thực tế sẽ không được chạm vào. Để kiểm soát phiên bản, bạn có thể thêm các móc dịch bất cứ cài đặt nào cho dấu ngoặc nhọn vào tình huống phổ biến để mọi người kiểm tra mã theo cùng một cách.
klaar

@klaar Mỗi IDE hiện đại mà tôi đã sử dụng sẽ thay đổi các tab thành khoảng trắng và di chuyển dấu ngoặc vào dòng riêng của chúng hoặc cuối dòng "mở"; Tôi không chắc tại sao bạn nghĩ rằng nguồn không được chạm vào trong những trường hợp này và đó là lý do cho nhận xét của tôi. Nó thường được thay đổi bởi các IDE tùy thuộc vào cài đặt của nhà phát triển, điều đó có nghĩa là trong quá trình cam kết tôi sẽ thấy rất nhiều thay đổi chỉ gây ồn khi niềng răng được chuyển sang dòng riêng của họ, do đó che giấu sự thay đổi THỰC TẾ mà ai đó đã làm.
Andy

@Andy: Không có khả năng sử dụng các móc chuyển đổi những khác biệt liên quan đến khoảng trắng và niềng răng thành một cam kết nâng cao tiêu chuẩn thống nhất, để tránh sự cố tiếng ồn mà bạn mô tả? Dù bằng cách nào, một hệ thống phiên bản phù hợp sẽ vượt qua những thứ nhỏ nhặt như khoảng trắng hoặc những thứ vô nghĩa khác.
klaar

19

Nó phụ thuộc.

Nếu tôi đang mã hóa bằng Javascript hoặc jQuery, tôi sử dụng mẫu đầu tiên:

jQuery(function($) { 
    if ($ instanceOf jQuery) { 
        alert("$ is the jQuery object!"); 
    } 
}); 

Nhưng nếu tôi viết mã bằng C #, tôi sử dụng mẫu thứ hai, vì đó là cách chính tắc để làm điều đó trong C #.

public int CalculateAge(DateTime birthDate, DateTime now) 
{ 
    int age = now.Year - birthDate.Year; 
    if (now.Month < birthDate.Month 
        || (now.Month == birthDate.Month && now.Day < birthDate.Day)) 
        age--; 
    return age; 
} 

Lưu ý rằng ví dụ của bạn có thể được viết

if (you.hasAnswer())
    you.postAnswer();
else
    you.doSomething();

trong C #.


1
Nó có thể được viết bằng rất nhiều ngôn ngữ như thế, bởi vì một câu lệnh chặn là một câu lệnh. Thêm! :-)
Tamara Wijsman

2
Theo "Nguyên tắc thiết kế khung", "cách chính tắc" là đặt dấu ngoặc mở trên cùng một dòng (tức là mẫu đầu tiên). Chỉ cần nói ...
Uwe Honekamp

3
@Uwe: Có lẽ. Nhưng Microsoft đã áp dụng phương pháp "niềng răng căn chỉnh" cho tất cả các ví dụ MSDN C # của mình và nó được đưa vào Visual Studio, vì vậy ...
Robert Harvey

@Uwe: Đó là cuốn sách của Cwalina và nó được đặt tên khủng khiếp vì nó còn hơn thế nữa. FDG trên MSDN không có gì để nói về điều đó. Ngoài ra tôi tự hỏi, tại sao Nguyên tắc thiết kế khung sẽ nói bất cứ điều gì về thực hành mã hóa C # ?
R. Martinho Fernandes

3
Thực tế, bạn nên đặt dấu ngoặc nhọn trên cùng một dòng trong Javascript. Bạn có thể gây ra lỗi nếu dấu ngoặc nhọn nằm trên đường thẳng của chúng. Ví dụ: xem encosia.com/ từ
Joseph Hansen

18

Tôi thích cái đầu tiên vì tôi khó nhìn thấy lỗi hơn trong ví dụ này.

if (value > maximum);
{
    dosomething();
}

hơn trong ví dụ này

if (value > maximum); {
    dosomething();
}

Điều này ; {có vẻ sai đối với tôi hơn là một dòng kết thúc với ;vì vậy tôi có nhiều khả năng nhận thấy nó.


11
Bạn đưa ra một lập luận tốt, nhưng cá nhân tôi, điều này chỉ xảy ra với tôi một lần trong 5 năm lập trình của tôi. Tôi không thể hiểu tại sao nó không được thực thi, đã đăng nó lên SO và ai đó đã nhanh chóng chỉ ra dấu chấm phẩy cho tôi. Tuy nhiên, mỗi lần cô đọng lại để sử dụng 1 dòng đó, tôi thấy khó đọc hơn.
JD Isaacks

6
"; {" Trông giống như một khuôn mặt nhăn nhó nháy mắt hoặc có thể là một người có ria mép.
glenatron

+1 Ví dụ tuyệt vời trong câu trả lời: sai lầm rất tinh tế, dễ bị bỏ qua. Suy nghĩ kích động quá về bố trí hiển thị này lên.
trị liệu

10
Tất nhiên, bất kỳ IDE tốt nào cũng sẽ gắn cờ câu lệnh điều khiển trống và bất kỳ trình biên dịch tốt nào cũng sẽ đưa ra cảnh báo.
Dunk

@Dunk Lỗ hổng duy nhất trong lập luận của bạn (mà tôi rất đồng ý) là rất nhiều người đang sử dụng các ngôn ngữ được giải thích ngày nay (JavaScript, PHP, et al) mà rất nhiều "lập trình viên" sẽ không biết trình biên dịch từ một đôi pha cà phê.
Craig

15

Tôi thích một biến thể nhỏ của 1)

if (you.hasAnswer()) {
    you.postAnswer();
} // note the break here
else {
    you.doSomething();
}

Tại sao?

  • Tôi nghĩ rằng luôn luôn đặt niềng răng trên dòng riêng của họ làm giảm khả năng đọc. Tôi chỉ có thể chứa một số mã nguồn nhất định trên màn hình của mình. Kiểu khung 2) làm cho các thuật toán nặng nề với rất nhiều vòng lặp lồng nhau và các điều kiện dài một cách đau đớn.

  • Tuy nhiên, tôi muốn elsebắt đầu một dòng mới vì ifelsethuộc về nhau, trực quan. Nếu có một dấu ngoặc ở phía trước else, sẽ khó khăn hơn nhiều để phát hiện ra cái gì thuộc về cái gì.

  • 3) không đủ tiêu chuẩn. Chúng ta đều biết những điều tồi tệ có thể xảy ra nếu bạn bỏ dấu ngoặc và quên nó đi.


1
Tôi đã thấy cái này xung quanh nơi tôi làm việc. Thật thú vị.
Almo

1
Tôi cũng thích phong cách này hơn, vì nó cho phép tôi đưa bình luận lên trên elsedòng khi cần và / hoặc đặt một dòng trống giữa khối if và khối khác để làm cho mọi thứ trông bớt nhồi nhét hơn. Kiểu khung số 2 không làm gì khác hơn là làm lệch các hành động khỏi các điều kiện. Như đã nói, yêu thích của tôi chắc chắn là phong cách không có khung của python :)
sayap

4
Nếu tối đa hóa số lượng dòng mã trên màn hình là quan trọng thì bạn chỉ cần loại bỏ hoàn toàn với dòng mới. Bạn sẽ có thể nhận được rất nhiều dòng trên một màn hình. Tôi thích không có bất cứ điều gì khiến tôi phải dừng lại và suy nghĩ trong khi đọc, tức là. định nghĩa của tôi về dễ đọc hơn. Với niềng răng, tâm trí của tôi bỏ qua chúng. Không có niềng răng, tâm trí tôi phải tạm dừng và căn chỉnh các khối điều khiển. Không phải là một khoảng dừng dài, mà là tạm dừng không hơn không kém.
Dunk

1
Có, nếu và những thứ khác thuộc về nhau, NHƯNG cũng vậy {và} và as} nằm trên một dòng riêng biệt, {cũng nên nằm trên một dòng riêng biệt. "Tôi chỉ có thể chứa một số mã nguồn nhất định trên màn hình của mình" Và đó chính xác là lý do tại sao nói 3) sẽ "không đủ tiêu chuẩn" hoàn toàn không phải là một lựa chọn. Sau một thập kỷ làm việc với 3) Tôi đã không quên thêm dấu ngoặc khi thêm một dòng mã mới, tôi cũng không biết ai đã từng có. Nếu tôi phải điều chỉnh mã cho mọi người, ai không thể đọc đúng, nó sẽ kết thúc ở đâu? Ngừng sử dụng các tính năng ngôn ngữ nhất định, bởi vì một số mã người đọc có thể không hiểu chúng?
Kaiserludi

10

Tôi đã đọc ở đâu đó rằng các tác giả của một số cuốn sách muốn mã của họ được định dạng như thế này:

if (you.hasAnswer())
{
    you.postAnswer();
}
else
{
    you.doSomething();
}

Nhưng các hạn chế về không gian từ nhà xuất bản của họ có nghĩa là họ phải sử dụng điều này:

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

Bây giờ tôi không biết liệu điều đó có đúng không (vì tôi không thể tìm thấy nó nữa), nhưng phong cách thứ hai rất phổ biến trong sách.

Ở cấp độ cá nhân, tôi thích các dấu ngoặc trên một dòng riêng biệt như:

a) họ chỉ ra một phạm vi mới
b) dễ dàng phát hiện hơn khi bạn có sự không phù hợp (mặc dù đây không phải là vấn đề trong IDE làm nổi bật các lỗi cho bạn).


... Tùy chọn thứ hai cũng tạo điều kiện thuận lợi cho cả hai điểm của bạn (chỉ có thụt đầu dòng phục vụ mục đích của kết hợp nẹp / thụt). :)
weberc2

10

Ah, Phong cách cú đúp thực sự .

Nó có mọi thứ cần thiết cho Holy Way - thậm chí là một nhà tiên tri (Richard "cách của tôi hoặc đường cao tốc" Stallman).

Anh chàng đã sai rất nhiều về rất nhiều thứ, nhưng GNU là điểm nổi bật khi nói đến niềng răng.


[Cập nhật] Tôi đã thấy ánh sáng, và bây giờ tôn thờ Allman


9
Tôi không thấy điểm của phong cách GNU, ngoài việc nó mô hình mã lisp. Có vẻ như rất nhiều công việc cho lợi ích nhỏ.
Robert Harvey

Tôi biết không có ai sử dụng kiểu GNU. 1TBS tất cả các cách.
Jé Queue

Bạn không thể làm bất kỳ điều gì tồi tệ hơn hai cấp độ thụt vào mỗi khối, ngoại trừ phong cách lisp, tất nhiên, không cần phải nói.
ergosys

4
+1 cho liên kết về kiểu giằng. Nó cho thấy dù phong cách của bạn là gì, nhiều người tuyệt vời không đồng ý với bạn.
Florian F

@RobertHarvey Không có công việc phụ, nếu có, bạn không sử dụng đúng công cụ để viết mã hoặc cấu hình nó đúng. Lợi ích là mã dễ đọc hơn nhiều, bạn thấy mọi lỗi trong ngoặc rất nhanh và bạn có thể dễ dàng chỉ đọc mã trong khi bỏ qua các khóa con.
12431234123412341234123123

9

Ví dụ thứ hai, tôi rất lớn về khả năng đọc. Tôi không thể đứng nhìn nếu chặn bất kỳ cách nào khác = (


1
Nghiên cứu chỉ ra rằng việc đọc mã nhỏ gọn dễ dàng hơn khi cơ sở mã vượt quá chiều cao của màn hình.
weberc2

5
@ weberc2, bạn có thể cung cấp DOIs cho những bài nghiên cứu đó không?
Grzegorz Adam Kowalski

9

Câu trả lời đơn giản: cái gì dễ gỡ lỗi hơn?

// Case 1:
void dummyFunction() {
  for (i = 0; i != 10; ++i) {
    if (i <= 10)
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there";
  }
} // COMPILER ERROR HERE


// Case 2:
void dummyFunction()
{
  for (i = 0; i != 10; ++i)

    if (i <= 10)
    {
      std::cout << "i is: " << i << "\n";
      std::cout << 10 - i << " steps remaining\n";

      // Some hard work here
      // which is really hard
      // and does take some screen estate
    }
    else
      std::cout << "We'll never get there\n";
  }
} // COMPILER ERROR HERE

Trong trường hợp nào bạn đã chẩn đoán vấn đề đầu tiên?

Tôi không quan tâm nhiều đến sở thích cá nhân (có nhiều phong cách khác, bao gồm cả người da trắng và cộng sự) và tôi không quan tâm nhiều ... miễn là nó không cản trở khả năng đọc mã của tôi và gỡ lỗi của tôi.

Đối với đối số "không gian lãng phí", tôi không mua nó: Tôi có xu hướng thêm các dòng trống giữa các nhóm logic để làm cho chương trình rõ ràng hơn ...


1
Cả hai đều dễ gỡ lỗi, chủ yếu vì nó là một khối mã ngắn. Việc thụt lề là nhất quán giúp dễ dàng hình dung các khối mã thực tế.
Htbaa

@Htbaa: thật vậy :) Vậy tại sao phải bận tâm?
Matthieu M.

@MatthieuM. Khối đầu tiên có ý nghĩa hơn đối với tôi, bởi vì các dòng mới (trong khối thứ hai) giữa chữ ký hàm, câu lệnh for và câu lệnh if khiến tôi tin rằng chúng không liên quan, nhưng rõ ràng chúng không liên quan. Các dòng trống là để tách các bit mã không liên quan; mã gần với các dòng mã khác có nghĩa là trên thực tế chúng có liên quan. Tất nhiên đây là 'imo', nhưng tôi tự hỏi quan điểm của bạn là gì. EDIT: bất kỳ IDE thích hợp nào cũng sẽ nhận thấy bất kỳ dấu ngoặc nào bị thiếu và cung cấp cho bạn một ít lỗi khi giải thích mã của bạn.
klaar

7

Không phải ai cũng chú ý, nhưng đây là lý do tại sao niềng răng thuộc về cùng một dòng với điều kiện (ngoại trừ các điều kiện rất dài, nhưng đó là trường hợp cạnh):

Trong C, đây là một cấu trúc hợp lệ:

trong khi (đúng);
{
    char c;
    getar (); // Đợi đầu vào
}

Nhanh chóng! Mã này làm gì? Nếu bạn trả lời "vòng lặp vô hạn yêu cầu đầu vào", bạn đã sai! Nó thậm chí không nhận được đầu vào. Nó bị bắt tại while(true). Lưu ý rằng dấu chấm phẩy ở cuối. Mô hình này thực sự phổ biến hơn mà có vẻ như nó phải như vậy; C yêu cầu bạn khai báo các biến của bạn khi bắt đầu một khối, đó là lý do tại sao một biến mới được bắt đầu.

Một dòng mã là một suy nghĩ. Niềng răng là một phần của ý nghĩ chứa điều kiện hoặc vòng lặp. Do đó, chúng thuộc cùng một dòng.


Đây là lý lẽ tốt nhất cho phong cách K & R mà tôi đã thấy, phần còn lại là đáng cười với các hệ thống IDE ngày nay có hỗ trợ gấp mã. Điều này chỉ áp dụng cho các ngôn ngữ kiểu C hỗ trợ ;kết thúc khối. Đây cũng là lý do tại sao tôi coi thường hệ thống kết thúc khối này mà IMHO đã lỗi thời và ngôn ngữ Go chứng minh điều đó. Tôi đã thấy vấn đề này nhiều lần mặc dù không có trong kịch bản này. Nó thường xảy ra khi họ có ý định thêm một cái gì đó vào tuyên bố và quên đi.
Jeremy

5

Tôi thích phương pháp đầu tiên. Nó có vẻ gọn gàng hơn IMO, và nó nhỏ gọn hơn, mà tôi thích.

EDIT: Ah, một phần ba. Tôi thích cái đó tốt nhất khi có thể, vì nó thậm chí còn nhỏ hơn / gọn gàng hơn.


5

Bạn có thể viết nó:

you.hasAnswer() ? you.postAnswer() : you.doSomething();

Để trả lời câu hỏi; Tôi đã từng thích sử dụng dấu ngoặc nhọn trên dòng riêng của họ, nhưng, để tránh phải suy nghĩ về các lỗi từ chèn dấu chấm phẩy tự động trong trình duyệt, tôi bắt đầu sử dụng kiểu Ai Cập cho javascript. Và khi mã hóa java trong nhật thực, tôi không có hứng thú với việc chiến đấu (hoặc cấu hình) kiểu niềng răng mặc định, vì vậy tôi cũng đã đi với Ai Cập trong trường hợp đó. Bây giờ tôi ổn với cả hai.


được sử dụng như vậy postAnswer()doSomething()nên trả về giá trị cho toán tử ternary, thường không phải là trường hợp: chúng rất có thể trả về void (không có giá trị). và cũng (ít nhất là trong c #) kết quả của ?:nên được gán cho một số biến
ASh

4

Gần như tất cả các câu trả lời ở đây đều nói một số biến thể về "Dù bạn làm gì, hãy gắn bó với một hoặc hai".

Vì vậy, tôi nghĩ về nó một lúc và phải thừa nhận rằng tôi không thấy nó quan trọng. Bất cứ ai có thể thành thật nói với tôi rằng những điều sau đây là khó theo dõi?

int foo(int a, Bar b) {
    int c = 0;
    while(a != c)
    {
        if(b.value[a] == c) {
            c = CONST_A;
        }
        c++;
    }
    return c;
}

Tôi không chắc chắn về bất cứ ai khác ... nhưng tôi hoàn toàn không có vấn đề gì về mặt tinh thần chuyển đổi qua lại giữa các phong cách. Tôi đã mất vài phút để tìm ra mã đã làm gì, nhưng đó là kết quả của việc tôi chỉ gõ ngẫu nhiên cú pháp giống như C. :)

Theo ý kiến ​​không hề khiêm tốn của tôi, việc niềng răng mở gần như hoàn toàn không liên quan đến khả năng đọc mã. Có một vài trường hợp góc được liệt kê ở trên trong đó một kiểu này hoặc kiểu kia tạo ra sự khác biệt, nhưng đối với hầu hết các phần, việc sử dụng hợp lý các dòng trống sẽ làm sạch nó.

FWIW, các kiểu mã hóa của chúng tôi tại nơi làm việc sử dụng mẫu 1 có cấu trúc hơn một chút và mẫu 3. được sửa đổi (C ++)

            // blank line is required here
if (x) {
            //This blank line is required
   y = z;
}
            // blank line is required here too, unless this line is only another '}'

if (x) y = z; //allowed

if (x)
    y = z;  // forbidden

Tôi tò mò liệu những người mạnh mẽ thích mẫu 2 sẽ tìm thấy phiên bản của mẫu 1 này tốt hơn, chỉ vì dòng trống mang lại sự tách biệt thị giác mạnh mẽ hơn.


4
Như ví dụ của bạn cho thấy, thụt đầu dòng rất quan trọng hơn so với dấu ngoặc cho mã có thể đọc được. Trong thực tế, một số ngôn ngữ làm cho thụt lề là cách duy nhất để lồng các câu lệnh!

1
Ok, tôi thành thật thấy bạn không nhất quán ví dụ khó đọc. Không thực sự khó, nhưng khó hơn nếu nó phù hợp.
Almo

Tôi đồng ý với Almo. Đó không phải là một trường hợp "nó thực sự khó". Đó là một trường hợp "nó chắc chắn khó hơn", ngay cả khi không khó. Vậy tại sao làm cho mọi thứ khó khăn hơn? Trong các ví dụ "đồ chơi" mọi người đưa ra tất nhiên có rất ít sự khác biệt. Theo kinh nghiệm của tôi, khi tôi thừa hưởng mã khó chịu từ người khác và họ đã sử dụng phương thức 1, khá thường xuyên phải đi trước và biến nó thành phương thức 2 chỉ để có thể tuân theo logic. Bởi vì thực tế là nó trở nên cần thiết thường xuyên; nó tự động trả lời câu hỏi phương pháp nào tốt hơn và dễ hiểu hơn.
Dunk

@Dunk: Tôi không thể hiểu được mã sẽ được cải thiện đáng chú ý bằng cách hoán đổi các chi tiết không liên quan như vậy xung quanh.
jkerian

@ jkerian - Rõ ràng bạn chưa được thừa hưởng nhiều mã từ những người khác đã rời khỏi dự án hoặc công ty. Tôi không thể nghĩ đến việc không gặp phải tình huống đó bởi bất cứ ai có nhiều năm kinh nghiệm. Nhưng một lần nữa, tình hình công việc của mọi người lại khác. Ngoài ra, nếu bạn phải thực hiện đánh giá mã "chính thức", định dạng tạo ra sự khác biệt khá lớn. Có thể đọc mã tự nhiên là rất quan trọng. Chắc chắn tôi có thể tạm dừng và suy nghĩ để phù hợp với niềng răng, nhưng điều đó làm chậm quá trình. Một cách không yêu cầu tạm dừng, những cách khác làm. Đó là lý do tại sao tôi không thấy lý do tại sao bất kỳ sự lựa chọn nào khác có thể được đề nghị.
Dunk

4

Tôi ngạc nhiên khi điều này chưa được nêu ra. Tôi thích cách tiếp cận thứ hai vì nó cho phép bạn chọn khối dễ dàng hơn.

Khi niềng răng bắt đầu và kết thúc trên cùng một cột và trên dòng riêng của chúng, Bạn có thể chọn từ lề hoặc bằng con trỏ trên cột 0. Điều này thường tương đương với một khu vực hào phóng hơn với lựa chọn chuột hoặc ít lần nhấn phím hơn với lựa chọn bàn phím.

Ban đầu tôi làm việc với niềng răng trên cùng một dòng với điều kiện, nhưng khi tôi chuyển đổi, tôi thấy nó tăng tốc độ mà tôi làm việc. Tất nhiên, đó không phải là ngày và đêm, nhưng điều gì đó sẽ khiến bạn chậm lại khi làm việc với niềng răng bên cạnh điều kiện của bạn.


Đồng hồ cũ như tôi sử dụng ba tổ hợp phím để chọn khối cho dù niềng răng chết tiệt ở đâu.
ergosys

2

Cá nhân tôi thích cách thứ hai.

Tuy nhiên, theo cách tôi sẽ chứng minh là theo ý kiến ​​của tôi tốt nhất bởi vì nó mang lại sự bảo mật công việc lớn nhất! Một sinh viên từ trường đại học của tôi đã nhờ tôi giúp đỡ về bài tập về nhà và đây là cách mã của anh ấy trông như thế nào. Toàn bộ chương trình trông giống như một khối duy nhất. Điều thú vị là 95% lỗi trong chương trình mà anh ấy tạo ra đến từ niềng răng không khớp. 5% khác là rõ ràng một khi niềng răng được khớp.

while(1){
i=0;
printf("Enter coded text:\n");
while((s=getchar())!='\n'){
         if(i%1==0){
            start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!");
exit(1);}
input=start;}
      input[i++]=s;}
start=(char*)realloc(input,(i+1)*sizeof(char));
if(start==NULL){
printf("Memory allocation failed!!!");
exit(1);}
input=start;
input[i]='\0';
                puts(input);

8
Xấu, xấu, ý tôi là ví dụ khủng khiếp. Vấn đề không phải là niềng răng! Đó là vết lõm điên rồ!
R. Martinho Fernandes

@Martinho Fernandes Tôi nghĩ rằng việc đặt niềng răng và thụt vào nhau ...
AndrejaKo

2
không nhất thiết ... thực hiện thụt lề đúng cách ở trên và sau đó chuyển đổi ngẫu nhiên các kiểu nẹp, bạn sẽ thấy điều đó có thể hiểu được.
jkerian

Trong thực tế, suy nghĩ về điều này thúc đẩy câu trả lời của riêng tôi cho câu hỏi này.
jkerian

"95% lỗi trong chương trình anh ấy tạo ra đến từ niềng răng không khớp" - chỉ bằng các ngôn ngữ được giải thích, không được biên dịch.
Mawg

2

Sở thích cá nhân của tôi là phương pháp đầu tiên, có lẽ vì đó là cách đầu tiên tôi học PHP.

Đối với ifbáo cáo một dòng , tôi sẽ sử dụng

if (you.hasAnswer()) you.postAnswer();

Nếu nó không phải you.postAnswer();là một cái gì đó dài hơn nhiều, chẳng hạn như you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);tôi có thể trở lại loại đầu tiên:

if (you.hasAnswer) {
    you.postAnswer(this.AnswerId, this.AnswerText, this.AnswerType);
}

Tôi sẽ không bao giờ sử dụng ngắt dòng và tôi sẽ không bao giờ sử dụng phương pháp này nếu có elsetuyên bố.

if (you.hasAnswer()) you.postAnswer();
else you.doSomething()

là một khả năng lý thuyết, nhưng không phải là một cái tôi từng sử dụng. Điều này sẽ phải được biến thành

if (you.hasAnswer()) {
    you.postAnswer();
} else {
    you.doSomething();
}

2

Họ không nên; phương pháp đầu tiên cho tôi.

Khi tôi nhìn vào cái thứ hai, vì các dòng không được sử dụng (những dòng chỉ có dấu ngoặc, không phải là dấu ngoặc cuối cùng), nó có cảm giác như nó phá vỡ tính liên tục của mã. Tôi không thể đọc nó nhanh vì tôi cần đặc biệt chú ý đến các dòng trống, điều này thường có nghĩa là sự phân tách trong mục đích mã hoặc một cái gì đó như thế này, nhưng trong trường hợp "dòng này thuộc về một dấu ngoặc nhọn" (chỉ lặp lại ý nghĩa của vết lõm).

Dù sao, giống như khi bạn viết văn bản ... thêm một vết lõm ở đầu đoạn văn là không cần thiết nếu có một dòng trống trước nó (dấu hiệu kép của thay đổi đoạn văn), không cần phải lãng phí dòng cho dấu ngoặc khi chúng ta thụt lề đúng cách.

Thêm vào đó, như đã nêu, nó cho phép điều chỉnh nhiều mã hơn trong màn hình, điều này ngược lại sẽ hơi phản tác dụng.


2

Nó phụ thuộc vào nền tảng / ngôn ngữ / quy ước

Trong Java:

void someMethod() { 
     if (you.hasAnswer()) {
         you.postAnswer();
     } else {
       you.doSomething();
     }
}

Trong C #

void someMethod() 
{ 
     if (you.hasAnswer()) 
     {
         you.postAnswer();
     } 
     else 
     {
       you.doSomething();
     }
}

Trong C:

void someMethod() 
{ 
     if (you_hasAnswer()) {
         you.postAnswer();
     } else {
       you_doSomething();
     }
}

Tôi ghét khi những người Java sử dụng phong cách của họ trong mã C # và ngược lại.


3
Phong cách C luôn làm tôi khó chịu. Hãy kiên định!
Christian Mann

1

Tất cả những gì tôi có thể nói là nếu bạn là người hâm mộ phương pháp # 3, bạn sẽ bị bức hại bởi mọi trình định dạng mã IDE trên trái đất.


1

Tôi sử dụng phương pháp đầu tiên đơn giản vì nó nhỏ gọn hơn và cho phép nhiều mã hơn trên màn hình. Bản thân tôi chưa bao giờ gặp vấn đề với việc ghép đôi niềng răng (tôi luôn viết chúng ra, cùng vớiif câu lệnh trước khi thêm điều kiện và hầu hết các môi trường cho phép bạn nhảy đến phù hợp).

Nếu bạn đã cần ghép lên niềng răng bằng mắt, sau đó tôi sẽ thích phương pháp thứ hai. Tuy nhiên, điều đó cho phép ít mã hơn cùng một lúc đòi hỏi bạn phải cuộn nhiều hơn. Và điều đó, đối với tôi ít nhất, có tác động lớn hơn đến việc đọc mã hơn là có niềng răng được sắp xếp gọn gàng. Tôi ghét di chuyển. Sau đó, một lần nữa, nếu bạn cần cuộn qua một ifcâu lệnh, rất có thể nó quá lớn và cần tái cấu trúc.

Nhưng; điều quan trọng nhất của tất cả là sự nhất quán. Sử dụng cái này hay cái kia - không bao giờ cả hai!


0

Khi tôi lần đầu tiên học lập trình ở tuổi 12, tôi đã đặt niềng răng ở dòng tiếp theo bởi vì các hướng dẫn mã hóa của Microsoft là như thế. Tôi cũng thụt lề với TABS 4 không gian lúc đó.

Sau một vài năm, tôi đã học Java và JavaScript và thấy nhiều mã niềng răng trên cùng một dòng, vì vậy tôi đã thay đổi. Tôi cũng bắt đầu thụt lề với SPACES 2 không gian.


5
+1, -1. Tại sao bạn KHÔNG thụt lề với các tab vì bất kỳ trình soạn thảo nào cũng có thể điều chỉnh độ dài tab theo độ dài tùy ý của bạn? Mặt khác, bạn dẫn rất nhiều người trong chúng ta, những người thích thụt lề thực sự ở số 8 để nguyền rủa mã của bạn.
Jé Queue

0

Có một tùy chọn thứ 4 giữ cho niềng răng thẳng hàng, nhưng không lãng phí không gian:

if (you.hasAnswer())
{    you.postAnswer();
     i.readAnswer();
}
else
{   you.doSomething();
}

Vấn đề duy nhất là hầu hết các bộ lọc tự động của IDE bị nghẹt thở vì điều này.


9
... cũng như hầu hết các lập trình viên, những người sẽ nghẹt thở về điều này.
Jé Queue

4
Điều đó có vẻ khủng khiếp. Hãy nghĩ về những nỗ lực thêm mà bạn phải trải qua nếu bạn muốn chèn một dòng ở trên cùng, hoặc loại bỏ dòng trên cùng. Bạn không thể xóa dòng và di chuyển, bạn phải nhớ chèn lại dấu ngoặc nhọn.
Bryan Oakley

lol này là tuyệt vời! :) tốt hơn phong cách đầu tiên!
nawfal

Rõ ràng nó thậm chí còn có một cái tên. Horstman Syyle được đề cập trong wikipedia . Tôi đã làm việc với một codebase như thế này, nó thực sự không tệ khi sử dụng.
HỎI

-1

Tất cả phụ thuộc vào bạn miễn là bạn không làm việc trong một dự án nơi mà một số ràng buộc mã hóa hoặc một số tiêu chuẩn đã được đặt ra bởi người quản lý dự án mà tất cả các lập trình viên đang làm việc trong dự án đó phải tuân theo trong khi mã hóa.

Cá nhân tôi thích phương pháp 1

Ngoài ra tôi không nhận được những gì bạn muốn hiển thị bằng phương pháp thứ 3?

Đó không phải là một cách sai? Ví dụ, hãy xem xét một tình huống như ..

if (you.hasAnswer())
  you.postAnswer();
else
  you.doSomething();

Bây giờ nếu ai đó muốn thêm một số câu lệnh trong if khối?

Trong trường hợp đó nếu bạn sử dụng phương thức thứ 3, trình biên dịch sẽ đưa ra lỗi cú pháp.

if (you.hasAnswer())
   you.postAnswer1();
   you.postAnswer2();
else
   you.doSomething();

2
Thậm chí tệ hơn sẽ là nếu ai đó đi cùng và đã làm: if (you.hasAnswer ()) you.postAnswer (); khác you.doSthing (); you.doSthingElse (); - đó là một công thức cho các lỗi tinh vi mà mắt có thể dễ dàng trượt qua và trình biên dịch sẽ không giúp được gì
FinnNk

@FinnNk: Chính xác!
Chankey Pathak

2
Nếu ai đó muốn thêm một tuyên bố khác, họ có thể tự đặt niềng răng. Bất kỳ lập trình viên nào xứng đáng với muối của mình thực sự sẽ có thể tìm ra điều đó.
Robert Harvey

Tôi muốn nói rằng phương pháp thứ 3 của anh ấy là sai.
Chankey Pathak

3
@Robert Harvey, tôi đã thấy các lập trình viên rất có kinh nghiệm bỏ lỡ việc niềng răng khi sửa đổi mã hiện có. Tôi nghĩ vấn đề là vết lõm có ý nghĩa mạnh hơn nhiều so với niềng răng (đặc biệt là vì có nhiều kiểu niềng răng), vì vậy khá dễ dàng bỏ qua niềng răng bị thiếu nếu vết lõm trông giống như những gì bạn mong đợi.
HỎI
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.