Nhận xét của Google về cuối khối mã sau} - tốt hay xấu? [đóng cửa]


18

Tôi thường thấy những bình luận như vậy được sử dụng:

function foo() {
   ...
} // foo

while (...) {
   ...
} // while

if (...) {
   ...
} // if

và đôi khi thậm chí xa như

if (condition) {
   ...
} // if (condition)

Tôi chưa bao giờ hiểu thực hành này và do đó không bao giờ áp dụng nó. Nếu mã của bạn quá dài đến mức bạn cần biết kết thúc }này là gì thì có lẽ bạn nên xem xét tách nó thành các chức năng riêng biệt. Ngoài ra, hầu hết các công cụ dành cho nhà phát triển đều có thể chuyển sang khung phù hợp. Và cuối cùng, cuối cùng, đối với tôi, một sự vi phạm rõ ràng đối với nguyên tắc DRY; nếu bạn thay đổi điều kiện, bạn cũng sẽ phải nhớ thay đổi nhận xét (nếu không nó có thể gây rắc rối cho người bảo trì, hoặc thậm chí cho bạn).

Vậy tại sao mọi người sử dụng điều này? Chúng ta nên sử dụng nó, hoặc nó là thực hành xấu?


Trong PHP, tôi sử dụng cú pháp thay thế cho các cấu trúc điều khiểnif(condition): ... else: ... endif;
systemovich

@Geoffrey van Wyk - thật sao? Tôi chưa bao giờ thấy bất cứ ai sử dụng những thứ này bên ngoài các tệp mẫu. Họ cực kỳ không chuẩn, nhưng với mỗi người, tôi đoán vậy.
Craige

4
@Craige: Bất kỳ ngôn ngữ nào được PHP hỗ trợ thực sự không phải là "Cực kỳ không chuẩn" - trình thông dịch PHP định nghĩa "tiêu chuẩn" là gì.
Billy ONeal

Ada có các điểm đánh dấu cụ thể cho phần cuối của hầu hết các cấu trúc : if ... then ... end if; while ... loop ... end loop; procedure Foo is ... end Foo;. Tôi thấy rằng nó giúp mức độ dễ đọc (và nó được kiểm tra bởi trình biên dịch, những bình luận không có).
Keith Thompson

Câu trả lời:


32

Tôi sẽ nói nếu mã của bạn dài đến mức bạn không thể dễ dàng theo dõi niềng răng của mình, mã của bạn cần tái cấu trúc, đối với hầu hết các ngôn ngữ.

Tuy nhiên, trong các ngôn ngữ tạo khuôn mẫu (như PHP), nó có thể hợp lệ, bởi vì bạn có thể có một khối HTML lớn ngăn cách phần đầu và phần cuối của điều kiện hoặc cấu trúc vòng lặp.


5
Điểm hoàn toàn hợp lệ cho PHP, nếu bạn đang sử dụng PHP trộn với Html. 1 điểm cho Gryffindor.

3
Ngay cả với PHP là ngôn ngữ tạo khuôn mẫu trộn với HTML, bạn vẫn có thể thụt lề. Bạn cũng không nên sử dụng dấu ngoặc nhọn khi sử dụng PHP làm ngôn ngữ tạo khuôn mẫu, mà thay vào đó là while(): endwhile;và các foreach(): endforeach;cấu trúc, v.v.
Htbaa

9
Tôi thực sự không thấy lý do tại sao bạn không nên cấu trúc lại PHP. Có lẽ sang một ngôn ngữ khác.
Tom Hawtin - tackline

@Htbaa: Tôi không thể tin rằng tôi đã sử dụng PHP mọi lúc và không biết gì về chúng. Cảm ơn! Về thụt lề, tôi thích giữ HTML có điều kiện thụt lề giống như phần còn lại của trang, hơn là phù hợp với PHP đang tạo ra nó.
Matt Ellen

3
@Tom: Tôi đã cười, nhưng cảm thấy có lỗi. : P

17

Đó là một mùi mã và thường là nôn nao từ phong cách mã lỗi thời. Trước khi việc tái cấu trúc IDE tốt trở nên khó khăn hơn và không phổ biến như bây giờ, do đó các phương pháp đã dài hơn và những bình luận này đã có để giúp điều hướng chúng tốt hơn.


15

Đây là một thực tế khủng khiếp làm cho lỗi thời bởi nhiều yếu tố.

  • Hầu hết các IDE hiện đại làm nổi bật nẹp tương ứng khi dấu mũ nằm trên một trong hai biểu tượng.
  • Nếu bạn đang viết mã sạch, bạn sẽ hiếm khi tìm thấy một nơi mà phương thức của bạn dài hơn 10 dòng.

