Làm thế nào bạn biết nếu bạn đã viết mã dễ đọc và dễ bảo trì?


336

Làm thế nào để biết mã mà người ta đã tạo có thể dễ đọc, dễ hiểu và có thể duy trì được không? Tất nhiên theo quan điểm của tác giả, mã có thể đọc và duy trì được, bởi vì tác giả đã viết nó và chỉnh sửa nó, để bắt đầu. Tuy nhiên, phải có một tiêu chuẩn khách quan và định lượng mà theo đó nghề nghiệp của chúng tôi có thể đo lường mã.

Những mục tiêu này được đáp ứng khi một người có thể thực hiện các thao tác sau với mã mà không cần lời khuyên chuyên môn của tác giả gốc:

  • Có thể đọc mã và hiểu ở mức cơ bản luồng logic.

  • Có thể hiểu ở mức độ sâu hơn những gì mã đang làm để bao gồm đầu vào, đầu ra và thuật toán.

  • Các nhà phát triển khác có thể thực hiện các thay đổi có ý nghĩa đối với mã gốc như sửa lỗi hoặc tái cấu trúc.

  • Người ta có thể viết mã mới, chẳng hạn như một lớp hoặc mô-đun tận dụng mã gốc.

Làm thế nào để chúng ta định lượng hoặc đo lường chất lượng mã để chúng ta biết nó có thể đọc, dễ hiểu và có thể bảo trì?


154
Liên kết bắt buộc (một lần không đến xkcd): osnews.com/images/comics/wtfm.jpg
Jerry Coffin

3
Tôi chỉ đơn giản nói rằng bạn biết điều đó khi bạn nhìn thấy nhưng lập luận này về cơ bản là thiếu sót và lúng túng ngay cả ở dạng ban đầu, không bao giờ áp dụng cho mã nguồn.
Konrad Rudolph

6
"Tất nhiên theo quan điểm của bạn, mã của bạn có thể đọc được" - không rõ ràng lắm!
ChúZeiv

24
Tôi muốn nói rằng bạn biết điều đó khi bạn nhìn thấy nó một vài tháng sau khi bạn viết nó.
JeffO

2
@asfallows: Tôi đã đưa một số mã cho vợ tôi và cô ấy nghĩ rằng đó thực sự là mã xấu, vì cô ấy có thể đọc nó! (Quá nhiều từ tìm kiếm tiếng Anh trong đó và không đủ ký tự @ [! ^ $ & *) ...)
gnasher729

Câu trả lời:


370

Đồng nghiệp của bạn cho bạn biết sau khi xem lại mã.

Bạn không thể tự xác định điều này bởi vì là tác giả, bạn biết nhiều hơn chính mã nói. Một máy tính không thể cho bạn biết, vì những lý do tương tự mà nó không thể biết liệu một bức tranh có phải là nghệ thuật hay không. Do đó, bạn cần một người khác - có khả năng duy trì phần mềm - để xem xét những gì bạn đã viết và đưa ra ý kiến ​​của người đó. Tên chính thức của quá trình nói là đánh giá ngang hàng .


6
Không có gì đánh bại thử nghiệm thực nghiệm.
Kỹ sư thế giới

25
+1 Đối tượng quan trọng nhất của bạn là đồng nghiệp của bạn, những người đắm chìm, với bạn, trong việc biết được những vấn đề rắc rối mà bạn đang giải quyết và giải pháp của nó. Mã tốt phản ánh sự hiểu biết hiện tại của nhóm đồng đẳng của bạn về điều này. Giả sử nhóm có khả năng, chu đáo và cởi mở với những ý tưởng mới, "đồng nghiệp của bạn nói với bạn điều tốt / có thể duy trì được", theo kinh nghiệm của tôi, là một định nghĩa tốt hơn cho đến nay.
Doug T.

69
Theo kinh nghiệm của tôi, điều này chỉ hoạt động khi đồng nghiệp của bạn biết điều gì tốt và điều gì xấu. Nếu không, nó sẽ nghe như thế này: "Bạn nên viết các mã đó theo cùng một phương thức, để tìm mã dễ dàng hơn"
Rangi Lin

12
@RangiLin, tốt, đồng nghiệp của bạn có thể đúng.

11
@Rangi Bạn phải làm việc với các đồng nghiệp mà bạn có. nếu họ thấy mã của bạn khó khăn thì đó là vấn đề với mã của bạn. Về lâu dài, bạn có thể giáo dục họ, hoặc cố gắng để có được các đồng nghiệp tốt hơn (bạn có thể di chuyển hoặc bạn có thể ảnh hưởng đến quá trình tuyển dụng) ... Ồ vâng, và làm luôn nhớ rằng họ có thể đúng.
MarkJ

220

Đôi khi, cách tốt nhất để biết, là quay lại mã bạn đã viết sáu tháng trước và thử và hiểu những gì nó được viết để làm.

Nếu bạn hiểu nó một cách nhanh chóng - nó có thể đọc được.


28
Vâng, điều đó nghe có vẻ tốt (và là sự thật), nhưng đó không phải là một cách tiếp cận tốt để quyết định những gì / làm thế nào hôm nay ...
Michael Durrant


3
Tôi có thể bỏ khung thời gian để xem lại xuống còn một tháng, hoặc thậm chí ít hơn, cho lần xem lại đầu tiên. Tôi nghĩ rằng nó phụ thuộc vào sự phức tạp của dự án và tên miền, cũng như cách tiếp cận tinh thần của bạn. Tôi thấy rằng trong sáu tháng, tôi bị phân tâm khi nhìn thấy các cơ hội tái cấu trúc hoặc tối ưu hóa bằng các công cụ hoặc kỹ thuật tôi đã học được kể từ lần đầu tiên tôi viết mã, thay vì khả năng đọc thực sự.
Chris Bye

