Mã tài liệu tự Vs. Mã nhận xét


22

Tôi đã có một tìm kiếm nhưng không tìm thấy những gì tôi đang tìm kiếm, xin vui lòng liên kết với tôi nếu câu hỏi này đã được hỏi.

Đầu tháng này, bài viết này đã được thực hiện:

http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/

Về cơ bản để tóm tắt, bạn là một lập trình viên tồi nếu bạn không viết bình luận. Ý kiến ​​cá nhân của tôi là mã phải được mô tả và chủ yếu không yêu cầu bình luận trừ khi mã không thể tự mô tả.

Trong ví dụ đã cho

// Get the extension off the image filename  
$pieces = explode('.', $image_name);  
$extension = array_pop($pieces);  

Tác giả cho biết mã này nên được đưa ra một nhận xét, ý kiến ​​cá nhân của tôi là mã nên là một lệnh gọi mô tả:

$extension = GetFileExtension($image_filename);

Tuy nhiên, trong các ý kiến ​​ai đó thực sự đưa ra gợi ý đó:

http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/comment-page-2/#comment-357130

Tác giả đã trả lời bằng cách nói rằng người bình luận là "một trong những người đó", tức là một lập trình viên tồi.

Mọi người đều có quan điểm gì về Mã tự mô tả so với Mã nhận xét?


1
@ Péter - Tôi đã xem cái đó nhưng tôi muốn lấy ý kiến ​​cá nhân giữa hai người hơn là xác định nhận xét có phải là mùi mã hay không.
Phill

2
Tôi thấy bài báo đó .... thật kinh khủng khi đọc. Rất xúc phạm.
Sevenseacat

@Karpie - Tôi đã làm :(
Phill

3
"Tại sao bạn là một lập trình viên PHP tồi" Trả lời: Bởi vì bạn đang lập trình trong PHP.
Thomas Eding

Phương pháp ưa thích của bạn về cơ bản là sử dụng các lệnh gọi hàm để nhận xét mã của bạn. Tại sao không sử dụng ý kiến ​​cho điều đó? Các chức năng chỉ nên được sử dụng cho mã có thể tái sử dụng. Cá nhân tôi ghét phải tuân theo mã của người khác được viết theo cách này vì lý do tương tự tuyên bố GOTO là xấu - Nó tạo ra mã spaghetti. Điều này được cải thiện bởi các IDE hiện đại, nhưng không phải mọi ngôn ngữ và lập trình viên đều có thể sử dụng các IDE này và nó vẫn mất phương hướng. Thành thật mà nói, tôi đồng ý rằng bạn nên bình luận các phần mã không rõ ràng trong nháy mắt - nó chỉ giúp việc đọc qua mã của bạn trở nên nhanh chóng và dễ dàng hơn rất nhiều.
dallin

Câu trả lời:


46

Tôi thích viết mã tài liệu tự. Hướng dẫn cho việc này là Clean Code .

Tất nhiên điều này không có nghĩa là người ta không bao giờ nên sử dụng bình luận - họ có vai trò của họ, nhưng IMHO bạn nên sử dụng chúng một cách cẩn thận. Câu trả lời trước đó của tôi về SO giải thích suy nghĩ của tôi về chủ đề này chi tiết hơn.

Tất nhiên, như @Niphra lưu ý, luôn đáng để kiểm tra lại rằng những gì tôi tin là sạch sẽ thực sự dễ hiểu bởi những người khác. Tuy nhiên, đây là một câu hỏi thực hành quá. Quay trở lại uni tôi đã viết các đoạn mã khó hiểu chỉ đơn giản là do sử dụng các tên lạ và hài hước cho tất cả các thực thể mã, theo ý thích của tôi. Cho đến khi giáo viên của tôi rút lại một trong những bài tập của tôi, lưu ý một cách lịch sự rằng anh ta không thể tìm ra mô-đun nào là chính :-) Đó là một bài học tốt, vì vậy tôi đã cố gắng tập trung vào việc viết mã dễ đọc hơn kể từ đó. Ngày nay tôi hầu như không nhận được lời phàn nàn từ đồng đội.


Tôi thích cuốn sách đó :)
Phill

Tôi vẫn thấy những bình luận có giá trị để thể hiện chiến lược được sử dụng và những người bị từ chối (với lý do). Tôi đồng ý rằng các bình luận vi mô nói chung là vô dụng.
Matthieu M.

9
Một trong những trích dẫn yêu thích của tôi từ Clean Code là mọi bình luận đều thất bại trong việc thể hiện bản thân trong mã.
Doval

6
@Doval: Một triết lý thú vị, ít nhất là liên quan đến ý kiến ​​về những gì mã làm . Mặt khác, một số ý kiến ​​hữu ích nhất có thể là những lý do tại sao mã không làm gì đó - một khái niệm mà tôi không nghĩ rằng mã nên được thể hiện.
supercat