Tôi nhận thấy rất nhiều lập trình viên Java có suy nghĩ này và nó làm cho mã Java trông thực sự bẩn và lấy sự tập trung ra khỏi mã và hướng tới các bình luận.

Rất đề nghị chống lại việc sử dụng này.


4
Tôi có một đồng nghiệp (nhà phát triển java), người thực hiện việc này. Ngoại trừ thay vì // cho và // nếu anh ta sử dụng // rof và // fi. Nó làm tôi phát điên và anh ấy làm điều đó ở mọi nơi.
Jay

Vâng, tôi đã có một cái mà nhấn mạnh vào nó. AAAAAGHHHHH.
Rig

2
Điều này thực sự không có gì để làm với các lập trình viên Java hoặc Java và nó không phải là điều phổ biến hoặc là một điều tiêu chuẩn thực tế phải làm khi lập trình bằng Java.
Jesper

1
+1.000 cho "là một thực tế khủng khiếp".
scunliffe

6

Mã được đọc nhiều hơn 10 lần so với mã được viết.

Nếu nó làm cho nó dễ đọc hơn, hãy làm nó.

Tôi cũng đề nghị với bất cứ ai làm điều này rằng họ nên xem xét một số cách khác để làm cho mọi thứ dễ đọc hơn. Các kỹ thuật tái cấu trúc, dấu ngoặc trên các dòng khác nhau, vv mà những người khác đã đề cập đều tốt. Chia mọi thứ thành các hàm, phương thức hoặc lớp khác nhau để mã tự nhận xét cũng tốt. Cũng có những cách để loại bỏ hầu hết các vòng lặp "ifs" và đặt "for" vào những nơi rõ ràng, do đó loại bỏ sự cần thiết của bất kỳ thứ gì trong số này.

Nhưng, đôi khi mọi người đang học. Nếu đây là điều họ đang làm thực sự làm cho mã dễ đọc hơn, hãy khuyến khích nó và sau đó khuyến khích một số thực tiễn khác. Những người đang học tập xứng đáng và sẽ được hưởng lợi từ sự khuyến khích, bất kể họ bắt đầu như thế nào. Nói "Điều này là xấu" không hữu ích như nói "Điều này khác tốt hơn".


6
Điều này xấu. Ngay cả sách giáo khoa cấp độ mới bắt đầu cũng không làm điều tàn bạo này. "Mã được đọc nhiều hơn 10 lần so với mã được viết" ... tất cả lý do nhiều hơn để không lãng phí thời gian của người đọc với mã này.
Thomas Eding

@trinithis Nếu bạn có câu lệnh chuyển đổi 20 trường hợp thì sao? Đôi khi bạn cần hỗ trợ 20 tùy chọn khác nhau và tốt hơn là tập hợp chúng ở một nơi hơn là "tái cấu trúc" vào một số kế hoạch ra quyết định đa cấp.
quant_dev

Tôi tin rằng đây là một thực tế của các lập trình viên, những người đánh giá thấp đồng nghiệp :) rằng những người khác không đủ thông minh hơn để đọc mã trừ khi. nói chung tôi chống lại cách làm này, nhưng không sao nếu ai đó làm điều đó vì có một khu rừng khiến họ khó đọc. tôi không làm điều đó
WinW

1
@trinithis Không phải là về việc nó xấu hay không, đó là về những cách hiệu quả để giúp mọi người trở nên tốt hơn để họ phát triển thông qua nó. Có hiệu quả> đúng. Đó cũng là một điều hoàn toàn hợp lý để làm nếu, giả sử, bạn đang tái cấu trúc mã kế thừa thậm chí còn lộn xộn hơn. Đôi khi những điều xấu có thể thực hiện các bước tạm thời tốt hơn và dẫn đến một cái gì đó thậm chí còn tốt hơn thế.
Lunivore

1
@trinithis Xin lỗi, tôi không thể hiểu ý của bạn khi tất cả nằm trên một dòng như thế. Tôi nghĩ rằng tôi đã đề cập rằng cũng có những cách khác để tái cấu trúc mã mà các nhà phát triển làm điều này có thể học được.
Lunivore

4

Tôi đã có một cơ sở mã lớn (C ++) với đầy đủ các loại điều này:

int Class::AccessorMethod(void)
{
    return privateValue;
}//end AccessorMethod

Đối với một cái gì đó nhỏ, tôi muốn nói điều này vượt xa "mùi mã" thành "mùi hôi thối mã". Đặc biệt là trong một IDE nơi tôi có thể kết hợp nẹp đóng với một tổ hợp phím để tìm nẹp mở. Đưa ra một phương pháp dài hơn, tôi vẫn sẽ kết hợp niềng răng trên bình luận cuối cùng. Những bình luận như vậy làm tôi mất tập trung và tôi có xu hướng nghĩ về chúng như tiếng ồn.


