Có một phương pháp để phân biệt các ý kiến ​​thông tin từ mã nhận xét?


38

Trong suốt quá trình lập trình, bạn sẽ kết thúc với một số bình luận giải thích mã và một số bình luận đang xóa mã:

// A concise description 
const a = Boolean(obj);
//b = false;

Có một phương pháp tốt để nhanh chóng phân tích đó là cái nào?

Tôi đã chơi xung quanh với việc sử dụng 3 //** */để nhận xét mô tả.

Tôi cũng đã sử dụng plugin VSCode để làm nổi bật //TODO://FIXME:


2
Lưu ý ////** ... */nhận xét cũng được sử dụng bởi một số trình tạo tài liệu, như Doxygen hoặc JSDoc. Nếu bạn sử dụng chúng hoặc các công cụ tương tự, bạn không thể sử dụng loại bình luận đó cho các bình luận mô tả mà không có ý định là một phần của tài liệu.
Justin Time 2 Tái lập lại

1
Trong javascript, hầu hết các dòng mã có thể sẽ kết thúc bằng dấu chấm phẩy. Trừ khi ý kiến ​​của bạn làm, điều đó có vẻ khá đơn giản và bạn có thể viết một kịch bản để kiểm tra điều đó một cách dễ dàng;
Artemis Fowl

Câu trả lời:


189

Có một giải pháp rất đơn giản cho việc này: xóa mã nhận xét.

Thực sự, chỉ có hai lý do tốt để nhận xét mã: để kiểm tra một cái gì đó / thực hiện sửa lỗi hoặc để lưu mã bạn có thể sử dụng sau này. Nếu bạn đang kiểm tra hoặc sửa lỗi gì đó, hãy xóa mã nhận xét ngay khi bạn hoàn thành kiểm tra hoặc sửa lỗi. Nếu bạn đang lưu mã bạn có thể sử dụng sau này, hãy tạo mã hạng nhất và đặt mã ở đâu đó như thư viện nơi có thể sử dụng mã này.


108
Ngoài ra, nếu mã đã được kiểm tra: chỉ cần loại bỏ nó. Nếu bạn cần nó trở lại, kiểm soát nguồn đã giúp bạn được bảo hiểm
marstato

38
Khi mã được gỡ bỏ, không ai nhận thấy nó tồn tại. Điều đó làm cho nó khó phục hồi hơn. Có giá trị trong việc để lại mã nhận xét, đặc biệt nếu có vẻ như nó sẽ được sử dụng trong tương lai.
usr

76
@usr: Khi mã được xóa, không ai nhận thấy nó tồn tại - và theo kinh nghiệm của tôi, trong 99% tất cả các trường hợp trong thế giới thực là điều đúng đắn. Trong 1%, có thể có một số giá trị trong các dòng bị lỗi, tuy nhiên, nếu mã nhận xét tồn tại trong vài tuần hoặc vài tháng (hoặc lâu hơn), rất có thể nó sẽ không được biên dịch thêm nữa do cấu trúc lại của hoạt động dòng mã. Đối số "giá trị hữu ích cho việc sử dụng trong tương lai" thường được sử dụng như một lý do sai lầm của những người có vấn đề về cảm xúc khi loại bỏ mọi thứ ra khỏi cơ sở mã mà họ đã đầu tư vài giờ để suy nghĩ.
Doc Brown

21
Tôi không bao giờ cam kết mã nhận xét mà không có ý kiến ​​giải thích bổ sung. Có những tình huống hiếm hoi mà bạn có thể muốn mã trở lại trong thời gian tới, nhưng mỗi một trong số đó là đặc biệt và yêu cầu một lời giải thích cho các nhà phát triển trong tương lai (hoặc bạn trong tương lai). 90% ý kiến ​​của tôi là "Đã xóa vì dường như không được sử dụng. Xóa sau tháng 11 năm 2021 nếu không có vấn đề gì"
James Beninger

31
Đồng nghiệp của tôi đã từng đặt "Có mã ở đây đã làm X nhưng tôi đã xóa nó" khi chúng tôi xóa một số tính năng trong thời điểm hiện tại. Điều đó đã làm việc rất tốt; bạn biết rằng đó là trong lịch sử nguồn cho tập tin đó, nhưng nó không làm phiền bạn.
Erik