1
Không đồng ý hoàn toàn. Không có số lượng đặt tên sẽ mô tả đầy đủ mục đích của logic.
Hẻm núi Kolob

65

Bạn không nên ghi lại những gì mã đang làm, nhưng bạn nên ghi lại lý do tại sao nó làm điều đó.

Không có số lượng các thủ thuật đặt tên sẽ làm lộ ra các whys và wherefores, vì vậy bạn phải thêm ý kiến ​​để giải thích mục đích của các bit mã khác nhau.

Tất cả các ý kiến ​​khác có thể được thoát khỏi một cách an toàn.


3
+1 Ví dụ trong bài viết được liên kết có nội dung "đưa ra nhận xét trong mọi tình huống trong đó mục đích của mã tôi đã viết không rõ ràng ngay lập tức." - Thật đáng buồn khi tin rằng mã tự nó có thể truyền đạt mục đích , bởi vì bản thân máy móc không có khái niệm về mục đích. Ví dụ phản biện: Chúng tôi có lỗi trong hầu hết tất cả các phần mềm từng được viết, đây là một sự thật. Nếu một máy tính hiểu mục đích ( tại sao ), nó chỉ đơn giản sẽ từ chối làm bất cứ điều gì khác ngoài những gì chúng tôi dự định, thay vì mạnh dạn tái tạo lại những gì / khi / làm thế nào / dẫn đến lỗi.
David Meister

Tất cả các mã bên trong một hàm nên có để thực hiện mục đích của hàm, tức là nó làm gì, ví dụ viết một số văn bản vào một tệp, hàm "writeTo (Chuỗi văn bản, tệp tệp)". Nếu một số mã có mục đích khác, ví dụ: kiểm tra các điều kiện tiên quyết, như xác minh rằng tệp tồn tại VÀ nó không rõ ràng, thì có lẽ một ý tưởng tốt hơn một bình luận đang viết một chức năng mới, ví dụ: "checkWritable (Tệp tệp)". Chất lượng mã không phải là một danh sách kiểm tra giáo điều, nhưng nếu nó cần bình luận, đó là một dấu hiệu xấu và "cá nhân" không phải là lý do chính đáng để cần chúng. Tại sao con gà băng qua đường?
Trylks 24/07/2015

2
@Trylks Điều đó làm việc cho một số trường hợp nhưng không phải cho tất cả. Hãy tưởng tượng kịch bản này : for (int i = 0; i < length/2;i++) { //if length is odd, the middle element should stay in place. Bây giờ, đây không phải là một cái gì đó rõ ràng từ mục đích của chức năng kèm theo, cũng không thể được đưa vào chức năng của chính nó. Nếu bạn để nó không bị lỗi, điều đó rõ ràng là xấu. Vì vậy, bạn thêm một bình luận để làm rõ ý định của bạn.
biziclop 24/07/2015

2
@Trylks Bên cạnh đó, ngay cả khi chúng tôi lấy ví dụ của bạn, bạn tính đến việc kiểm tra của bạn thành một phương thức và gọi nó, thật tuyệt. Bây giờ tất cả bạn phải giải thích là tại sao bạn cần kiểm tra xem tập tin có thể ghi được không. :)
biziclop 24/07/2015

38

Tôi thực sự không tin vào mã tự mô tả. nhiều mã dễ đọc hơnmã dễ đọc hơn , tùy thuộc vào ngôn ngữ, kiến ​​thức của bạn về nó (với tư cách là tác giả gốc), kiến ​​thức của anh chàng đọc nó và chức năng mã. Nhưng không, vẫn ... nó nên được mô tả với một bình luận ngắn.

Điều rõ ràng với tôi bây giờ, rằng tôi đang ở trong khu vực suy nghĩ đó có thể sẽ không rõ ràng với tôi trong một năm, khi tôi nghĩ về điều gì đó hoàn toàn khác biệt và cần sử dụng lại phần mã này.

Vì vậy, nhận xét mã của bạn. Tất nhiên không phải tất cả các dòng (trời tốt, không), nhưng đặt một vài dòng nhận xét bên trên một hàm / chương trình con / mô-đun , hoặc một phần đặc biệt khó khăn và nói ngắn gọn về những gì nó làm. Bạn sẽ cảm ơn chính mình trong một hoặc hai năm.


Đã từng trải qua rồi. "Mã ít đọc hơn" nên được cải thiện thành mã đọc tốt. Kiến thức về ngôn ngữ không thực sự được tính: Khi không quen với cú pháp, bạn nên học nó trước tiên - thật lòng mà nói, đó là cơ sở để trở thành một chuyên gia. Cố gắng bù đắp mã khủng khiếp bằng cách thêm ý kiến ​​không phải là một ý tưởng tốt. Bình luận không bao giờ nên cố gắng để mô tả những gì mã làm. Một nhận xét (chung) chỉ hợp lý nếu bạn cần cho biết lý do và không phải là . Mọi thứ khác chỉ là tiếng ồn và những thứ bổ sung không cần thiết để duy trì.
Powerslave