1
@MichaelDurrant Mỗi khi bạn xem lại mã cũ, bạn sẽ tìm thấy các phần nên được viết khác đi và sau đó bạn sẽ tính đến mã mà bạn đang viết "hôm nay". Vâng, phải mất thời gian để học cách viết mã tốt.
dj18

1
@MichaelDurrant nó vẫn là như vậy, vì bạn có thể tìm hiểu những điều không rõ ràng bạn đã làm sáu tháng trước, và không làm những điều đó ngày hôm nay.
djechlin

94

Nó là:

  1. duy trì nếu bạn có thể duy trì nó .
  2. dễ dàng bảo trì nếu người khác có thể duy trì nó mà không cần bạn giúp đỡ
  3. có thể đọc được nếu người khác , khi đọc nó, hiểu chính xác thiết kế, bố cục và ý định

Thử nghiệm thực sự cho 1. là (như Alex ở Parisquant_dev nói) rằng bạn có thể lấy lại sau vài tháng làm việc khác.

Bài kiểm tra cho 2. và 3. là người khác có thể lấy nó và tìm ra cách mở rộng hoặc sửa mã của bạn trong khi tuân theo hạt của thiết kế. Nếu họ không thể hiểu được thiết kế, nó liên quan đến không gian vấn đề như thế nào hoặc mã của bạn dự định sẽ được sử dụng, thay vào đó họ sẽ hack một giải pháp xuyên suốt.

Có các quy tắc về ngón tay cái, các nguyên tắc (nghĩa là quy tắc ngón tay cái ai đó đã viết lên một cách độc đáo và đặt tên) và tất cả các loại đề xuất có thể đưa bạn đi đúng hướng hoặc tránh xa những cạm bẫy thông thường. Không ai trong số họ sẽ đảm bảo những phẩm chất mà bạn yêu cầu, mặc dù.


2
Làm thế nào về việc xem xét lượng thời gian dành cho việc sửa lỗi hoặc sửa đổi hành vi hiện có như là một yếu tố của khả năng duy trì? Một đoạn mã cần ít thời gian hơn để thực hiện cùng một thay đổi được cho là có thể duy trì nhiều hơn phải không?
VCD

1
Phụ thuộc; đôi khi thực hiện sửa đổi tốt sẽ yêu cầu tái cấu trúc (mà bạn có thể biết là cần thiết bởi vì mã rõ ràng cho thấy rõ ràng nó không được sử dụng như vậy), mất nhiều thời gian hơn hack trong trường hợp đặc biệt (mã không thể khuyến khích vì mục đích không rõ ràng ).
Vô dụng

30

Nếu mã của bạn tuân theo các nguyên tắc RẮNDRY và có một bộ kiểm tra đơn vị tốt xung quanh nó, thì nó có thể được duy trì.

Có đọc được không? Đọc nó. Do phương thức và tên biến có ý nghĩa? Bạn có thể theo logic chương trình mà không có vấn đề? Nếu câu trả lời là có, thì mã có thể đọc được.


8
... Và sau khi bạn đọc nó, hãy đưa nó cho người khác để đọc.
jcmeloni

19
Đây không phải là một bài kiểm tra đặc biệt tốt. Nhiều ứng dụng của các quy tắc đó là chủ quan và hầu như bạn luôn có thể đọc mã của riêng mình ngay sau khi được viết.
DeadMG

1
"Nếu câu trả lời là có, thì mã có thể đọc được" ... bởi bạn . Để xem nó có thể đọc được cho người khác hay không, những người khác phải thử đọc nó.

2
IMO, RẮN được đánh giá cao. Đặc biệt là 'S.' Điều đó hoặc mọi người đọc sai nó.
Erik Reppen

Tôi đã chạy vô số lần vào mã đó là KHÔ và RẮN và thật kinh khủng. Các nguyên tắc sau đây có thể gây ấn tượng sai lầm rằng những gì bạn đang viết không phải là tào lao.
Jakub Arnold

24

Đọc cách viết mã không thể nhầm lẫn - Đảm bảo công việc cho cuộc sống bằng Roedy Green, cười và học hỏi.

... Làm thế nào để viết mã rất khó để duy trì, rằng những người đến sau bạn sẽ mất nhiều năm để thực hiện ngay cả những thay đổi đơn giản nhất. Hơn nữa, nếu bạn tuân thủ tất cả các quy tắc này một cách tôn giáo, bạn thậm chí sẽ đảm bảo cho mình một công việc trọn đời, vì không ai ngoài bạn có hy vọng duy trì mã ...

Bài luận cung cấp cho bạn rất nhiều ví dụ về cách viết mã xấu, sử dụng nhiều ví dụ hài hước. Nó tiếp tục giải thích cách sử dụng Creative Miss-spelling , Reuse of Names , kỹ thuật đánh giá cao việc tái sử dụng tên toàn cầu là riêng tư .

Trong một cách hài hước, bài luận dạy bạn làm thế nào để tránh tất cả các ví dụ về mã không thể đọc được và không thể nhầm lẫn.

Trên thực tế, tôi thấy khó có thể tin rằng bất cứ ai cũng sẽ viết mã có điểm tương đồng với các ví dụ trong văn bản. Đó là khi tôi mới đi học. Nhưng, sau khi làm việc được vài năm, tôi thấy mã từ văn bản mỗi ngày