45

Thêm vào câu trả lời tuyệt vời của @ RobertHarvey Tôi tin rằng chỉ có một lý do chính đáng mà tôi từng gặp để lưu mã nhận xét vào kiểm soát nguồn, thậm chí tạm thời: trong trường hợp mã thay thế không rõ ràng không nên hoặc không thể sử dụng ngay bây giờ vì một số lý do . Thậm chí sau đó hầu hết các bình luận nên là lời giải thích, không phải là mã thay thế. Đây có thể là một lỗi hoặc một tính năng của ngôn ngữ chưa được coi là ổn định. Nó có thể trông giống như thế này:

# TODO: Replace with `foo = frobnicate(bar)` once <link.to/bug> is fixed
foo = [some complex workaround]

Trong trường hợp này, công việc đã được thực hiện, nhưng bạn chưa thể tận dụng nó, vì vậy xóa nó có nghĩa là ai đó sẽ phải khám phá lại nó sau. Điều tương tự cũng xảy ra đối với các giải pháp tối ưu có vẻ vượt trội khi đối mặt với nó hoặc đánh đổi có ý thức đối với các giải pháp tương tự .

Thận trọng: Không xả rác mã của bạn với các giải pháp thay thế. Mọi nhiệm vụ có thể được thực hiện theo vô số cách khác nhau và không hiệu quả về chi phí khi khám phá không gian này trong một thời gian dài cho mỗi thay đổi. Đánh giá mã có thể là một nơi tốt để khám phá những bình luận bị thiếu như vậy, khi đồng nghiệp của bạn đề xuất một cải tiến mà bạn đã phát hiện ra là tối ưu.


2
Mặt trái của điều này là đôi khi bạn cần giải thích lý do tại sao bạn không sử dụng frobnicate(bar), để không ai đi cùng và cố gắng "sửa" mã "không phù hợp" của bạn. Vì vậy, bạn cho họ thấy rằng bạn biết rằng trong một thế giới hoàn hảo, frobnicatechức năng sẽ là hướng đi, nhưng bạn biết từ kinh nghiệm đau đớn, nó không hoạt động chính xác. Có thể không có bất kỳ mong đợi nào mà bên thứ ba thậm chí coi đó là một lỗi, ít đáng để sửa chữa hơn; bạn vẫn cần để lại nhận xét cho các lập trình viên tương lai (bao gồm cả chính bạn) về lý do tại sao bạn không thực hiện phương pháp rõ ràng.
Monty Harder

3
Một tình huống liên quan là có thể có hai cách để làm một cái gì đó, một trong số đó sẽ xử lý dữ liệu hợp lệ nhanh hơn nhiều so với cách khác và một trong số đó sẽ cung cấp chẩn đoán hữu ích hơn nếu vì lý do nào đó, nó nhận được dữ liệu không hợp lệ. Nếu chương trình là một phần của quy trình chỉ cung cấp dữ liệu "được bảo đảm" là hợp lệ, nhưng có gì đó trong quy trình không hoạt động đúng, có sẵn phiên bản chậm hơn, nhưng cung cấp chẩn đoán tốt hơn, có thể làm cho nó dễ dàng hơn nhiều để xác định những gì sẽ sai.
supercat

20

Hmm, tôi đọc câu hỏi này hơi khác với Robert, người khẳng định chính xác rằng mã nhận xét nên được loại bỏ.

Tuy nhiên, nếu bạn đang tìm kiếm một quy ước để đánh dấu mã để loại bỏ sau này, một mục yêu thích cũ của tôi là:

//b = false; //TODO: remove

Một số //TODO:ý kiến cờ của IDE hoặc có thể được dạy. Nếu không, nó thường là một chuỗi có thể tìm kiếm. Tốt nhất là tuân theo bất kỳ quy ước nào mà cửa hàng của bạn đã thiết lập vì điều này có thể được thực hiện theo nhiều cách. Mỗi cơ sở mã nên làm theo cách này. Giữ cho nó có thể tìm kiếm.

nhanh chóng phân tích cái nào?

Không có đánh dấu, cách tự động để làm điều này là với trình biên dịch. Nếu tước nhận xét tắt sẽ tạo ra mã biên dịch, nó phải là mã nhận xét. Viết một plugin IDE kiểm tra sẽ không khó. Nhưng nó sẽ để lại lỗi nhận xét mã phía sau.