Tái bút, tôi biết tôi hơi 'zombied' :) Xin lỗi vì điều đó
Powerslave

Để tránh nhầm lẫn, tôi đang nói về trường hợp thông thường, khi bạn không bị buộc phải viết mã xấu bởi các yêu cầu nghiệp vụ (ví dụ: hiệu suất đặc biệt hoặc phù hợp với lưu trữ hạn chế). Trong các trường hợp khác (hiếm), bạn không có lựa chọn nào khác ngoài việc để lại bình luận, phần nào giảm bớt gánh nặng của nạn nhân tiếp theo.
Powerslave

19

May mắn thay, cả hai phe trong cuộc thảo luận này được trình bày ở đây, và các đối số pro và con cho cả hai đã được đề cập.

Tôi tin rằng cả hai phe có những tranh luận chồng chéo, và thực sự đồng ý với hầu hết trong số họ, chỉ là cách làm thế nào để đạt được chúng là một chút khác nhau.

Đối số chồng chéo

  • Mã nên được đọc.
  • Nhận xét không nên nói chính xác điều tương tự như mã, nhưng cung cấp cái nhìn sâu sắc hơn khi cần thiết.
  • Tất cả các tên biến / hàm nên được suy nghĩ tốt để chúng thể hiện tốt những gì chúng đang / làm.
  • Mã trùng lặp nên được ngăn chặn.

Bây giờ, sự khác biệt chính là trọng lượng được đặt vào một số trong những đối số đó.

Mã tự mô tả

  • Nhận xét có thể bị lỗi thời, vì vậy giảm thiểu sử dụng chúng, vì nhận xét sai còn tệ hơn không có nhận xét.
  • Nhận xét là một bản sao của mã. Tất cả mọi thứ có thể được viết bằng mã, nên được viết bằng mã.

Thêm ý kiến

  • Nhận xét dễ đọc hơn mã. Tiếng Anh đơn giản là tốt hơn để mô tả một cái gì đó.

  • Mã đơn giản thường gây ra sự mơ hồ mà phải được bình luận bằng mọi cách. Cố gắng mô tả điều này trong mã, kết quả là tên quá dài. Hơn nữa, bạn liên tục phải đối mặt với thông tin 'thêm' này mà bạn chỉ cần lần đầu tiên bạn bắt gặp nó.

Tôi tin rằng cả hai trại đều có lý lẽ rất hợp lệ, nhưng bạn không nên điên cuồng theo dõi một trại, chỉ vì nó giải quyết được một vấn đề.

Để chứng minh, trong cuốn sách Clean Code , mã được chia thành nhiều phương thức nhỏ hơn chỉ được gọi một lần. Các phương thức được tạo ra vì lý do duy nhất để ghi lại mã (và TDD dễ dàng hơn). Điều này dẫn đến chức năng Hell . Mã này ít đọc hơn ban đầu và trong khi tái cấu trúc, không có ý nghĩ nào được đưa ra để đóng gói mã có thể tái sử dụng.

Mặt khác, bạn thường thấy API nơi mọi chức năng được nhận xét, chỉ vì 'nhận xét là tốt'. Những điều đáng lẽ phải được bình luận vẫn không có.


1
@Steven - "Mặt khác, bạn thường thấy API là nơi mọi chức năng được nhận xét, chỉ vì 'nhận xét là tốt'. Những điều đáng lẽ phải được nhận xét vẫn không có." Ugh, thật là bực bội!
dss539

Đây là một câu trả lời rất tốt! Một điều, nếu bạn không phiền, về khả năng đọc bình luận: Cá nhân tôi không tin vào những bình luận dễ đọc hơn. Chúng tôi, với tư cách là nhà phát triển, thường nghĩ về mã nguồn, đặc biệt là khi ở "chế độ mã hóa". Trong những khoảnh khắc đó, sự mơ hồ của ngôn ngữ con người đơn giản thường gây mất tập trung hơn là giúp đỡ.
Powerslave

5

"Tôi xin lỗi nhưng anh chàng đó."

Tôi tự hỏi tại sao anh ấy không thích bình luận: P

Nghiêm túc mà nói, mã hóa là quá nhiều nghệ thuật mà người ta có thể thực sự đưa ra một tuyên bố sâu rộng như vậy. Đôi khi bạn cần bình luận, đôi khi nhiều chức năng được đặt tên tốt hơn. Thường là cả hai.

Tra cứu lập trình biết chữ như một phong cách cực đoan.


Vâng. Ý tôi là, nếu Donald Knuth nghĩ rằng bạn không chỉ cần bình luận, mà đôi khi cần các chương của họ, tôi sẽ nghĩ ít nhất hai lần trước khi không đồng ý.
Peter ALLenWebb

3

Câu trả lời ngắn gọn, tốt hơn và đúng