Xem thêm Waterfall2006.com/gorman.html Giới thiệu là quá trình lấy một đoạn mã được thiết kế tốt và, thông qua một loạt các thay đổi nhỏ, có thể đảo ngược, làm cho nó hoàn toàn không thể nhận ra bởi bất kỳ ai trừ chính bạn.
Sjoerd

22

Mặc dù có vẻ như thế nào, có một số biện pháp khá khách quan mà bạn có thể xem xét. Các cuốn sách như Tiêu chuẩn mã hóa C ++ , tái cấu trúcmã sạch có danh sách dài các tiêu chí để đánh giá mã của bạn bằng cách xem xét những thứ như tên có ý nghĩa, kích thước hàm, nguyên tắc như khớp nối và gắn kết, thiết kế đối tượng, kiểm tra đơn vị, sàng lọc liên tiếp, v.v.

Danh sách này quá lớn để có thể tuân theo danh sách kiểm tra, nhưng bạn đọc cuốn sách và chọn ra một vài điều quan trọng để làm việc, sau đó vài tháng đọc lại để cải thiện thêm.


4
+1 cho việc học tăng dần và không cố gắng để trở nên hoàn hảo chỉ sau một đêm
dj18 17/03/14

19

Bằng chứng là trong pudding. Xem những gì xảy ra sau khi đưa nó cho một người có thẩm quyền hợp lý. Nếu họ không cần hỏi nhiều câu hỏi liên quan đến độ khó của mã, bạn đã hoàn thành tốt công việc.

Đây là một bài học sớm trong sự nghiệp của tôi. Một người cố vấn nói: "Tài liệu mọi thứ, để bạn có thể thoát khỏi chương trình sau này. Nếu bạn không lường trước được câu hỏi khi câu trả lời mới mẻ, bạn sẽ phải tìm ra chúng khi không."


10
Coi chừng mọi người có thể không đặt câu hỏi do sợ phơi bày sự thiếu hiểu biết của họ. Bạn thậm chí có thể cảm nhận những người đó là "có năng lực hợp lý" ngay từ đầu do xu hướng kiềm chế không phơi bày nó. Vì vậy, thiếu câu hỏi có thể không phải là một điều tốt trừ khi bạn biết cả hai bạn đều chân thành.
Hermann Ingjaldsson

1
@HermannIngjaldsson - Đủ công bằng. Tất nhiên nếu họ không đủ năng lực và một cái gì đó bị phá vỡ, bạn sẽ sớm nghe về nó. "Cứu giúp!!!!"
MathAttack

điều này dường như chỉ lặp lại những gì đã được nêu trong câu trả lời hàng đầu
gnat

17

Tôi đọc qua tất cả các câu trả lời, và tôi nhận thấy không ai đề cập đến độ phức tạp của mã.

Có mối tương quan chặt chẽ giữa độ phức tạp của mã và khả năng đọc / bảo trì. Có rất nhiều thuật toán chấm điểm phức tạp mã, nhưng tôi sẽ chỉ nói về cách hoạt động của tính điểm phức tạp McCabe.

Về cơ bản, điểm McCabe đọc qua mã của bạn và tính toán số lượng "đường dẫn" duy nhất có thông qua nó. Nếu bạn sử dụng McCabe làm tử số và các dòng mã làm mẫu số của bạn, bạn cũng sẽ có được một xấp xỉ khá tốt về "khả năng đọc".

Nếu bạn đã có 10 dòng mã và có 300 đường dẫn qua mã đó, đó là một số mã khá khó nhận biết (khó thay đổi một cách an toàn và dễ dàng), và có lẽ nó không dễ đọc lắm. Ngược lại, nếu bạn đã có 300 dòng mã, nhưng chỉ có 1 đường dẫn qua nó (nó không có điều kiện), thì cả hai đều có thể đọc và dễ bảo trì.

Trường hợp McCabe rơi xuống tuy nhiên là trong ví dụ sau. Nếu tôi có 300 dòng mã mà không có điều kiện, thì rất có khả năng tôi đã thực hiện "sao chép / dán tái sử dụng" và rõ ràng đó cũng không phải là một điều tốt. Vì vậy, có các số liệu trên toàn hệ thống mà bạn áp dụng cùng với McCabe - như phát hiện mã trùng lặp hoặc gần trùng lặp.


2
Đây nên là câu trả lời. Đo lường. Những câu trả lời khác có nhiều ý kiến ​​hơn thực tế, nếu tôi có thể hiểu nó, nó phải tốt chứ? Biện pháp đầu tiên sử dụng phân tích độ phức tạp, sau đó tái cấu trúc của con người để tìm kiếm sự trùng lặp, v.v.
Jon Raynor

1
Đoạn cuối cùng của bạn đề cập đến những hạn chế của điểm McCabe chia cho LỘC thay vì có xu hướng làm mất hiệu lực toàn bộ ý tưởng. Nếu bạn cần 300 đường dẫn thông qua mã của mình, tại sao bạn nghĩ nó sẽ giúp mã được sử dụng nhiều dòng hơn? Điều đó giống như nói rằng nếu một cuốn sách trình bày những ý tưởng phức tạp, thì nó nên là một cuốn sách thực sự lớn hơn là cố gắng truyền đạt chính xác. -1.
tự đại diện

8