Ừm, tôi đoán tôi không nhận được một số định dạng trên trang web này; mỗi niềng răng phải có trên dòng riêng của nó, cơ thể phương pháp cũng vậy.
PSU

Trong C ++ mặc dù tôi sẽ thường mở không gian tên ẩn danh ở đầu cho các công cụ triển khai ẩn. Sau đó, tại một số điểm tôi đóng niềng răng này và thật hữu ích để biết niềng răng gần đây có nghĩa là gì.
CashCow

4

Trong C ++, có hai cách giữ mà điều này vẫn hữu ích và lời khuyên "tách mã của bạn" không cần giữ:

  1. Đối với không gian tên. Một không gian tên có thể bao gồm toàn bộ tệp và dấu ngoặc cuối cùng đôi khi có thể khiến mọi người bỏ qua, vì vậy việc thêm một nhận xét để chỉ ra dấu ngoặc là việc đóng một không gian tên là hữu ích. Đối với phong cách mã hóa cụ thể tại công ty của tôi, điều này rất quan trọng vì chúng tôi không thụt lề không gian tên vì đã quyết định rằng việc thụt lề như vậy sẽ chỉ lãng phí không gian trong một tệp.

  2. Đối với các cặp #ifdef / #endif. Đôi khi có rất nhiều mã trong đó để biên dịch có điều kiện, nó có thể gây khó chịu khi lồng và trình soạn thảo chúng tôi thường sử dụng một cách "trợ giúp" một cách nặng nề để loại bỏ thụt lề, vì vậy các bình luận rất hữu ích trong quá trình tổng quan nhanh.


+1 cho nhận xét không gian tên và lý do. Đó là lần duy nhất tôi làm điều này và vì lý do tương tự
JohnB

+ báo cáo chuyển đổi dài.
quant_dev

1

Đối với tôi mã phải khó hiểu để thêm một bình luận như bạn đã chỉ định.

Nếu nó chỉ nói // IF Statement. Sau đó, bạn phải tự hỏi tại sao nó ở đó ngay từ đầu.


Tôi đồng ý, có vẻ như một dòng đã được nhận xét, thay vì một trường học cũ//endif
StuperUser

1

Thay thế để xem những gì niềng răng của bạn đang đóng là có một cái mở trên cùng một cột với cái đóng. Tôi thấy rằng rõ ràng hơn và dễ đọc hơn.

Nhận xét này rất hữu ích khi thông thường sẽ khó theo dõi vì việc mở đã xảy ra từ lâu. Điều này thường chỉ xảy ra đối với một không gian tên (đặc biệt là không gian ẩn danh trong C ++, được sử dụng cho chi tiết triển khai trong đơn vị biên dịch). Trong hầu hết các trường hợp khác, rõ ràng những gì bạn đang đóng.


1

Điều này phần lớn là sự nắm giữ từ những ngày xưa làm việc trong các cửa sổ đầu cuối 80x24 ký tự, đặc biệt nếu bạn đang sử dụng một trình soạn thảo có cửa sổ như EVE. Ngay cả bây giờ, tôi thực hiện hầu hết công việc của mình trong phiên cuối bằng cách sử dụng vim và tôi có thể chia phiên thành ba hoặc bốn luồng, vì vậy tôi chỉ có thể thực sự xem một vài dòng bất kỳ lúc nào.

Điều đó nói rằng, tôi không bao giờ thực sự ấm áp với hội nghị, mặc dù nó sẽ cứu thịt xông khói của tôi nhiều hơn một lần. Tôi chỉ xem đó là tiếng ồn. Nếu các vòng lặp hoặc điều kiện của bạn đang trở nên lớn như vậy, yeah, bạn có thể muốn xem xét tái cấu trúc.


0

về cơ bản bạn đưa ra tất cả các lý do hợp lệ tại sao không sử dụng điều này. Mỗi lập trình viên tốt nên áp dụng những. Vậy tại sao làm người sử dụng nó? Bởi vì họ đang làm sai và không biết tốt hơn.


Xin vui lòng giải thích các downvote. Tôi không chỉ phát minh ra câu trả lời này, nó bắt nguồn từ một trải nghiệm thực tế: đồng nghiệp của tôi, người ngồi một đôi chân bên cạnh tôi đã lập trình cho hơn 10 tai như thế và không biết tại sao điều này lại sai cho đến khi tôi giải thích cho anh ta .
stijn

Có thể nó đã được sử dụng trong một số sách giáo khoa để một nhóm người ra khỏi trường đại học bằng cách sử dụng nó? Nó có thể có một vị trí trong một văn bản giới thiệu. Cũng có giá trị hợp lý trong một bộ tiền xử lý, đặc biệt là trong # ifdef / endif bao gồm các vệ sĩ
Martin Beckett
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.