Ý tưởng rằng "mã tự viết" được viết tốt là tất cả những gì bạn cần là một mô hình chống và sẽ chết, ngay cả khi nó đưa ra ngoại lệ cho các bình luận giải thích "tại sao". Thật hoang đường khi bạn luôn có thể viết tất cả mã cho bất kỳ thuật toán nào đủ rõ ràng để bất kỳ lập trình viên nào lướt qua và lấy nó (hoặc nó sẽ không yêu cầu tái cấu trúc hoặc thời gian tổ chức mà bạn không có). Thậm chí quan trọng hơn, thường xuyên hơn không, các lập trình viên nghĩ rằng họ viết mã rõ ràng thì không.

Một câu trả lời tốt hơn nhiều so với các bình luận chỉ nên được sử dụng để giải thích "tại sao" là các bình luận nên:

  • giải thích "tại sao" (tất nhiên)
  • chỉ giải thích "cái gì" trên các dòng riêng lẻ khi mã phức tạp hoặc mục đích không rõ ràng và nó không thể hoặc không đáng để đơn giản hóa hơn nữa
  • giải thích "cái gì" cho các khối mã để tăng tốc độ hiểu và định vị những gì bạn cần

Giải thích để sao lưu

Mọi người lầm tưởng lý do duy nhất mọi người sử dụng các bình luận là để giải thích ý nghĩa của một dòng mã. Sự thật là một mục đích lớn của mã nhận xét là làm cho nó nhanh hơnđể lướt qua mã của bạn và tìm thấy những gì bạn đang tìm kiếm. Khi tôi quay lại mã sau hoặc đọc mã của người khác, chắc chắn, tôi có thể đọc và hiểu một phần của mã được viết tốt - nhưng không phải là nhanh hơn và dễ dàng hơn để đọc nhận xét ở đầu nói rằng phần mã đó làm gì và bỏ qua nó hoàn toàn nếu nó không phải là những gì tôi đang tìm kiếm? Tại sao lại ngồi đó và tìm ra mã, ngay cả khi nó được viết tốt, nếu bạn có thể lướt qua một vài bình luận và hiểu toàn bộ chức năng? Đó là lý do tại sao chúng tôi sử dụng tên mô tả cho các hàm - không ai nói rằng tôi không cần sử dụng tên mô tả cho chức năng của mình vì ai đó chỉ cần xem qua mã được viết sạch của tôi để xem nó làm gì.

Ví dụ: nếu tôi đang xem qua chức năng của người khác, việc đi từng dòng qua mã sẽ dễ dàng hơn để xem những gì nó đang làm hoặc lướt qua ba nhận xét được viết tốt trong suốt chức năng để xem chính xác chức năng đang làm gì và ở đâu nó đang làm à?

Một mô hình chống khác là việc lạm dụng các hàm để nhận xét mã của bạn. Các hàm được đặt tên tốt là một phần quan trọng của tài liệu mã, nhưng đôi khi các lập trình viên tách 2-3 dòng mã sẽ không bao giờ được sử dụng ở bất kỳ nơi nào khác thành hàm cho mục đích tài liệu. Tại sao lạm dụng chức năng bất kỳ tốt hơn so với lạm dụng bình luận? Sử dụng các hàm như thế cũng giống như chấp nhận các câu lệnh GOTO - nó tạo ra mã spaghetti có thể là một nỗi đau để làm theo.

Về cơ bản, khi bạn làm việc trong môi trường doanh nghiệp, nơi mọi người liên tục chia sẻ mã và mọi người không có thời gian để làm cho mã của họ hoàn hảo, một vài bình luận tốt có thể tiết kiệm hàng tấn thời gian và sự thất vọng. Và hãy nhớ rằng, trong khi bạn có thể là một bậc thầy có thể đọc mã với tốc độ ánh sáng, thì không phải ai trong văn phòng của bạn cũng vậy.


Tôi ghét nó khi mọi người downvote và thậm chí không để lại nhận xét tại sao. Bạn thậm chí đã đọc toàn bộ bài viết? Điều gì ở đó không đơn giản và đúng? Bạn không đồng ý với điều gì? Tôi cảm thấy như mọi người quá tập trung vào ý tưởng của họ hoặc những gì họ đọc mà họ thậm chí không nghĩ về nó và sẽ hạ thấp bất cứ điều gì ngay lập tức mà không chia sẻ quan điểm của họ.
dallin

3
Tôi cho rằng đó là vì bạn hoàn toàn từ chối và đặt tên cho một antipotype một cái gì đó gần như được công nhận là đúng. Tôi chắc chắn nghĩ rằng bạn đi quá xa. Hầu hết, tôi không thể tưởng tượng được những bình luận đáng tin cậy cũng như bạn dường như. Nếu bạn mù quáng đọc các bình luận và không phải mã, các bình luận có thể sai và lỗi thời, và bạn sẽ không bao giờ biết. Đó là cơ sở của việc sử dụng các chức năng như tài liệu. Tôi đồng ý rằng bạn không nên có quá nhiều chức năng ở một nơi, mặc dù giải pháp cho điều đó chắc chắn là không thay thế chúng bằng các bình luận.
Magus