Một điểm tôi muốn chia sẻ là nếu mã được xây dựng trong "các mô-đun" và khi tôi nói rằng tôi có nghĩa là bạn có thể thay đổi một thứ trong một mô-đun và dễ dàng làm cho nó hoạt động với toàn bộ. Nó giúp loại bỏ hiệu ứng giữa những thứ không liên quan. Cũng thế:

  • Mã dễ sử dụng lại
  • Mã của bạn rất linh hoạt (điều này liên quan đến việc xây dựng theo các mô-đun)
  • DRY - Đừng lặp lại chính mình

Tôi rất khuyên bạn nên đọc, Lập trình viên thực dụng.


8

Một số bài kiểm tra / chỉ số:

  • Tắt IDE. Bạn vẫn có thể đọc mã của riêng bạn? Khi có một lỗi là khá dễ dàng để truy tìm bằng tay và tìm ra lớp nào bạn sẽ cần một điểm dừng để tìm ra vấn đề đó là ở đâu? Hoặc khi bạn sử dụng IDE, bạn thậm chí không bận tâm và chỉ bước qua từ đầu?

  • Có gỡ lỗi thường trở thành một trò chơi wack-a-mol trong đó sửa một lỗi tạo ra hơn 2 lỗi.

  • Từ kéo kích hoạt đến một cái gì đó hữu ích thực sự xảy ra, có bao nhiêu cuộc gọi phương thức? Có bao nhiêu phương thức truyền chính xác hoặc hầu hết các tham số chính xác giống nhau cho một cuộc gọi phương thức khác?

  • Có bao nhiêu tệp bạn phải mở để chỉ thêm một phương thức mới đơn giản vào một lớp?

  • Suy nghĩ về các mô hình và thực hành bạn đã áp dụng. Bạn đã làm điều đó bởi vì họ có ý nghĩa hoàn hảo hoặc bởi vì ai đó đã thuyết phục bạn rằng "đó là cách duy nhất để làm điều đó?" hoặc bởi vì bạn muốn nó trong sơ yếu lý lịch của bạn hoặc bởi vì một số nhà phát triển rockstar đã nói như vậy.


3
Đọc mã mà không có IDE dường như vô nghĩa, đặc biệt là thước đo khả năng đọc. Loại số liệu này dẫn đến "giải pháp" ký hiệu kiểu Hungary thực sự làm suy yếu khả năng đọc cuối cùng.
rubenvb

8

Làm thế nào người ta có thể biết nếu mã anh ta tạo ra có thể dễ dàng duy trì và có thể đọc được không?

Bạn có thể nhận ra mã dễ bảo trì và dễ đọc bằng cách tìm các thuộc tính sau:

  1. Các đối tượng, phương thức và / hoặc các hàm luôn làm một việc.
  2. Các phương thức và / hoặc các chức năng được súc tích (như trong "ngắn gọn nhưng toàn diện").
  3. Các đối tượng, phương thức và / hoặc các hàm thực hiện những gì bạn nghĩ chúng phải làm dựa trên tên của chúng.
  4. Mã được định sẵn để sử dụng lại thực sự có thể sử dụng lại.
  5. Cuối cùng nhưng không kém phần quan trọng, nếu bạn có thể kiểm tra đơn vị mã ngay lập tức, ít nhất bạn có khả năng viết mã đơn, mã mô-đun.

Làm thế nào để chúng ta biết nếu chúng ta viết mã khá lộn xộn và không thể nhầm lẫn? Có bất kỳ cấu trúc hoặc hướng dẫn nào để biết nếu chúng tôi phát triển phần mềm lộn xộn không?

  1. Nếu bạn đang đọc qua một phương pháp và không rõ ý định đó là gì, thì điều này là không phù hợp nhất và có khả năng không thể nhầm lẫn ở mức tồi tệ nhất.
  2. Nếu nó không có vẻ đơn giản, thì có lẽ nó không đơn giản và đó là dấu hiệu của mã hoặc mã không thể nhầm lẫn sẽ sớm trở nên không thể nhận ra.
  3. Nếu thiếu tính đối xứng (tính nhất quán) trên cơ sở mã, bạn có thể đang xem mã không thể nhầm lẫn.

Tôi không đồng ý rằng ví dụ tái cấu trúc của bạn rõ ràng hơn. Tôi đồng ý mã ban đầu cần làm việc, nhưng hoàn toàn về mặt rõ ràng và ý định truyền đạt Tôi nghĩ rằng bản gốc tốt hơn nhiều. Tôi rất nghi ngờ về bất kỳ tái cấu trúc nào tuyên bố rằng nó cải thiện sự rõ ràng trong khi giới thiệu regex.
Roy

1
@Roy, vâng, đủ công bằng. Tôi có lẽ không bao giờ nên thêm mẫu mã đó. Cấp, đã gần 3 năm rồi, nhưng ngay cả khi đó, tôi có lẽ không nên sử dụng PHP (tôi chỉ nhìn vào nó bây giờ), và tôi không nên sử dụng một regex vì đó là một trong những điều mà một số người có thể nhìn vào và ngay lập tức có được nó, nhưng đối với những người khác, cho dù ngắn gọn, regexes là một tắt ngay lập tức. Tôi sẽ chỉnh sửa câu trả lời và thả mẫu mã. Cảm ơn đã bình luận.
Wil Moore III

Làm thế nào một đối tượng có thể làm một việc?
Koray Tugay

@KorayTugay Hãy nghĩ về nó theo cách này. Nếu một đối tượng đang mô tả nhiều hơn một khái niệm gắn kết duy nhất, bạn đã có mùi.
Wil Moore III