Đây là lý do tại sao tốt hơn là chỉ cần đánh dấu mã nhận xét là mã ngay khi bạn nhận xét. Điều này cho phép bạn làm việc không phá hủy trong khi bạn quyết định nếu bạn thực sự muốn nó đi. Vì tất cả chúng ta đều bị gián đoạn và có phần hay quên, đừng ngạc nhiên nếu một số dòng được kiểm tra khi ở trạng thái đó. Nếu họ làm tốt thì ít nhất họ cũng được đánh dấu rõ ràng và có thể tìm kiếm. Các macro bàn phím đã giúp tôi với điều này trong quá khứ. Thật khó để bị gián đoạn ở giữa điều này nếu bạn có thể làm điều đó với một lần nhấn phím.

Bạn có thể đạt được điều này khi ghi dấu trong các bài kiểm tra tích hợp liên tục của bạn. Rất tiếc, tôi đang cố gắng đăng ký lại với TODO xuất sắc.


Thay vì xem các bình luận biên dịch để gắn nhãn chúng thành mã, bạn có thể chạy các bình luận thông qua bộ xử lý ngôn ngữ tự nhiên và gắn nhãn các bình luận phân tích thành một câu hoặc cụm danh từ trong ngôn ngữ mà nhóm của bạn nói.
TheHansinator

3
@TheHansinator nghe có vẻ hay nhưng trải nghiệm của tôi với điện thoại di động tự động quan hệ chính xác với biệt ngữ coder của tôi khiến tôi phải thận trọng.
candied_orange

Tôi tưởng tượng rằng NLP được sử dụng để phân tích các nhận xét mã sẽ tốt hơn rất nhiều so với NLP có khả năng tự động sửa lỗi, đơn giản vì máy tính có toàn bộ câu để làm việc và không cố sửa lỗi chính tả. Không đề cập đến việc phủ định sai cũng tốt hơn ở đây - miễn là con người có thể xem lại bình luận trước khi xóa, họ chỉ có thể viết lại bình luận, trái ngược với việc không được cảnh báo về gobbledygook vô dụng.
TheHansinator

3
phân tích cú pháp: double buffer (flip on)-> Nguyên mẫu C hoặc tiếng Anh cực kỳ ngắn? không thể nói mà không có ngữ cảnh, không phải là một cấu trúc chính xác trong cả hai ngôn ngữ. Một số mặt tích cực và tiêu cực sai là không thể tránh khỏi, khi các bình luận theo bản chất của chúng không hạn chế hình thức nội dung của chúng theo một trong hai hướng.
Leushenko

8

Tôi sử dụng các chỉ thị tiền xử lý để loại bỏ mã, không bình luận gì cả:

//comment
active_code();
#if FALSE
inactive_code();
#endif

Điều này làm cho một điều rất dễ tìm kiếm, và cú pháp của tôi highlighter coi nó như một bình luận. Tôi thậm chí có thể thu gọn nó thành một dòng duy nhất:#if FALSE(...)

Bạn có thể mở rộng ý tưởng đó để có một số tùy chọn:

#if OPTION == 0
code_for_option_0();
#elif OPTION == 1
code_for_option_1();
#else
code_for_all_other_options();
#endif

Và kiểm tra lỗi thời gian biên dịch:

#if FOO >= 5
#error FOO should be less than 5!
#endif

Tất nhiên, bạn không muốn quá nhiệt tình với điều này, hoặc trở nên khó khăn để nói những gì thực sự được biên dịch và những gì không. Nhưng bạn hiểu ý tưởng và đó cũng là vấn đề tương tự như đối với mã nhận xét ... miễn là bạn chỉ sử dụng nó một cách tĩnh. Nếu điều kiện của bạn là năng động, nó tồi tệ hơn.


Để xác định cái nào trong một cơ sở mã hiện tại không xem xét vấn đề này, tôi không nghĩ có một giải pháp phổ quát. Bạn sẽ phải tự tìm mẫu và có thể viết mã regex để tìm chúng.


Điều gì trên thế giới này sẽ tốt cho? Bạn có cần biên dịch nhiều phiên bản không?
Tvde1