@Magus Cảm ơn bạn đã bình luận. Tôi giả sử bạn đang đề cập đến việc tôi nói về việc sử dụng các chức năng làm tài liệu. Đọc lại rằng, tôi tin rằng tôi đã nói từ đó nghe kém như tôi có nghĩa là sử dụng các chức năng cho mục đích đó (trái ngược với việc sử dụng quá mức các chức năng cho mục đích đó) là xấu. Tôi đã dọn sạch đoạn đó để làm rõ ý định ban đầu của mình. Suy nghĩ của tôi về việc tin tưởng các bình luận là nếu một bình luận trở nên lỗi thời, đó thường là một dấu hiệu bạn đang bình luận quá hẹp về một phần của mã - rằng bạn đang bình luận thực hiện thay vì ý định.
dallin

but isn't it faster and easier to read the comment at the top saying what that section of code does and skip it altogether if it's not what I'm looking forNó được gọi là "tên của phương thức / hàm". Nếu bạn có một khối mã không có tên nhưng quá dài đến nỗi bạn không thể đưa nó vào trong nháy mắt, có thể vấn đề nằm ở đó.
biziclop

1
@biziclop Làm thêm giờ Tôi tin rằng lập luận này chủ yếu là ngữ nghĩa và trong thực tế, mã của chúng tôi sẽ trông giống nhau. Phải nói rằng, giả sử khối mã không được sử dụng ở nhiều nơi, tôi không thấy sự khác biệt giữa một khối mã với một nhận xét mô tả ngắn ở trên cùng và một khối mã có tên hàm mô tả ngắn ở hàng đầu. Chúng giống nhau, ngoại trừ một không có không gian. Họ có thể sai và lỗi thời. Sự khác biệt duy nhất tôi thực sự thấy là mã dễ đọc hơn với một nhận xét vì bạn không phải thực hiện theo lệnh gọi đến một vị trí riêng biệt.
dallin

2

Chà, bạn cũng phải nhớ một cái gì đó rõ ràng hoặc "tự ghi lại" cho bạn, có thể không phải là cho người khác ... Có thể ai đó ít hiểu biết về các chức năng nhất định. Vì vậy, tôi nhận xét về tất cả mọi thứ.


1
Bạn có thể đưa ra một ví dụ không. Tôi có nghĩa là đưa ra ví dụ trong câu hỏi ban đầu của tôi. "GetFileExtension" có ý nghĩa gì trong nhận xét "Nhận phần mở rộng tệp của một tệp đã cho"? Phương pháp này đã mô tả những gì nên đi vào bình luận. Nếu phương thức được đặt tên là "GetExtension" thì một bình luận sẽ giúp làm rõ phương thức đó là gì, vì phương thức này không tự giải thích được.
Phill

+1 Đây là một câu hỏi biết đối tượng của bạn. Ai có khả năng sử dụng chức năng này? Làm thế nào bạn có thể giúp họ? Sự giúp đỡ của bạn sẽ có giá trị gì? Có đáng giá hơn việc dành một chút thời gian bây giờ để thêm một bình luận?
V.v

2
@PeterAllenWebb: Không có điểm nào cho nhận xét đó cả. Điều đó không từ xa có nghĩa là chức năng không nên được nhận xét; nó nên "Phần mở rộng" có bao gồm dấu chấm hay không? Giá trị trả về là "foo"gì? ( null? "") Cho "foo."? Sẽ thông qua nullgây ra một ngoại lệ, hoặc chức năng sẽ trả lại một cái gì đó (có lẽ null)?
TJ Crowder

2

Chà, điều với mã tự ghi là trong hàm đó, bạn sẽ tìm thấy:

$pieces = explode('.', $image_name);  
$extension = array_pop($pieces);  

Điều này tự giải thích khi bạn có tên hàm vì nó chỉ có hai dòng. Khi mọi thứ trở nên phức tạp hơn, bạn phải bọc mỗi vài dòng mã trong một hàm bằng một tên mô tả hoặc sử dụng các nhận xét khi cần thiết .

Tôi không bao giờ hiểu tại sao nó nên là một hoặc / hoặc vật chất, thay vì và / và. Có, làm cho mã của bạn càng nhiều tài liệu càng tốt, và vâng, thêm một số nhận xét vào các phần mà nếu không thì không rõ ràng.


Vâng. Tôi nghĩ bạn phải được "đào tạo" để nghĩ rằng nó nên là cái này hay cái kia chứ không phải cả hai.
Peter ALLenWebb

2

Nhận xét và mã sạch tự ghi là khác nhau. Mã là tất cả về cách làm việc. Và các bình luận nên bao gồm phần lý do tại sao không thể giải thích bằng mã, bất kể ngôn ngữ của bạn là gì. Ngoài ra, nếu ngôn ngữ của bạn rất hạn chế và bạn không có hợp đồng, không có thông số kỹ thuật tĩnh và thậm chí không có xác nhận, các bình luận sẽ đề cập đến các vấn đề ranh giới của mã của bạn.