6

Trong một từ duy nhất, Kinh nghiệm .

Để bắt đầu, bạn cần phải hoàn thành công việc cơ bản, vì vậy tôi không thể khuyên nhiều hơn rằng các lập trình viên nên dành thời gian để đọc các cuốn sách như Tái cấu trúc , sẽ cung cấp một số công cụ cần thiết hơn trong kho vũ khí của lập trình viên sẽ cải thiện khả năng duy trì mã của bạn và Clean Code được viết bởi một số tài năng dễ nhận biết nhất trong lĩnh vực của chúng tôi và mô tả gần như mọi thứ bạn cần hiểu để đảm bảo mã của bạn sạch và dễ đọc.

Không có số lượng đọc tuy nhiên là một thay thế cho kinh nghiệm khó kiếm được. Bạn thực sự cần phải làm việc với mã trong một thời gian để đánh giá đầy đủ sự khác biệt mà sự chú ý đến chất lượng mã có thể tạo ra. Thông qua việc trải nghiệm niềm vui khi làm việc với mã sạch, có nhiều yếu tố, cũng như nỗi đau khi làm việc với mã spaghetti, bạn học để hiểu rõ hơn những gì các tác giả của những cuốn sách này đã thực sự dạy cho bạn, nhưng bạn làm như vậy trong bối cảnh rộng hơn về mã sản xuất trực tiếp thực sự, nơi chất lượng của những gì bạn làm thực sự quan trọng và tác động đến khả năng làm việc dễ dàng với mã của bạn hàng ngày.

Nó cũng giúp có một người cố vấn tốt, hoặc một người có kinh nghiệm để xác nhận rằng bạn đang nỗ lực viết mã lên một tiêu chuẩn cao. Đây chỉ là một lý do tại sao đánh giá mã có thể rất hữu ích. Sử dụng các công cụ kiểm tra và định dạng mã cũng có thể là một trợ giúp rất hữu ích để đảm bảo rằng bạn đang giữ mọi thứ sạch sẽ. Tuy nhiên, không có gì có thể so sánh với kinh nghiệm kiếm được qua nhiều năm viết phần mềm, như vậy bạn tự động thấy mình viết mã sạch, dễ đọc và được cấu trúc đơn giản để dễ bảo trì và tất cả vì bạn đã tạo thói quen áp dụng các cách thực hành tốt nhất cho Dài.


3

Không có tính thuần túy: thích phong cách chức năng. Hầu hết các ngôn ngữ ngày nay (.NET, Ruby, Python, Javascript, v.v.) đều hỗ trợ và quảng bá nó (ví dụ LINQ, underscorejs).

Nó là cực kỳ dễ đọc.

var recentTopCustomers = OrderList
    .Where(o => o.Date >= DateTime.Now.AddDays(-5))
    .Where(o => o.Amount > 1000)
    .OrderBy(o => -o.Amount)
    .Take(10)
    .Select(o => o.Customer);

Nó buộc mỗi nút phải có mục đích cho vay duy nhất, tập trung vào mục đích rõ ràng. Và bởi vì mỗi tác vụ riêng biệt được tách ra bật ra, cắm vào và sắp xếp lại các nút (hoạt động) đến các đầu khác nhau là chuyện nhỏ. Điều này cho vay để dễ bảo trì.


2

Mã có thể đọc và duy trì: Mã mà ngay từ cái nhìn đầu tiên, một lập trình viên có thể hiểu đủ rõ để có thể dễ dàng:

  • sử dụng lại thông qua giao diện của nó, hoặc
  • gỡ lỗi nó, hoặc
  • thay đổi hành vi của nó. (thêm / xóa tính năng) hoặc
  • tối ưu hóa nó
  • kiểm tra nó

Điều này sôi xuống đến 'sự rõ ràng'. tức là có bao nhiêu câu hỏi mà lập trình viên phải hỏi về một đoạn mã cụ thể trước khi họ chắc chắn rằng họ 'hiểu những gì nó đủ tốt' để đạt được nhiệm vụ hiện tại trong tay mà không gây ra tác dụng phụ không mong muốn.

Cuốn sách 'Code Complete, của Steve McConnell' đi sâu vào chi tiết này.

Anh ta trải qua các số liệu khác nhau mà bạn có thể sử dụng để xác định xem mã có chất lượng tốt hay không.

Xem ví dụ tại đây: http://books.google.co.uk/books?id=3JfE7TGUwvgC&lpg=PT376&pg=PT389#v=onepage&q&f=false


điều này dường như không thêm bất cứ điều gì đáng kể vào các điểm được thực hiện và giải thích trong các câu trả lời trước
gnat

Tôi nghĩ rằng một trong những điều quan trọng nhất mà nó bổ sung là một tham chiếu đến Code Complete, mà không có câu trả lời nào trước đây đề cập. Cuốn sách đó là một trong những cuốn sách quan trọng và có ảnh hưởng nhất tập trung vào việc viết mã có thể đọc và duy trì được. Bất cứ ai đã đọc cuốn sách đó sẽ không cần phải hỏi 'Làm thế nào bạn biết nếu bạn đã viết mã có thể đọc và dễ bảo trì?'.
JW01

... Do đó, theo tôi, tôi tin rằng điều tốt nhất mà bất cứ ai cũng có thể nhận được nếu họ thực sự quan tâm đến việc viết mã có thể duy trì là đọc cuốn sách đó. Do đó, với nhiều phút suy nghĩ cẩn thận, (thường là suy nghĩ nhiều hơn nhiều phút so với người điều hành SO), tôi nghĩ rằng đây không chỉ là một câu trả lời thỏa đáng cho câu hỏi của OP, mà là tốt nhất .
JW01