@ Tvde1 Đó là một khả năng và là cơn ác mộng tiềm tàng nếu bạn không quản lý nó thực sự tốt. Nhưng sự thay thế có thể tồi tệ hơn. Nếu bạn có nhiều bản sao của gần như cùng một mã, một bản sao cho mỗi biến thể trên một chủ đề chung, thì bạn phải duy trì chúng một cách riêng biệt và giữ chúng đồng bộ.
AaronD

Có một số cách để làm điều này, nhưng tất cả chúng đều có một số biến thể của vấn đề cấu hình phức tạp hoặc vấn đề sao chép độc lập: Bạn có chắc chắn rằng một lỗi đã xảy ra với tất cả các bản sao độc lập không? Điều gì nếu không, và một tính năng khác được thêm vào, sau đó bị phá vỡ bởi lỗi đã được biết trước tính năng nhưng không được chuyển cho đến bây giờ?
AaronD

3
Điều đó chỉ hoạt động nếu bạn một bước xử lý trước như C. Câu hỏi là về javascript. Bạn có thể thực hiện một số xử lý trước nhưng nó sẽ mở rộng khả năng của hệ thống xây dựng và nó cũng không chuẩn. Nếu bạn không có hệ thống xây dựng hoặc hệ thống xây dựng hoàn toàn không hỗ trợ phân tích cú pháp và thực thi mã, bạn sẽ không thể thực hiện giải pháp này. Cuối cùng, nó thậm chí không giải quyết được câu hỏi - mã nhận xét không hoàn toàn tương đương với mã được kích hoạt có điều kiện. Nó có thể là một phần còn lại không có nghĩa là được kích hoạt.
VLAZ

Kích hoạt có điều kiện chỉ là một phần mở rộng của câu trả lời và không phải là câu trả lời. Nếu không, tôi sẽ chỉnh sửa nó để bao gồm các ý kiến ​​mở rộng hơn nữa.
AaronD

4

Tôi đồng ý với câu trả lời nói rằng nên xóa mã cũ thay vì nhận xét nếu có thể, tuy nhiên tôi đã quan sát một quy ước cho một vài lần khi cần mã nhận xét.