Giả sử có một lý do cho tất cả mọi thứ, nó nên được bình luận?
JeffO

Vâng, chính xác. Đó là lý do tại sao tôi tin rằng cách tốt nhất để nhận xét mã của bạn là lập trình biết chữ.
SK-logic

1

Trong trường hợp đó, thật dễ dàng để tạo một chức năng mô tả. Nhưng tôi đã đọc rất nhiều mã được tạo bởi các lập trình viên giỏi, những người tin rằng mã của họ là tự viết tài liệu, và những gì rõ ràng đối với họ thực sự khó hiểu với tôi.

$ extension = GetFileExtension ($ image_name);

Để lấy lại ví dụ của bạn, tôi có thể gửi một mảng tên hình ảnh cho nó không, hay nó chỉ lấy một hình ảnh? Nó có hỗ trợ bất kỳ loại tập tin, hoặc chỉ một số trong số họ? Nó sẽ bảo mật chuỗi cho tôi, hay tôi phải làm điều đó? Nếu loại tệp không tồn tại, nó có thông báo cho tôi không?

Tất nhiên, tôi kéo dài cái này một chút. Nhưng tôi nhớ một lập trình viên tin rằng audio_bandband và video_bandband là tên tự ghi; hóa ra âm thanh phải được thể hiện bằng byte và video tính bằng kilobyte. Mất rất nhiều thời gian để tìm ra điều đó.


5
Bạn đang kéo dài cái đó rất nhiều. Hàm được mở rộng tên tập tin. Không hơn không kém. Tên của nó cho biết nếu nó có một mảng hay không (rõ ràng là không). Tôi không thể nghĩ ra một phương pháp dựa vào loại tệp để có được phần mở rộng. Bảo mật chuỗi là thứ duy nhất có thể được kết hợp, nhưng tôi sẽ không bao giờ mong đợi nó bởi vì như bất kỳ nhà phát triển PHP nào cũng biết: tất cả đầu vào của người dùng đều bị nghi ngờ, vì vậy hãy bảo mật nó trước khi bạn sử dụng nó.
Matt Ellen

2
@Matt: The rõ ràng không phải là một dấu hiệu cho thấy bạn không thường xuyên bảo trì. Việc rõ ràng sẽ tiết kiệm được nhiều chi phí (và RTFSource) sau này và nó cũng ghi lại những gì tác giả ban đầu mong đợi nó sẽ làm. Cho dù đó là trong một bình luận hoặc trong một tên chức năng dài không quá quan trọng.
Donal Fellows

Có lẽ ví dụ này là một ví dụ tồi để sử dụng trong câu hỏi này, tôi đã không chạm vào PHP trong khoảng 7 năm, đã làm C # và một chút Java, vì vậy tôi đã quen với một IDE cho tôi biết loại được trả về hoặc khai báo các loại.
Phill

1
@Donal Fellows: nó nói tập tin, số ít. Mơ hồ về điều đó là gì? Nó hoàn toàn rõ ràng.
Matt Ellen

4
Thực tế là hiện có 7 phản hồi từ 4 người thảo luận về tính rõ ràng hoặc mặt khác của một cuộc gọi chức năng duy nhất gợi ý cho tôi rằng bạn cần sử dụng các bình luận . Nó cũng nhấn mạnh thực tế rằng việc đặt tên chính xác là một hình thức trong chính nó.
Kiến

1

Một cái không loại trừ cái kia. Mặc dù mã của bạn là tự nhận xét, nhưng đôi khi bạn có thể cần bình luận thường xuyên để giải thích lý do tại sao mã tự nhận xét của bạn làm những gì nó làm.


Tôi nghĩ rằng điều này rơi vào quan điểm của tôi đó là "mã nên được mô tả và chủ yếu không yêu cầu bình luận trừ khi mã không thể tự mô tả". Nếu bạn viết mã trong khi được viết tốt, không giải thích đầy đủ về cường độ của mã, thì các bình luận sẽ giúp làm cho mã trở nên mô tả hơn.
Phill

không bao giờ có thể giải thích mục đích của nó. Khi bạn nhìn thấy một cái búa, bạn không thể tìm ra nó dùng để làm gì - nó dùng để đập vỡ hộp sọ hay chỉ để rèn một chiếc bàn ủi thô.
SK-logic

1
@ SK-logic:public <T> void hit(T item);
Michael K

@Michael - chính xác. Làm thế nào người dùng sẽ tìm ra, những loại đối tượng có thể và nên được búa? Ngay cả với một hệ thống loại tốt hơn nhiều, nó không phải lúc nào cũng rõ ràng, phạm vi sử dụng có thể thực sự được lên kế hoạch bởi một nhà phát triển.
SK-logic

1

