it-swarm-vi.com

Viết "mã tốt" nghĩa là gì?

Trong này câu hỏi tôi đã hỏi liệu việc trở thành một nhà văn tồi có cản trở bạn viết mã tốt hay không. Nhiều câu trả lời bắt đầu với "nó phụ thuộc vào ý của bạn bởi mã tốt".

Có vẻ như thuật ngữ "mã tốt" và "mã xấu" rất chủ quan. Vì tôi có một quan điểm, nên có thể rất khác với quan điểm của người khác về họ.

Vậy viết "mã tốt" nghĩa là gì? "Mã tốt" là gì?

41
gablin

Một lập trình viên giỏi giống như một người chơi bi-a giỏi.

Khi bạn nhìn thấy một người chơi bi-a chuyên nghiệp, ban đầu bạn có thể không ấn tượng: "Chắc chắn, họ có tất cả các quả bóng trong, nhưng họ chỉ có những cú đánh dễ dàng!" Đó là bởi vì, khi một người chơi bi-a thực hiện cú đánh của mình, cô ấy không nghĩ về quả bóng nào sẽ đi vào túi nào, cô ấy cũng nghĩ về nơi bóng bi sẽ kết thúc . Thiết lập cho lần chụp tiếp theo đòi hỏi kỹ năng và thực hành rất lớn, nhưng điều đó cũng có nghĩa là nó có vẻ dễ dàng.

Bây giờ, đưa phép ẩn dụ này vào mã, một lập trình viên giỏi viết mã trông có vẻ dễ dàng và đơn giản để làm. Nhiều ví dụ của Brian Kernighan trong các cuốn sách của ông theo mô hình này. Một phần của "mánh khóe" đang đến với một khái niệm đúng đắn về vấn đề và giải pháp của nó. Khi chúng ta không hiểu rõ vấn đề đủ, chúng ta có nhiều khả năng làm phức tạp hóa các giải pháp của mình và chúng ta sẽ không thấy các ý tưởng thống nhất.

Với một khái niệm đúng đắn của vấn đề, bạn sẽ có được mọi thứ khác: khả năng đọc, khả năng duy trì, hiệu quả và tính chính xác. Bởi vì giải pháp có vẻ rất đơn giản, có thể sẽ có ít bình luận hơn, bởi vì giải thích thêm là không cần thiết. Một lập trình viên giỏi cũng có thể nhìn thấy tầm nhìn dài hạn của sản phẩm và hình thành khái niệm của họ theo đó.

91
Macneil

WTF's per minute

( bản gốc )


EDIT: Ý tưởng cơ bản là "Chất lượng mã" không thể được đưa vào quy tắc, giống như cách bạn không thể đặt "Nghệ thuật tốt" hoặc "Thơ hay" vào quy tắc để bạn có thể để máy tính xác định nói "Có, nghệ thuật tốt" hoặc "Không, thơ dở". Hiện tại cách duy nhất là xem mã dễ hiểu như thế nào đối với người khác.

49
user1249

Thực sự không có tiêu chí tốt nào ngoài việc bạn có thể hiểu mã nhanh như thế nào. Bạn làm cho mã của mình trông ổn bằng cách tìm sự thỏa hiệp hoàn hảo giữa cô đọng và khả năng đọc.

"WTF's per phút" (ở trên) là đúng nhưng đó chỉ là hệ quả của quy tắc chung hơn. WTF càng nhiều sự hiểu biết càng chậm.

7
mojuba

Bạn biết bạn viết mã tốt khi ...

  1. Khách hàng rất vui
  2. Đồng nghiệp mượn mã của bạn làm điểm bắt đầu
  3. Anh chàng/cô gái hoàn toàn mới được yêu cầu sửa đổi hệ thống mà bạn đã xây dựng 6 tháng trước và anh ấy/cô ấy chưa bao giờ hỏi bạn một câu hỏi
  4. Sếp của bạn yêu cầu bạn phát triển các vật dụng mới để nhóm sử dụng
  5. Bạn nhìn vào mã bạn viết hôm nay và nói với chính mình "Tôi ước tôi đã viết mã như thế này hai năm trước"

Làm thế nào để bạn đo xem mã có tốt không ...

  • Thời gian đáp ứng là gì?
  • Có bao nhiêu chuyến đi khứ hồi đến máy chủ?
  • Cá nhân bạn sẽ sử dụng ứng dụng này hay bạn nghĩ nó thật rắc rối?
  • Bạn sẽ xây dựng nó theo cách tương tự vào lần tới?

Mã tốt hoạt động khi nó được yêu cầu. Mã tốt có thể dễ dàng được sửa đổi khi cần. Mã tốt có thể được tái sử dụng để kiếm lợi nhuận.

5

