lập trình không có comment thì sao ?

lập trình không có comment thì sao ?

Lời bàn của phpcoban :)

quan điểm của mình đọc comment phải hiểu được hàm đó dùng làm gì, đầu vào cấu trúc thế nào, đầu ra trả ra thế nào. Còn không có comment người khác vào support khổ không thể tả. Hồi xưa fix 1 function hơn nghìn dòng code và không có comment. Gần như phát điên và tuyên bố tìm lại nghiệp vụ code lại cả đống còn nhanh hơn ngồi sửa :(((

Lời bàn của Vinacode:

Ngày xưa lúc đi học thấy tụi bạn đồn nhau là các tay lập trình viên của Microsoft chuyên nghiệp lắm, anh nào cứ 4 dòng code mà không bổ sung một dòng comment thì sẽ bị đuổi việc. Lúc đó mình cũng tưởng thật, ngồi gật gù tâm đắc, cứ nghĩ người Mỹ làm ăn chuyên nghiệp có khác. Nếu đúng tỉ lệ đó, với sản phẩm Windows có hàng triệu dòng code thì 1/4 trong số đó là các dòng comment, và khi mấy tay developer chẳng may bị Bill Gates đuổi việc có khi chuyển qua làm nhà văn được cũng nên?

Cầu Dừa Đủ Xoài

Chuyện comment trong code cũng gây khá nhiều tranh cãi, anh thì bảo không cần, anh thì bảo càng nhiều càng tốt. Nhưng theo mình nghĩ không chỉ chuyện comment mà trong cuộc sống cũng vậy, cái gì “quá” cũng không ổn, khổ quá cũng không được mà sướng quá cũng không xong; bởi vậy người miền Nam thường cầu khấn rất hay là “cầu vừa đủ xài” (và mua Mãng Cầu, Dừa, Đu Đủ, Xoài về thắp nhang). :)

Trước khi đi vào bài viết sau đây của Jeff Atwood bàn về việc khi nào nên comment trong code và bao nhiêu là đủ, thì mình cũng tranh thủ hỏi bạn một câu là “Bạn đã gặp câu comment trong code nào mà cảm thấy buồn cười nhất?”. Trong bài viết dưới, nếu bạn để ý thì thấy tay developer “cao thủ” nào đó còn ghi cả nhóm máu, màu mắt, tên cô bồ nhí và cả tên mẹ cô bồ nhí… vào trong đó nữa. Hôm trước lang thang trên mạng bắt gặp câu comment code này cười muốn bể bụng:

1
2
// Khi tôi viết dòng comment này, chỉ có Chúa và tôi mới hiểu cái mà tôi đang làm
// Giờ đây, chỉ có Chúa mới biết

Nếu việc gieo rắc vào code của bạn với nhiều comment là tốt, thì việc có vô số comment trong code của bạn sẽ là rất tuyệt vời, đúng không nào? Nhưng điều đó hoàn toàn không đúng. Vượt quá giới hạn là một cách để những comment tốt trở nên tồi:

Chúng ta phải viết comment trong code sao cho hiệu quả nhỉ?Chúng ta phải viết comment trong code sao cho hiệu quả nhỉ?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
'*************************************************
' Name: CopyString
'
' Purpose: This routine copies a string from the source
' string (source) to the target string (target).
'
' Algorithm: It gets the length of "source" and then copies each
' character, one at a time, into "target". It uses
' the loop index as an array index into both "source"
' and "target" and increments the loop/array index
' after each character is copied.
'
' Inputs: input The string to be copied
'
' Outputs: output The string to receive the copy of "input"
'
' Interface Assumptions: None
'
' Modification History: None
'
' Author: Dwight K. Coder
' Date Created: 10/1/04
' Phone: (555) 222-2255
' SSN: 111-22-3333
' Eye Color: Green
' Maiden Name: None
' Blood Type: AB-
' Mother's Maiden Name: None
' Favorite Car: Pontiac Aztek
' Personalized License Plate: "Tek-ie"
'*************************************************

Tôi luôn luôn bắt gặp những comment từ những lập trình viên mà dường như họ không hiểu rằng đoạn code đó đã thực sự nói với chúng ta nó làm việc như thế nào rồi; chúng ta cần comment để nói về tại sao nó lại làm việc như vậy. Comment trong code cũng thường bị hiểu sai và lạm dụng một cách tràn lan đến nỗi đôi khi bạn cũng tự hỏi rằng liệu có đáng để sử dụng comment chút nào không nhỉ? Nhưng hãy cẩn thận với mong ước đó của bạn. Đây là một đoạn code mà không có bất kỳ chút comment nào:

1
2
3
4
5
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

Bạn có bất kỳ ý nghĩ nào về điều mà đoạn code đó làm không? Nó thì hoàn toàn dễ đọc, nhưng nó đang làm cái quái gì thế?

Hãy bổ sung thêm một dòng comment nhé.

1
2
3
4
5
6
// square root of n with Newton-Raphson approximation
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
System.out.println( "r = " + r );

Đó có phải là điều mà tôi đang tìm kiếm, đúng không nào? Có một chút dễ chịu hơn, và đã tiến tới điểm giữa của con đường thỏa hiệp giữa hai thái cực là không có comment chút nào cả và có một comment tràng giang đại hải sau mỗi 2 dòng code?

Không chính xác là vậy. Thay vì bổ sung thêm một comment, thì tôi thích sửa nó lại thế này hơn:

1
2
3
4
5
6
7
8
private double SquareRootApproximation(n) {
r = n / 2;
while ( abs( r - (n/r) ) > t ) {
r = 0.5 * ( r + (n/r) );
}
return r;
}
System.out.println( "r = " + SquareRootApproximation(r) );

Tôi đã không bổ sung thêm bất kỳ một dòng comment nào, và bây giờ thì đoạn code khó hiểu đó đã hoàn toàn rõ như ban ngày.

Trong khi các comment vốn đã hoặc là tốt hoặc là tồi, chúng thường xuyên được sử dụng như một vật chống đỡ. Bạn nên luôn luôn viết code như thể là các dòng comment không tồn tại vậy.Điều này ép buộc bạn phải viết code của mình sao cho đơn giản nhất, rõ ràng nhất, và hầu như phần code đó tự bản thân nó đã nói lên chức năng của nó làm gì rồi.

Khi bạn đã rewritten, refactored, và rearchitected phần code của mình hàng tá lần để khiến cho nó trở nên dễ dàng cho các lập trình viên đồng nghiệp của bạn có thể đọc và hiểu được — khi bạn không thể tưởng tượng ra bất kỳ cách nào để code của bạn có thể trở nên rõ ràng và dễ hiểu hơn — thì, và chỉ khi đó, bạn mới cảm thấy vạn bất đắc dĩ bổ sung thêm một comment để giải thích điều mà đoạn code đó làm.

Như Steve đã chỉ ra rằng, đây là một điểm khác biệt chính giữa lập trình viên junior and senior:

Ngày xưa, việc phải nhìn quá nhiều code một lúc thường vượt quá điểm ngưỡng chịu đựng về sự phức tạp của tôi, và khi tôi phải làm việc cùng nó thì tôi thường cố gắng rewrite nó hoặc ít ra thì tôi viết comment rất nhiều. Tuy nhiên, ngày nay tôi chỉ làm việc say mê qua nó mà không than phiền (nhiều). Khi tôi đã có một mục tiêu xác định trong tâm trí và một mẩu code phức tạp để viết, tôi dành thời gian của mình để làm nó hơn là cứ ngồi kể câu chuyện của mình về nó [bằng các comment].

Các lập trình viên junior dựa vào các comment để nói lên câu chuyện khi mà họ nên dựa vào codeđể nói lên câu chuyện đó. Các comment mang tính tường thuật; quan trọng theo cách của riêng chúng, nhưng không có cách nào có thể thay thế cốt truyện, đặc tính và các thiết lập được cả.

Có lẽ đó là một bí mật hơi bẩn thỉu của các comment trong code: để viết các comment tốt thì bạn phải là một tay viết tốt. Các comment không phải là code dành cho trình biên dịch, chúng là những từ để truyền đạt các ý tưởng với những người khác. Trong khi tôi (hầu như) rất yêu quý những đồng nghiệp lập trình viên của mình, nhưng tôi không thể nói rằng việc truyền đạt hiệu quả với người khác là thế mạnh của chúng ta. Tôi đã từng nhìn thấy những bức email dài tới 3 đoạn từ những lập trình viên trong nhóm của mình mà khiến tôi cảm thấy não mình tan chảy. Liệu đây có phải là những người mà chúng ta đang tin tưởng sẽ viết ra những dòng comment rõ ràng và dễ hiểu trong code của mình? Tôi nghĩ rằng có thể một số người trong chúng ta phải trở nên gắn chặt với điểm mạnh của mình hơn — đó là, viết cho trình biên dịch theo một cách rõ ràng nhất mà chúng ta có thể làm, và chỉ sử dụng comment khi đó là phương án cuối cùng.

Việc viết những comment tốt và có ý nghĩa thường rất khó. Nó cũng khó như là nghệ thuật viết code vậy; thậm chí còn khó hơn là đằng khác. Như Sammy Larbi đã nói trong bài Common Excuses Used To Comment Code rằng: nếu bạn cảm thấy code của bạn quá phức tạp để có thể hiểu màkhông có comment đi kèm, thì code của bạn có thể rất tồi. Hãy viết lại nó cho tới khi không cần chút comment nào nữa. Nếu bạn đã hoàn thành xong nỗ lực đó, nhưng bạn vẫn cảm thấy các comment là cần thiết, thì hãy bổ sung thêm các comment. Nhưng thật cẩn trọng.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">