Tôi không đồng ý với bài viết đó và đồng ý với bạn ở một mức độ nào đó. Nếu bạn sử dụng tên phương thức tốt, tên biến tốt và phương thức nhỏ làm một việc duy nhất, mã sẽ đơn giản để làm theo.

Chỉ cần cố gắng không khéo léo vì mã thông minh là đọc và duy trì khủng khiếp. Từ khóa: duy trì !

Ý kiến ​​của tôi là ý kiến ​​nên mô tả lý do tại sao và không phải là những gì. Hãy nhớ trong thế giới hoàn hảo giả thuyết này, mã của bạn đủ sạch để cho phép dễ đọc, bạn không cần phải giải thích những gì nó đang làm, nhưng tại sao bạn lại chọn làm theo cách này hay cách khác.

Nếu bạn đang sử dụng hệ thống kiểm soát nguồn, bạn có thể sử dụng thông điệp cam kết để cho mọi người (và chính bạn) biết bạn đã làm gì tại một thời điểm nhất định và quan trọng hơn là tại sao.


1

Bạn sẽ muốn tránh viết bình luận giống như bạn muốn tránh bất kỳ tài liệu nào. Khi nói đến ngôn ngữ lập trình, mọi người đều vận hành từ cùng một bộ từ vựng và cú pháp (gần như).

Khi ứng dụng của bạn dành cho một tên miền cụ thể, có thể khó để mọi người tham gia đồng ý và / hoặc thiết lập một từ vựng chung. Chúng tôi được dạy để tránh viết tắt và biệt ngữ mở rộng, nhưng tôi sẽ gọi nó là

EBITDA

và không

EquityB BeforeInterestTaxesDepreciationAndAmortization

Nếu bạn không biết cái này, có lẽ bạn không hiểu cái kia. Nếu công ty có một số triển khai không phổ biến, một nhận xét sẽ giúp lập trình viên tiếp theo có thể có kinh nghiệm trong lĩnh vực này, nhưng không phải là công ty đặc biệt này (Điều này chỉ khiến mọi việc phức tạp hơn.).


1

Tôi nghĩ rằng chúng ta cần phân biệt giữa tài liệutính biểu cảm của mã.

Khi gỡ lỗi hoặc xem lại mã, bạn không đọc sách. Hầu hết thời gian bạn chỉ muốn chuyển từ phương pháp này sang phương pháp khác và thực hiện các kết nối nhanh chóng trong tâm trí của bạn để có được sự hiểu biết cơ bản về những gì đang diễn ra trong thời gian chạy. Đó không phải là tài liệu xung quanh mã mà là tính biểu cảm của chữ ký mã quan trọng trong quy trình đó, khả năng của chúng đủ ý nghĩa để bạn có thể xác định ngay lập tức và thêm chúng vào ngăn xếp cuộc gọi nội bộ của riêng bạn. Tại thời điểm đó, bộ não của chúng ta (ít nhất là của tôi hoạt động theo cách đó;)) có xu hướng coi các khối nhận xét lớn như một tiếng ồn hơn là một sự trợ giúp. Do đó, các nhận xét một dòng, hoặc thậm chí tốt hơn, chỉ cần phương thức tự mô tả và tên đối tượng là đủ ở đây.

Nếu bạn muốn "đọc sách" của một lớp hoặc tính năng cụ thể, một nơi tốt hơn nhiều cho điều đó là trong các bài kiểm tra đơn vị. Các bài kiểm tra đơn vị được thiết kế tốt về bản chất là tiết lộ ý định và nhiều tài liệu hơn (nghĩa là giải thích, chi tiết) so với các khối nhận xét dày nhất vì chúng chứa 1 / kỳ vọng về chính xác những gì mã này phải làm và 2 / khả năng kiểm tra những kỳ vọng chống lại mã thực sự. Một bài kiểm tra vượt qua đáng tin cậy hơn hàng trăm lần so với bất kỳ nhận xét nào về tài liệu, bởi vì nó chứng minh rằng những gì nó khẳng định là đúng.


1

Một số mã không phải là tài liệu tự, và yêu cầu một số lời bình luận từ một người đồng bào đã hiểu và kiểm tra đoạn đó. Những gì tôi có dưới đây chỉ là không đủ để hiểu nó, tôi nghĩ.

//
// iterative version
//
Node* ReverseList( Node ** List ) 
{

  Node *temp1 = *List;
  Node * temp2 = NULL;
  Node * temp3 = NULL;

  while ( temp1 )
  {
    *List = temp1; //set the head to last node 
    temp2= temp1->pNext; // save the next ptr in temp2
    temp1->pNext = temp3; // change next to privous
    temp3 = temp1;
    temp1 = temp2;
  }

  return *List;
}

1

Tôi thường thích viết mã tự viết tài liệu, với các bình luận không rõ ràng, vì tôi nghĩ rằng hầu hết các mã sẽ không hoàn toàn là tài liệu chính nó.


0