Một mã đó là

  1. không có lỗi

  2. tái sử dụng

  3. độc lập

  4. ít phức tạp hơn

  5. tài liệu tốt

  6. dễ dàng trò chuyện

được gọi là mã tốt.

Một chương trình tốt hoạt động hoàn hảo và không có lỗi. Nhưng những phẩm chất bên trong nào tạo ra sự hoàn hảo như vậy?. Không có gì bí ẩn, chúng tôi chỉ cần thỉnh thoảng nhắc nhở. Cho dù bạn viết mã bằng C/C++, C #, Java, Basic, Perl, COBOL hoặc ASM, tất cả các chương trình tốt đều thể hiện những phẩm chất được tôn vinh theo thời gian: đơn giản, dễ đọc, mô đun, xếp lớp, thiết kế, hiệu quả, thanh lịch và rõ ràng, thanh lịch và rõ ràng

Nguồn: MSD

4
Chankey Pathak

Điều này có vẻ quen thuộc?

Philips đã cho tôi cơ hội để xem thiết kế của một sản phẩm mới. Khi nó phát triển, tôi ngày càng khó chịu và bắt đầu tâm sự những lo lắng của mình với người giám sát. Tôi đã nhiều lần nói với anh ấy rằng các thiết kế không phải là sạch, và đó phải là những người đẹp theo cách mà các thiết kế của Dijkstra đã đẹp. Ông không thấy đây là một bình luận hữu ích. Anh ấy nhắc nhở tôi rằng chúng tôi là kỹ sư, không phải nghệ sĩ. Trong tâm trí anh ấy, tôi chỉ đơn giản là bày tỏ sở thích của mình và anh ấy muốn biết tôi đang sử dụng tiêu chí nào để đưa ra đánh giá. Tôi đã không thể nói với anh ấy! Bởi vì tôi không thể giải thích những nguyên tắc nào đã bị vi phạm, những bình luận của tôi chỉ đơn giản là bị bỏ qua và công việc tiếp tục. Cảm thấy rằng phải có một cách để giải thích và cung cấp động lực cho vị giác của tôi, tôi bắt đầu cố gắng tìm ra một nguyên tắc phân biệt các thiết kế tốt với các thiết kế xấu. Các kỹ sư rất thực dụng; họ có thể ngưỡng mộ vẻ đẹp, nhưng họ tìm kiếm tiện ích. Tôi đã cố gắng tìm một lời giải thích về lý do tại sao người đẹp Viking có ích.

Xin vui lòng xem phần còn lại tại đây .

3
mlvljr

ngoài các tiêu chí chất lượng mã tự nhiên (sao chép/dán tối thiểu, không có spaghetti, v.v.) một mã công nghiệp tốt phải luôn trông hơi ngây thơ, hơi quá dài dòng, như

int key = i;
const bool do_not_create = false;
Record r = cache.get(key, do_not_create);
++i;

như trái ngược với

Record r = cache.get(i++, false);
1
bobah

Có lẽ một câu trả lời bằng cách minh họa ngược lại sẽ giúp ích (cộng với đó là một cái cớ để có được XKCD tại đây).

alt text

Mã tốt là

  • đơn giản để hiểu
  • dễ bảo trì,
  • không cố gắng giải quyết tất cả các vấn đề chỉ có một
  • tồn tại trong một thời gian dài mà không khiến các nhà phát triển tìm kiếm các lựa chọn thay thế

Những ví dụ bao gồm

  • Cộng đồng Apache
  • Khung mùa xuân
  • Khung ngủ đông
1
Gary Rowe

Tôi chỉ đơn giản là đi với "duy trì"

Tất cả các mã phải được duy trì: không cần phải thực hiện nhiệm vụ đó khó khăn hơn mức cần thiết

Nếu bất kỳ người đọc nào không hiểu yêu cầu đơn giản này hoặc cần nó đánh vần, thì người đọc đó không nên viết mã ...

1
gbn

Mã tốt sẽ khác nhau đối với mỗi người và ngôn ngữ mà họ đang làm việc cũng có tác động đến những gì có thể được coi là mã tốt. Nói chung khi tôi tiếp cận một dự án tôi tìm kiếm những điều sau đây:

  • Dự án được tổ chức như thế nào? Các tệp nguồn được tổ chức theo cách sạch sẽ và tôi có thể tìm mã với quá nhiều nỗ lực không?
  • Mã được tổ chức như thế nào? Được ghi lại rõ ràng những gì mã trong tệp thực hiện, chẳng hạn như thông qua việc sử dụng tiêu đề tệp hoặc thông qua việc sử dụng từng lớp trong tệp riêng của mình? Có chức năng nào trong tệp không còn được sử dụng trong ứng dụng không?
  • Các hàm được tổ chức như thế nào? Có một mẫu rõ ràng để các biến được khai báo hay là một mẫu khá ngẫu nhiên? Liệu mã có một luồng logic đến nó và tránh các cấu trúc điều khiển không cần thiết? Có phải mọi thứ đều được ghi lại rõ ràng với mã là tự ghi lại tài liệu khi cần và các bình luận thể hiện rõ ràng lý do tại sao và/hoặc làm thế nào những gì mã đang làm?