2

Giảm thiểu tác dụng phụ (lý tưởng là không có)

Một hàm gây ra 3 thay đổi cho các trạng thái bên ngoài phạm vi của chính nó rất khó để lý giải và duy trì hơn nhiều so với một hàm chỉ nhập một thứ gì đó và xuất ra một thứ khác. Bạn không thể biết chức năng này làm gì, bạn phải nhớ những gì nó đã làm và làm thế nào điều đó ảnh hưởng đến tất cả các chức năng có liên quan khác.

Đối với OOP giảm thiểu tác dụng phụ cũng có nghĩa là các lớp có ít thành viên hơn và đặc biệt là ít thành viên có thể sửa đổi trạng thái của lớp hơn, vì các hàm thành viên có thể sửa đổi các trạng thái ngoài chính chúng và có tác dụng phụ (ví dụ: chúng có thể điều khiển các phần bên trong của lớp). Điều đó cũng có nghĩa là các lớp có ít thành viên dữ liệu của riêng họ để có ít trạng thái hơn cho các phương thức đó để giả mạo và ít tác dụng phụ hơn mà chúng có thể gây ra.

Ví dụ đơn giản, hãy tưởng tượng bạn đang cố gắng thiết kế một cấu trúc dữ liệu ưa thích có thể duy trì sortedtrạng thái mà nó sử dụng để xác định xem thực hiện tìm kiếm nhị phân hay tuyến tính. Trong trường hợp như vậy, có thể hữu ích khi tách thiết kế thành hai lớp. Việc gọi sortedlớp chưa được sắp xếp có thể trả về cấu trúc dữ liệu của lớp khác luôn giữ nội dung của nó được sắp xếp. Bây giờ bạn có ít tác dụng phụ hơn (do đó ít bị lỗi và dễ hiểu mã hơn) cũng như mã áp dụng rộng rãi hơn (thiết kế trước đây sẽ lãng phí cả về xử lý và hiệu quả trí tuệ của con người đối với các mảng nhỏ không cần phải sắp xếp).

Tránh phụ thuộc bên ngoài

Bạn có thể thực hiện mã ngắn gọn nhất có thể tưởng tượng được với việc sử dụng lại mã tối đa bằng cách sử dụng 13 thư viện khác nhau để thực hiện một nhiệm vụ tương đối đơn giản. Tuy nhiên, điều đó chuyển giao chi phí trí tuệ cho độc giả của bạn bằng cách sau đó phải làm cho họ hiểu ít nhất một phần của 13 thư viện khác nhau. Sự phức tạp vốn có này cần được đánh giá ngay lập tức bởi bất kỳ ai cố gắng xây dựng và hiểu một thư viện bên thứ ba cần kéo vào và xây dựng hàng tá thư viện khác để hoạt động.

Đây có lẽ là một quan điểm rất gây tranh cãi nhưng tôi thích một số sao chép mã khiêm tốn đến cực đoan ngược lại với điều kiện kết quả cuối cùng được kiểm tra tốt (không có gì tệ hơn so với mã bị lỗi chưa được sao chép nhiều lần). Nếu lựa chọn nằm giữa 3 dòng mã trùng lặp để tính toán một sản phẩm chéo vector hoặc kéo vào thư viện toán sử thi chỉ để loại bỏ 3 dòng mã, tôi sẽ đề xuất trước đây trừ khi toàn bộ nhóm của bạn có mặt trên thư viện toán học này , tại thời điểm đó, bạn vẫn có thể xem xét chỉ viết 3 dòng mã thay vì 1 nếu nó đủ tầm thường để đổi lấy lợi ích tách rời.

Tái sử dụng mã là một hành động cân bằng. Tái sử dụng quá nhiều và bạn chuyển sự phức tạp về trí tuệ theo cách một-nhiều, vì trong 3 dòng mã đơn giản mà bạn đã lưu ở trên phải trả giá bằng cách yêu cầu người đọc và người bảo trì hiểu nhiều thông tin hơn 3 dòng mã . Nó cũng làm cho mã của bạn kém ổn định hơn, vì nếu thư viện toán học thay đổi, thì mã của bạn cũng vậy. Tái sử dụng quá ít và bạn cũng nhân lên chi phí trí tuệ và mã của bạn không được hưởng lợi từ các cải tiến trung tâm, vì vậy đó là một hành động cân bằng, nhưng ý tưởng rằng đó là một hành động cân bằng đáng được đề cập vì cố gắng dập tắt mọi hình thức sao chép khiêm tốn có thể dẫn đến kết quả là khó duy trì, nếu không muốn nói là nhiều hơn so với thái cực ngược lại.

Kiểm tra tào lao ra khỏi nó

Đây là một điều được đưa ra nhưng nếu mã của bạn không xử lý tất cả các trường hợp đầu vào và bỏ lỡ một số trường hợp cạnh, thì làm sao bạn có thể mong đợi người khác duy trì mã mà bạn đã viết mà bạn thậm chí không nhận được ngay trước khi nó được chuyển sang mắt và tay của họ? Điều đó đủ khó để thực hiện các thay đổi đối với mã hoạt động hoàn hảo chứ đừng nói đến mã không bao giờ hoàn toàn đúng ngay từ đầu.