Tại trường đại học, chúng tôi được dạy cách viết lại khá nhiều dòng mã bằng tiếng Anh bằng một nhận xét (có lẽ chỉ để chúng ta có thói quen hiểu mã thực sự làm gì, thay vì chỉ sao chép / dán thứ gì đó và hy vọng điều tốt nhất).

Cá nhân, tôi cho rằng việc loại bỏ mã của bạn ra khỏi mã của bạn, làm cho nó ít đọc hơn nếu đó chỉ là nhận xét hoặc chỉ là mã. Tôi là một lập trình viên C # và những bình luận duy nhất tôi đưa ra mọi lúc là các khối nhận xét "ba dấu gạch chéo" được diễn giải trở lại tài liệu IntelliSense. Nếu tôi cảm thấy đặc biệt có lỗi về một cách cụ thể để làm một cái gì đó, orit trông đặc biệt khó hiểu, tôi sẽ giải thích thêm, nhưng đó là về nó.

IMO: Mã tự viết tài liệu là mã trong đó các tên biến và phương thức được đặt tên có ý nghĩa và theo ngữ cảnh, để chúng mô tả mục đích của chúng là gì.


0

Nếu bạn đã xem lại mã của mình nhiều lần mà vẫn không tìm được cách nào để làm rõ ý định cho một số người biết tên miền. Viết lại hàm. Sau tất cả, nó không quá 10-20 dòng. Nếu nó dài hơn thì hãy viết lại chức năng dù sao nó cũng dài và đó là một phần lý do tại sao nó không thể đọc được :) rửa lại

và trong trường hợp không thể xảy ra, vẫn chưa rõ mã đang làm gì và bạn đã nhớ yêu cầu đồng nghiệp giúp đỡ. Vậy thì tất cả chúng tôi cảm ơn bạn đã giúp phát triển Linux vì đó là mã hạt nhân bạn đang viết phải không? nếu không rửa lại từ đầu :)

Đơn giản chỉ cần không viết bình luận của bạn MÃ họ


0

Kiểm tra Code Complete phiên bản 2, pg 128-129.

Các loại dữ liệu trừu tượng sẽ cứu bạn khỏi câu hỏi hóc búa này. Mã tài liệu tự là cách để đi. Nhận xét có thể hữu ích, nhưng có

thực thể trong thế giới thực chứ không phải là triển khai cấp thấp

bạn có thể tránh sử dụng bình luận.

Một điều về ý kiến ​​là bạn viết chúng một lần, nhưng bạn không thấy chúng khi bạn thực hiện chức năng, bạn chỉ nhìn thấy chúng khi bạn thay đổi chức năng.

Nhận xét thực sự hữu ích khi được IDE diễn giải theo cách Delphi 2009+ hoặc JavaDoc hoạt động, nhưng đó là ngôn ngữ đánh dấu có cấu trúc, vì vậy theo nghĩa bạn đang lập trình tài liệu của mình, rất thông minh.


0

Tôi tin vào câu thần chú rằng mã không tự ghi lại, bởi vì bạn có thể là lập trình viên giỏi nhất thế giới (Ada), nhưng vẫn không hiểu điều gì đang xảy ra, nhưng nếu bạn viết tài liệu tại sao và trong một thời gian ngắn Làm thế nào mã của bạn đang làm những gì nó làm, bạn sẽ giúp chính mình và những người khác trong tương lai.


0

Bình luận là phải có. Bởi vì khi bạn viết mã, bạn đang viết cho nhu cầu hiện tại của mình, nhưng cũng cho những người trong tương lai phải đọc mã của bạn, tìm ra wtf, bạn đang làm gì, và tại sao, và sau đó làm thế nào để sửa đổi nó.

Nếu bạn chỉ ghi nhớ điều này, khi viết mã / lập trình?

Làm thế nào tôi có thể làm cho điều này dễ hiểu và sửa đổi hơn cho các lập trình viên tương lai của mã này mà tôi đang làm việc, sau đó bạn sẽ làm tốt công việc. Thất bại trong việc đó, bạn chỉ khiến người khác khó sửa đổi mã của mình và đừng tưởng tượng rằng sẽ không bao giờ xảy ra trường hợp đó, điều đó rất hiếm ...

Trong hầu hết các công việc của tôi, tôi luôn phải sửa đổi mã của người khác và được viết một cách khủng khiếp nhất, được ghi chép kém.

Vì vậy, thói quen của bạn để suy nghĩ tài liệu mã là tự nó, chỉ là không làm việc siêng năng.

Là lập trình viên, chúng ta phải thực hành kỷ luật tự giác dường như hoàn toàn đối với các lập trình viên thiếu kinh nghiệm, nhưng phải có thói quen, để tránh tất cả những trải nghiệm khủng khiếp mà chúng ta có với mã của người khác. Hoặc thậm chí nhìn vào mã của chúng ta nhiều tháng, nhiều năm sau.

Hãy xem http://thed Dailywtf.com họ có vô số câu chuyện hài hước nhưng có thật về những lập trình viên, những người không làm việc chăm chỉ của họ ..

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.