(Cơ sở của tôi là C # nhưng điều này có thể được áp dụng cho bất kỳ ngôn ngữ cú pháp C nào, ví dụ java)

// An explanatory comment has a space between the comment marker and the content.

// The following lines are commented out code so do not have the space (except where indented).
//var a = something();
//if(a==2) {
//   doSomethingElse();
//}

2
Điều này phụ thuộc hoàn toàn vào kiểu dáng: Khi tôi nhận xét mã, tôi thường thêm //cột vào cột đầu tiên và vì hầu như tất cả mã đều được thụt lề, kết quả hầu như luôn luôn là nhận xét bắt đầu bằng một số tab. Những bình luận bình thường không nhận được một không gian hàng đầu từ tôi, trừ khi đã có những bình luận khác với một không gian hàng đầu trong vùng lân cận. Vì vậy, phương pháp của bạn sẽ thất bại một cách sâu sắc đối với các bình luận mà tôi đã tạo ra và bất kỳ phương pháp nào được thiết kế để nhận ra các mẫu nhận xét của tôi sẽ thất bại về mặt nhận xét của bạn.
cmaster

@cmaster Ah tôi hiểu rồi, tôi nghĩ mình đã hiểu nhầm câu hỏi. Tôi đã cung cấp một cách đơn giản để định dạng các nhận xét theo cách mà chúng có thể dễ dàng phân tích cú pháp cho loại, đó không phải là những gì được yêu cầu.
IanF1

2

Tôi đang giải thích câu hỏi khác nhau, nghĩ rằng bạn muốn tìm mã nhận xét.

Mã kiểu C buộc phải có dấu chấm phẩy trong đó trong khi nhận xét không có khả năng có dấu chấm phẩy trong đó. Vì vậy, đối với mã nhận xét dòng đơn, bạn có thể sử dụng biểu thức chính quy này:

\s*\/\/[\s\S]*;

Đối với mã nhận xét nhiều dòng, nó có thể là

\/\*[^\;]*;[^\;]*\*\/

Lưu ý Visual Studio là một chút đặc biệt về ngắt dòng trong các biểu thức thông thường, chúng không được tính là khoảng trắng, bạn cần chỉ định một \ n rõ ràng.


2

Nếu bạn sử dụng trình chỉnh sửa với trình biên dịch chạy trong nền (như Xcode và Clang), bạn chỉ có thể cố gắng biên dịch văn bản của nhận xét. Ví dụ, một mô tả ngắn gọn, đưa ra các lỗi, lỗi b = false; không có. Sau đó bạn có thể sử dụng tô sáng cú pháp khác nhau.

Một phương pháp đơn giản hơn sẽ là một plugin IDE sử dụng một số phương pháp phỏng đoán, như nhiều từ trong một hàng khác với từ khóa trỏ đến nhận xét, khớp điểm được uốn cong với mã, v.v.


1

Các câu trả lời khác có các biến thể về chủ đề "không bình luận ra mã". Nhưng đôi khi bạn vẫn muốn nó xung quanh để tham khảo.

Nếu bạn thực sự cần mã để ở xung quanh, một giải pháp tốt hơn là bao quanh mã với "#if 0 ... #endif", lý tưởng là có một nhận xét để nói lý do tại sao. Đây là chiến lược được đề xuất từ ​​các tiêu chuẩn mã hóa khác nhau, bao gồm MISRA.


-3

Đơn giản, ít nhất là đối với tôi - và trong C / C ++. Nhận xét kèm theo trong / * * / là thông tin. Mã kiểm tra tạm thời bị xóa được nhận xét với hàng đầu //.

Và có lý do chính đáng để để lại mã kiểm tra trong tệp nhưng nhận xét, ít nhất là trong loại công việc tôi làm. Sớm hay muộn ai đó sẽ muốn một thay đổi được thực hiện, sẽ cần mã đó. Bỏ ghi chú một khối sẽ có một lệnh biên tập, cũng như nhận xét lại nó khi bạn hoàn thành.


Ngoài ra còn có #ifdef __DEBUG ... #endif, hoặc bất kỳ định nghĩa tùy chỉnh nào bạn muốn sử dụng. __DEBUGmặc dù là tốt, bởi vì bạn thường chỉ phải thay đổi cấu hình dự án để có được nó. Nhưng hầu hết các IDE đều cho phép bạn xác định cấu hình của riêng mình, điều này có thể cung cấp cho bạn mọi thứ ở vị trí đó.
AaronD

Bạn có ý nghĩa gì bởi mã thử nghiệm của Viking? Bài kiểm tra đơn vị? Những người không nên bình luận gì cả nhưng được giữ trong bộ kiểm tra và chạy thường xuyên nhất có thể, bất kể ai đó nghĩ rằng điều đó là cần thiết. Chắc chắn, thật dễ dàng để bình luận lại một đoạn mã, nhưng thậm chí còn không dễ dàng hơn để không làm gì cả và đã có bộ thử nghiệm sẵn sàng để thực hiện nó ...
leftaroundabout

1
Argh, đừng làm vậy. Nhận xét mã "để kiểm tra một cái gì đó" sẽ hoạt động hoàn toàn tốt 99 trên 100 lần ... và trong trường hợp duy nhất bạn sẽ quên xóa nó (nếu không còn cần thiết) hoặc - thậm chí tệ hơn - quên không ghi chú nó ( nếu cần thiết) và mọi thứ có thể trở nên xấu xí.
CharonX

@leftaroundabout: Không, ý tôi là những thứ như câu lệnh printf được đưa vào để kiểm tra giá trị.
jamesqf

@jamesqf bạn không bao giờ cần loại công cụ đó, đó là những gì một trình gỡ lỗi có sẵn cho. Nhưng ngay cả khi bạn sử dụng printf/ couthoặc tương tự để có được mã mới được viết (điều mà tôi thừa nhận tôi đã tự làm trong quá khứ), thực sự không hiệu quả lắm khi để chúng ở đó. Nếu ai đó muốn thực hiện thay đổi và biết họ cần thông tin về biến nào, thì việc viết printflại một cách nhanh chóng và dễ dàng , trong khi nếu nhà phát triển đó không biết những gì cần thiết và chỉ bỏ qua tất cả các printftuyên bố đó thì sẽ có rất nhiều văn bản. thiết bị đầu cuối có thể sẽ không giúp họ.
rời khỏ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.