Trên hết, mã vượt qua các bài kiểm tra kỹ lưỡng thường sẽ tìm thấy ít lý do hơn để thay đổi. Điều đó liên quan đến sự ổn định thậm chí còn hơn cả một chén thánh để đạt được hơn là khả năng bảo trì, vì mã ổn định không bao giờ cần phải thay đổi sẽ không mất chi phí bảo trì.

Tài liệu giao diện

Ưu tiên "những việc cần làm" hơn "cách mọi thứ thực hiện" nếu bạn không thể dành thời gian bình đẳng cho việc ghi chép cả hai. Một giao diện rõ ràng rõ ràng trong ý định của nó về những gì nó sẽ làm (hoặc ít nhất, những gì nó phải làm) trong tất cả các trường hợp đầu vào có thể sẽ mang lại sự rõ ràng về bối cảnh để thực hiện chính nó sẽ hướng dẫn cách hiểu không chỉ về cách thức để sử dụng mã, nhưng cũng làm thế nào nó hoạt động.

Trong khi đó, mã thiếu những phẩm chất này, nơi mọi người thậm chí không biết những gì nó phải làm là SOL cho dù chi tiết thực hiện của nó được ghi chép tốt như thế nào. Hướng dẫn gồm 20 trang về cách triển khai mã nguồn là vô ích đối với những người thậm chí không thể hiểu chính xác cách sử dụng nó ở nơi đầu tiên và thậm chí nó phải làm gì trong tất cả các tình huống có thể xảy ra.

Đối với phía thực hiện, ưu tiên ghi lại những gì bạn làm khác với mọi người. Ví dụ, Intel có một hệ thống phân cấp âm lượng giới hạn cho các hạt nhân raytracing của họ. Vì tôi làm việc trong lĩnh vực này, tôi có thể nhận ra phần lớn những gì mã của họ đang làm trong nháy mắt mà không cần lọc qua tài liệu. Tuy nhiên, họ làm một cái gì đó độc đáo, đó là ý tưởng đi ngang qua BVH và thực hiện các giao điểm song song bằng cách sử dụng các gói tia . Đó là nơi tôi muốn họ ưu tiên tài liệu của họ vì những phần đó của mã là kỳ lạ và khác thường so với hầu hết các triển khai BVH lịch sử.

Dễ đọc

Phần này rất chủ quan. Tôi không thực sự quan tâm nhiều đến khả năng đọc của một loại gần với quá trình suy nghĩ của con người. Mã tài liệu tốt nhất mô tả mọi thứ ở mức cao nhất vẫn khó theo dõi nếu tác giả sử dụng các quá trình suy nghĩ kỳ quái và phức tạp để giải quyết vấn đề. Trong khi đó, mã terse sử dụng tên 2 hoặc 3 ký tự thường có thể dễ hiểu hơn đối với tôi nếu logic rất đơn giản. Tôi đoán bạn có thể đánh giá ngang hàng và xem những gì người khác thích.

Tôi chủ yếu quan tâm đến khả năng bảo trì và quan trọng hơn là sự ổn định. Mã không tìm thấy lý do để thay đổi là mã không có chi phí bảo trì.


1

Tôi sẽ nói một cách để biết là nếu các thành viên mới trong nhóm có thể nhận mã, hiểu mã và sửa đổi nó để sửa lỗi / đáp ứng các yêu cầu mới một cách dễ dàng.


1

Đây là một kỹ thuật tôi thích sử dụng:

Hiển thị mã cho một trong những lập trình viên ngang hàng của bạn và yêu cầu họ giải thích cho bạn biết nó làm gì. Xem cho những điều này.

1) Nếu họ không thể dễ dàng giải thích mục đích của một khối mã tái cấu trúc nó.
2) Nếu họ phải chuyển sang phần mã khác để hiểu phần hiện tại, hãy cấu trúc lại nó.
4) Bất cứ khi nào bạn cảm thấy muốn nói trong quá trình, phần mã đó cần tái cấu trúc. (Mã không nói cho chính nó).


Giả sử lập trình viên ngang hàng ít nhất là có kinh nghiệm và đọc vào ngôn ngữ lập trình và các thành ngữ của nó. Tất cả các kỹ thuật thường như thế này có thể dẫn đến việc mọi người viết mã trong một tập hợp con về tính biểu cảm của ngôn ngữ trong một nỗ lực sai lầm để làm cho int dễ hiểu đối với ngay cả thành viên nhóm nhỏ nhất. Kết quả là một khối mã lớn hơn trong một tập hợp con của ngôn ngữ. Và cho dù bạn có giảm bớt tập hợp ngôn ngữ đến mức nào, 500KLOC của mã tập hợp ngôn ngữ nhỏ sẽ luôn có nhiều công việc để duy trì hơn 200KLOC sử dụng tập hợp con biểu cảm hơn.
dùng1703394

điều này dường như chỉ lặp lại những gì đã được nêu trong câu trả lời hàng đầu
gnat

-1

Mã dễ bảo trì nhất là mã không có ở đó. Vì vậy, thay vì thêm vào số đếm LỘC, mã mới 'giảm' số lượng LỘC (ngay cả khi có thể duy trì ít hơn khi được xem cách ly) có thể làm cho tổng cơ sở mã dễ duy trì hơn chỉ bằng cách giảm kích thước của nó. Do đó, quy tắc chính cho mã duy trì:

  • tối đa hóa KHÔ.

Thứ hai, không có gì tồi tệ hơn cho khả năng bảo trì hơn là phụ thuộc ẩn. Vì vậy, đối với quy tắc số 2:

  • Làm cho tất cả các phụ thuộc của bạn rõ ràng.