Ngoài tất cả những điều này, liệu thiết kế của ứng dụng có ý nghĩa như một tổng thể? Mã cư trú trong ứng dụng có thể là tốt nhất trên thế giới, nhưng vẫn có thể gây khó khăn nếu thiết kế tổng thể của ứng dụng không có ý nghĩa.

1
rjzii

Hãy để tôi vui lòng không đồng ý về khả năng đọc. Không, không hoàn toàn: Mã tốt nên có thể đọc được, và điều đó có thể dễ dàng đạt được với đủ ý kiến.

Nhưng tôi xem xét hai loại WTF: những nơi mà bạn tự hỏi liệu lập trình viên có tiến xa hơn lập trình 101 hay không, và những nơi bạn hoàn toàn không nắm bắt được tính di truyền của mã. Một số mã ban đầu có thể trông rất lạ, nhưng thực sự là một giải pháp rất sáng tạo cho một vấn đề khó khăn. Cái thứ hai không nên tính vào đồng hồ WTF và có thể tránh được bằng các bình luận.

Mã rất dễ đọc có thể rất, rất chậm. Một giải pháp ít đọc hơn có thể giúp cải thiện tốc độ gấp nhiều lần. R là một ví dụ tuyệt vời về ngôn ngữ thường là đúng. Một người thích tránh các vòng lặp ở đó càng nhiều càng tốt. Nói chung, tôi coi mã nhanh nhất là mã tốt hơn mặc dù nó ít đọc hơn. Đó là, nếu sự cải tiến là không đáng kể, và đủ các bình luận được đưa vào để giải thích những gì mã làm.

Thậm chí, quản lý bộ nhớ có thể rất quan trọng trong nhiều ứng dụng khoa học. Mã rất dễ đọc, có xu hướng cẩu thả trong sử dụng bộ nhớ: chỉ có nhiều đối tượng được tạo. Trong một số trường hợp, việc sử dụng bộ nhớ thông minh làm cho mã trở nên ít đọc hơn. Nhưng nếu bạn tung hứng xung quanh hàng gigabyte chuỗi DNA chẳng hạn, bộ nhớ là một yếu tố rất quan trọng. Một lần nữa, tôi coi mã ít bộ nhớ hơn là mã tốt hơn, bất kể khả năng đọc.

Vì vậy, có, khả năng đọc là quan trọng cho mã tốt. Tôi biết adagium của Uwe Liggis: Suy nghĩ đau và máy tính là rẻ. Nhưng trong lĩnh vực của tôi (bộ gen thống kê), thời gian tính toán trong một tuần và việc sử dụng bộ nhớ trên 40 Gb không được coi là bất thường. Vì vậy, một sự cải thiện gấp đôi tốc độ và một nửa bộ nhớ đáng giá hơn rất nhiều so với mức độ dễ đọc thêm đó.

1
Joris Meys

Theo như tôi biết ... Tôi biết tôi đang viết mã tốt khi một đồng nghiệp làm việc trong một dự án khác xuất hiện và có thể nhảy vào và hiểu những gì tôi đang làm mà không cần tôi đi qua từng khối mã và cho thấy những gì nó đang làm.
[.__.] Thay vì anh ta nói, "Đợi một chút, cái gì?!" Anh ấy nói, "Ồ, ok, tôi thấy những gì bạn đã làm ở đó."

Mã tốt cũng không có nhiều cách giải quyết lén lút hoặc 'hack'. Dòng khi, trong khi bạn viết nó, bạn cũng tự nói với mình: "Tôi biết đây không phải là cách hay để làm, nhưng bây giờ tôi sẽ phải làm theo cách này. Tôi sẽ nhắc nhở bản thân tôi sẽ cải thiện nó sau ... "

1
chiurox

Có rất nhiều tính năng của mã 'tốt', nhưng quan trọng nhất, IMHO, là khả năng đọc và bảo trì.

Mã của bạn will chứa lỗi, sẽ có thể được mở rộng và sử dụng lại, và nên sẽ được tái xác nhận tại một số điểm - ngay cả khi nó là bạn đang truy cập lại nó, có khả năng là bạn sẽ không biết được bạn đã làm cái quái gì ngay từ đầu, để giúp mình và không đặt ra bất kỳ rào cản nào.

Chắc chắn, sử dụng thuật toán phức tạp nhưng hiệu quả, nhưng đảm bảo rằng bạn dành thêm một chút thời gian để ghi lại nó, nhưng nếu không thì làm cho mã của bạn rõ ràng và nhất quán.

1
cjmUK