Thứ ba, không phải tất cả các lập trình viên đều có kỹ năng như nhau trong việc duy trì hoặc viết bằng cách sử dụng các tính năng hoặc thành ngữ ngôn ngữ kỹ thuật cụ thể nâng cao hơn. Làm giảm toàn bộ cơ sở mã sẽ giúp bạn có một cơ sở mã lớn mà do kích thước của nó khó bảo trì. Cho phép các tính năng và thành ngữ kỹ thuật nâng cao trong toàn bộ mã sẽ làm cho tất cả các mã chỉ có thể được duy trì bởi các nhà phát triển cấp cao, điều gì cũng xấu. Chìa khóa để duy trì là phân lớp dựa trên cấp độ kỹ năng Ví dụ:

Thư viện chéo dự án: nhà phát triển cao cấp, toàn bộ thủ thuật mã / thành ngữ / kỹ thuật Thư viện cụ thể dự án và phụ trợ hệ thống: nhà phát triển trung gian, tránh hầu hết các công cụ tiên tiến và khó giải thích. Người cao niên sẽ đi qua máng mã này để tìm kiếm cơ hội cải thiện DRY.

Front-end: junior devs, sử dụng một hướng dẫn phong cách nghiêm ngặt và tập hợp các kỹ thuật xây dựng ngôn ngữ và thành ngữ để tránh. Các nhà phát triển Medior sẽ đi qua máng mã này để tìm kiếm các cơ hội DRY và logic kinh doanh ẩn.

Vì vậy, đối với quy tắc số 3:

  • Lớp mã của bạn theo cấp độ kỹ năng của nhà phát triển và viết mã duy trì phù hợp.

Tôi


1
điều này dường như không cung cấp bất cứ điều gì đáng kể qua các điểm được thực hiện và giải thích trong 25 câu trả lời trước
gnat

@gnat, tôi đã hy vọng thêm 'sắc thái' cho nhiều sự quá mức (có khả năng gây hại) trong các câu trả lời khác. Đặc biệt với điểm 3.
user1703394

1
@ user1703394 câu hỏi này và câu trả lời của nó là wiki cộng đồng. Nếu bạn cảm thấy câu trả lời hiện có có thể được cải thiện, bạn có thể chỉnh sửa nó ngay cả khi không có đặc quyền "chỉnh sửa bài đăng của người dùng khác".

-2

Nó không bao giờ quá dễ dàng để viết mã dễ đọc và dễ bảo trì, nhưng không khó để viết một mã dễ dàng và có thể duy trì.

OOAD là một từ có bốn chữ cái nhưng thật khó hiểu trong một lần - theo dõi Phân tích & Thiết kế hướng đối tượng

  1. Luôn luôn bắt đầu với một tập hợp yêu cầu tốt và tuyên bố vấn đề chính xác

    • bắt đầu với vài trường hợp sử dụng tức là; Tương tác đối thoại người dùng hệ thống
  2. Bạn phải giữ cho các đối tượng của mình được ghép lỏng lẻo và đảm bảo mã của bạn sẽ không lặp lại - hãy làm theo DRY [Đừng lặp lại chính mình]

    • bất cứ khi nào bạn thấy một bản sao, hãy tìm một nơi để gói gọn
  3. mã của bạn đang mở để mở rộng và đóng để sửa đổi - OCP [Nguyên tắc đóng mở]
  4. Khi bạn thay đổi mã luôn nhớ - Không tạo ra sự cố để giải quyết vấn đề, CNTT chỉ đơn giản là không sửa đổi chức năng hiện có của bạn
  5. Đơn vị kiểm tra mã của bạn
    • luôn kiểm tra mã của bạn khi có sự cố
  6. Trong khi làm việc với chức năng, hãy luôn nhớ tuân theo OOP cơ bản (nguyên tắc hướng đối tượng) và các kỹ thuật để đảm bảo ứng dụng của bạn được thiết kế tốt ngay từ đầu
    • Các đối tượng nên làm những gì tên của họ chỉ ra
    • Mỗi đối tượng nên đại diện cho một khái niệm duy nhất
  7. Luôn nhớ báo cáo sự cố của hệ thống và trong đó phần mềm ngữ cảnh / miền hoạt động
  8. Làm một số công việc giấy tờ - vâng, nó làm việc cho tôi
    • có một số bản in của các công cụ liên quan đến UI và sơ đồ UML luôn hoạt động
    • bạn thậm chí có thể có các ảnh chụp màn hình của phiên động não từ Bảng trắng
  9. Bố cục kiến ​​trúc
  10. Áp dụng các nguyên tắc thiết kế nếu có thể
  11. Tài liệu
    • luôn luôn ghi lại mã của bạn
    • đặt thụt lề trong IDE và tài liệu cũng vậy

1
Đây là lý thuyết không trả lời Làm thế nào để chúng ta định lượng hoặc đo lường chất lượng mã để chúng ta biết nó có thể đọc, dễ hiểu và có thể duy trì? câu hỏi
Jan Doggen

Đã đồng ý !! nhưng nếu chúng ta tuân theo các nguyên tắc đã đề cập ở trên thì thật dễ dàng để đo lường chất lượng mã, dễ đọc, dễ hiểu và rõ ràng có thể duy trì được. Sửa tôi nếu tôi sai.
Narender Parmar

Tôi không biết lý do tại sao câu trả lời của tôi bị hạ thấp, thậm chí tôi đã bao gồm những điểm chính
Narender Parmar
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.