Searching...
Tiếng Việt
English
Español
简体中文
Français
Deutsch
日本語
Português
Italiano
한국어
Русский
Nederlands
العربية
Polski
हिन्दी
Tiếng Việt
Svenska
Ελληνικά
Türkçe
ไทย
Čeština
Română
Magyar
Українська
Bahasa Indonesia
Dansk
Suomi
Български
עברית
Norsk
Hrvatski
Català
Slovenčina
Lietuvių
Slovenščina
Српски
Eesti
Latviešu
فارسی
മലയാളം
தமிழ்
اردو
Clean Code

Clean Code

A Handbook of Agile Software Craftsmanship
by Robert C. Martin 2008 464 pages
Programming
Computer Science
Technology
Nghe

Điểm chính

1. Viết mã sạch dễ đọc và bảo trì

Chỉ số đo lường chất lượng mã duy nhất: WTFs/phút

Đọc dễ hiểu là quan trọng nhất. Mã sạch nên dễ hiểu bởi các nhà phát triển khác. Nó nên đơn giản, thanh lịch và không lộn xộn. Cố gắng viết mã thể hiện rõ ý định của nó mà không cần nhiều chú thích. Sử dụng tên biến và hàm có ý nghĩa, giữ cho các hàm nhỏ gọn và tập trung, và tổ chức mã một cách logic.

Bảo trì giúp phát triển. Mã khó thay đổi trở thành gánh nặng. Thiết kế mã của bạn để linh hoạt và mô-đun để có thể thích ứng với các yêu cầu thay đổi. Tuân theo các nguyên tắc như DRY (Don't Repeat Yourself) và SOLID để tạo ra các hệ thống kết hợp lỏng lẻo và có tính kết hợp cao. Tái cấu trúc mã không thương tiếc để cải thiện cấu trúc mã mà không thay đổi hành vi.

Mã sạch mang lại lợi ích. Mặc dù viết mã sạch đòi hỏi nỗ lực ban đầu nhiều hơn, nhưng nó tiết kiệm thời gian và giảm đau đầu về lâu dài. Mã sạch dễ gỡ lỗi, mở rộng và bảo trì hơn. Nó giúp các nhà phát triển làm việc hiệu quả hơn và giảm nguy cơ giới thiệu lỗi trong quá trình thay đổi. Hãy làm cho mã sạch trở thành một phần cốt lõi trong thực hành phát triển của bạn.

2. Tuân theo các quy ước đặt tên có ý nghĩa

Tên của một biến, hàm hoặc lớp nên trả lời tất cả các câu hỏi lớn. Nó nên cho bạn biết tại sao nó tồn tại, nó làm gì và cách nó được sử dụng.

Sử dụng tên tiết lộ ý định. Chọn tên rõ ràng truyền đạt mục đích và hành vi của các biến, hàm và lớp. Tránh các tên một chữ cái hoặc viết tắt khó hiểu. Sử dụng tên có thể phát âm và dễ tìm kiếm. Ví dụ:

  • Xấu: d (thời gian đã trôi qua tính bằng ngày)
  • Tốt: elapsedTimeInDays

Nhất quán và chính xác. Sử dụng các quy ước đặt tên nhất quán trong toàn bộ mã của bạn. Chính xác để tránh mơ hồ - ví dụ, sử dụng các phân biệt có ý nghĩa như getActiveAccounts() và getActiveAccountInfo(). Tránh các mã hóa hoặc tiền tố thêm tiếng ồn mà không có giá trị. Tên lớp nên là danh từ, tên phương thức nên là động từ.

Độ dài tên nên phù hợp với phạm vi. Sử dụng tên dài hơn, mô tả hơn cho các biến và hàm có phạm vi lớn hơn. Tên ngắn chấp nhận được cho các phạm vi nhỏ, cục bộ. Độ dài của tên nên tỷ lệ thuận với phạm vi sử dụng của nó. Tối ưu hóa cho khả năng đọc và hiểu trong ngữ cảnh nơi tên được sử dụng.

3. Giữ các hàm nhỏ gọn và tập trung

Các hàm nên làm một việc. Chúng nên làm tốt việc đó. Chúng nên chỉ làm việc đó.

Nhỏ là đẹp. Các hàm nên nhỏ - thường từ 5-10 dòng. Chúng nên vừa trên một màn hình và dễ hiểu ngay lập tức. Trích xuất mã vào các hàm trợ giúp có tên rõ ràng thay vì viết các hàm dài và phức tạp. Các hàm nhỏ dễ hiểu, kiểm tra và bảo trì hơn.

Làm một việc tốt. Mỗi hàm nên có một mục đích rõ ràng. Nếu một hàm đang làm nhiều việc, hãy trích xuất những việc đó thành các hàm riêng biệt. Dấu hiệu cho thấy một hàm đang làm quá nhiều bao gồm:

  • Nhiều mức độ trừu tượng
  • Nhiều phần hoặc khối mã
  • Nhiều tham số

Duy trì một mức độ trừu tượng. Các câu lệnh trong một hàm nên ở cùng một mức độ trừu tượng. Đừng trộn lẫn logic cấp cao với chi tiết cấp thấp. Trích xuất các hoạt động cấp thấp vào các hàm riêng biệt. Điều này cải thiện khả năng đọc bằng cách giữ cho các hàm tập trung và đơn giản về mặt khái niệm.

4. Thực hành định dạng và tổ chức đúng cách

Định dạng mã là về giao tiếp, và giao tiếp là công việc đầu tiên của nhà phát triển chuyên nghiệp.

Định dạng nhất quán là quan trọng. Sử dụng thụt lề, ngắt dòng và khoảng cách nhất quán trong toàn bộ mã của bạn. Điều này cải thiện khả năng đọc và giảm tải nhận thức. Đồng ý về các tiêu chuẩn định dạng với nhóm của bạn và sử dụng các công cụ tự động để thực thi chúng. Các hướng dẫn định dạng chính bao gồm:

  • Thụt lề đúng cách
  • Đặt dấu ngoặc nhất quán
  • Ngắt dòng logic
  • Khoảng trắng phù hợp

Tổ chức mã một cách logic. Nhóm các mã liên quan lại với nhau và tách các mã không liên quan. Sử dụng các dòng trống để tạo các "đoạn văn" giữa các phần logic. Đặt các hàm liên quan gần nhau. Giữ các tệp tập trung vào một khái niệm hoặc thành phần duy nhất. Chia các tệp lớn thành các tệp nhỏ hơn, tập trung hơn khi cần thiết.

Tuân theo các quy ước tiêu chuẩn. Tuân thủ các quy ước tiêu chuẩn cho ngôn ngữ và cộng đồng của bạn. Điều này làm cho mã của bạn trở nên quen thuộc và dễ tiếp cận hơn với các nhà phát triển khác. Ví dụ, trong Java:

  • Tên lớp sử dụng PascalCase
  • Tên phương thức sử dụng camelCase
  • Hằng số sử dụng ALL_CAPS

5. Quản lý phụ thuộc và tránh trùng lặp

Trùng lặp có thể là gốc rễ của mọi điều xấu trong phần mềm.

Loại bỏ trùng lặp. Mã trùng lặp là một cơ hội bị bỏ lỡ để trừu tượng hóa. Khi bạn thấy trùng lặp, hãy trích xuất mã chung thành một hàm hoặc lớp có thể tái sử dụng. Điều này cải thiện khả năng bảo trì bằng cách tập trung hóa logic và giảm nguy cơ thay đổi không nhất quán. Các loại trùng lặp cần chú ý:

  • Các khối mã giống hệt nhau
  • Các thuật toán tương tự với các biến thể nhỏ
  • Các chuỗi switch/case hoặc if/else lặp lại

Quản lý phụ thuộc cẩn thận. Giảm thiểu phụ thuộc giữa các mô-đun để giảm sự kết hợp. Sử dụng tiêm phụ thuộc và đảo ngược điều khiển để làm cho mã mô-đun và dễ kiểm tra hơn. Tuân theo Nguyên tắc Đảo ngược Phụ thuộc - phụ thuộc vào các trừu tượng, không phải các cụ thể. Điều này làm cho mã của bạn linh hoạt hơn và dễ thay đổi hơn.

Sử dụng nguyên tắc ít kiến thức nhất. Một mô-đun không nên biết về nội dung của các đối tượng mà nó thao tác. Điều này giảm sự kết hợp giữa các mô-đun. Ví dụ, sử dụng Luật Demeter - một phương thức chỉ nên gọi các phương thức trên:

  • Đối tượng của chính nó
  • Các đối tượng được truyền làm tham số
  • Các đối tượng nó tạo ra
  • Các đối tượng thành phần trực tiếp của nó

6. Xử lý lỗi một cách tinh tế

Xử lý lỗi là quan trọng, nhưng nếu nó làm mờ logic, thì nó sai.

Sử dụng ngoại lệ thay vì mã lỗi. Ngoại lệ sạch hơn và không làm lộn xộn logic chính của mã của bạn. Chúng cho phép xử lý lỗi được tách biệt khỏi đường dẫn chính. Khi sử dụng ngoại lệ:

  • Tạo thông báo lỗi thông tin
  • Cung cấp ngữ cảnh với ngoại lệ
  • Định nghĩa các lớp ngoại lệ dựa trên nhu cầu của người gọi

Đừng trả về null. Trả về null dẫn đến các ngoại lệ con trỏ null và làm lộn xộn mã với các kiểm tra null. Thay vào đó:

  • Trả về các bộ sưu tập rỗng thay vì null cho danh sách
  • Sử dụng mẫu Đối tượng Null
  • Sử dụng Optional trong Java hoặc Maybe trong các ngôn ngữ hàm

Viết các câu lệnh try-catch-finally trước. Bắt đầu với try-catch-finally khi viết mã có thể ném ngoại lệ. Điều này giúp xác định phạm vi và kỳ vọng cho mã gọi. Nó đảm bảo rằng các tài nguyên được quản lý và giải phóng đúng cách, ngay cả trong các tình huống lỗi.

7. Viết các bài kiểm tra đơn vị kỹ lưỡng

Mã kiểm tra cũng quan trọng như mã sản xuất.

Tuân theo ba luật của TDD. Phát triển theo hướng kiểm tra (TDD) cải thiện chất lượng và thiết kế mã:

  1. Viết một bài kiểm tra thất bại trước khi viết bất kỳ mã sản xuất nào
  2. Chỉ viết đủ bài kiểm tra để chứng minh một thất bại
  3. Chỉ viết đủ mã sản xuất để vượt qua bài kiểm tra

Giữ các bài kiểm tra sạch và dễ bảo trì. Áp dụng các tiêu chuẩn chất lượng mã tương tự cho các bài kiểm tra của bạn như đối với mã sản xuất. Tái cấu trúc và cải thiện mã kiểm tra thường xuyên. Các bài kiểm tra được cấu trúc tốt phục vụ như tài liệu và cho phép tái cấu trúc mã sản xuất một cách không sợ hãi.

Nhắm đến phạm vi kiểm tra toàn diện. Viết các bài kiểm tra bao gồm các trường hợp cạnh, điều kiện biên và các tình huống lỗi - không chỉ đường dẫn hạnh phúc. Sử dụng các công cụ đo lường phạm vi kiểm tra để xác định các khoảng trống trong phạm vi kiểm tra. Nhớ rằng phạm vi 100% không đảm bảo mã không có lỗi, nhưng nó cung cấp sự tự tin trong việc tái cấu trúc và thay đổi.

8. Tái cấu trúc mã liên tục

Để lại khu cắm trại sạch hơn bạn đã tìm thấy nó.

Tái cấu trúc cơ hội. Cải thiện cấu trúc mã bất cứ khi nào bạn làm việc trên một phần mã. Tuân theo Quy tắc Hướng đạo: để lại mã tốt hơn bạn đã tìm thấy nó. Các cải tiến nhỏ, gia tăng cộng dồn theo thời gian và ngăn chặn sự mục nát của mã. Các kỹ thuật tái cấu trúc phổ biến bao gồm:

  • Trích xuất các phương thức hoặc lớp
  • Đổi tên để rõ ràng
  • Đơn giản hóa các điều kiện phức tạp
  • Loại bỏ trùng lặp

Tái cấu trúc an toàn với các bài kiểm tra. Luôn có một bộ bài kiểm tra vững chắc trước khi tái cấu trúc. Thực hiện các thay đổi nhỏ, gia tăng và chạy các bài kiểm tra thường xuyên. Điều này giúp bạn tự tin rằng các thay đổi của bạn không phá vỡ chức năng hiện có. Sử dụng các công cụ tái cấu trúc tự động khi có sẵn để giảm nguy cơ giới thiệu lỗi.

Cân bằng tái cấu trúc với việc cung cấp giá trị. Mặc dù tái cấu trúc liên tục là quan trọng, đừng để nó làm tê liệt tiến độ. Nhắm đến "đủ tốt" thay vì hoàn hảo. Tập trung nỗ lực tái cấu trúc vào các khu vực mã có vấn đề nhất hoặc thay đổi thường xuyên nhất. Truyền đạt giá trị của tái cấu trúc cho các bên liên quan để đảm bảo hỗ trợ cho việc cải thiện mã liên tục.

9. Áp dụng các nguyên tắc lập trình hướng đối tượng và hàm

Các đối tượng ẩn dữ liệu của chúng đằng sau các trừu tượng và lộ ra các hàm hoạt động trên dữ liệu đó. Các cấu trúc dữ liệu lộ ra dữ liệu của chúng và không có các hàm có ý nghĩa.

Sử dụng các nguyên tắc hướng đối tượng một cách khôn ngoan. Áp dụng các nguyên tắc như đóng gói, kế thừa và đa hình để tạo ra các thiết kế linh hoạt, mô-đun. Tuân theo các nguyên tắc SOLID:

  • Nguyên tắc Trách nhiệm Đơn lẻ
  • Nguyên tắc Mở-Đóng
  • Nguyên tắc Thay thế Liskov
  • Nguyên tắc Phân tách Giao diện
  • Nguyên tắc Đảo ngược Phụ thuộc

Tận dụng các khái niệm lập trình hàm. Ngay cả trong các ngôn ngữ hướng đối tượng, các kỹ thuật lập trình hàm có thể dẫn đến mã sạch hơn:

  • Các hàm thuần túy không có tác dụng phụ
  • Dữ liệu bất biến
  • Các hàm bậc cao
  • Thành phần hàm

Chọn cách tiếp cận phù hợp cho vấn đề. Các mô hình hướng đối tượng và hàm đều có điểm mạnh và điểm yếu. Sử dụng thiết kế hướng đối tượng khi bạn cần mô hình hóa các miền phức tạp với hành vi. Sử dụng các cách tiếp cận hàm cho việc biến đổi và xử lý dữ liệu. Nhiều ngôn ngữ hiện đại hỗ trợ cách tiếp cận lai, cho phép bạn sử dụng công cụ tốt nhất cho từng phần của hệ thống của bạn.

10. Cân nhắc kỹ lưỡng về đồng thời

Đồng thời là một chiến lược tách rời. Nó giúp chúng ta tách rời những gì được thực hiện khỏi khi nào nó được thực hiện.

Hiểu các thách thức của đồng thời. Lập trình đồng thời giới thiệu sự phức tạp và tiềm năng cho các lỗi tinh vi. Các vấn đề phổ biến bao gồm:

  • Điều kiện đua
  • Deadlocks
  • Tín hiệu bị bỏ lỡ
  • Vấn đề hiển thị bộ nhớ

Tách biệt các mối quan tâm về đồng thời. Giữ mã liên quan đến đồng thời tách biệt khỏi mã khác. Điều này làm cho nó dễ hiểu và kiểm tra hơn. Sử dụng các trừu tượng như Executors, Futures và Actors để quản lý đồng thời thay vì làm việc với các luồng thô.

Ưu tiên tính bất biến và các hàm thuần túy. Các đối tượng bất biến và các hàm thuần túy là an toàn với luồng. Chúng loại bỏ nhiều vấn đề đồng thời bằng cách tránh trạng thái có thể thay đổi được chia sẻ. Khi trạng thái có thể thay đổi là cần thiết, sử dụng các kỹ thuật đồng bộ hóa đúng cách và xem xét sử dụng các biến nguyên tử hoặc các bộ sưu tập đồng thời.

Last updated:

Đánh giá

4.37 out of 5
Average of 21k+ ratings from Goodreads and Amazon.

Mã Sạch nhận được nhiều đánh giá tích cực về các nguyên tắc viết mã dễ đọc và dễ bảo trì. Độc giả đánh giá cao những lời khuyên thực tế về cách đặt tên, chức năng và kiểm thử. Tuy nhiên, cuốn sách bị chỉ trích vì tập trung quá nhiều vào Java và một số hướng dẫn quá nghiêm ngặt. Nhiều người coi đây là tài liệu cần thiết cho các nhà phát triển, mặc dù một số người cho rằng nó ít hữu ích hơn cho các lập trình viên có kinh nghiệm. Các nghiên cứu trường hợp và ví dụ về tái cấu trúc được một số người khen ngợi nhưng cũng bị chỉ trích bởi những người khác là quá mức. Nhìn chung, các nhà phê bình đồng ý rằng cuốn sách cung cấp những hiểu biết quý giá về chất lượng mã, ngay cả khi không phải tất cả các đề xuất đều có thể áp dụng rộng rãi.

Về tác giả

Robert Cecil Martin, được biết đến với tên gọi Uncle Bob, là một kỹ sư phần mềm và nhà tư vấn nổi tiếng. Ông ủng hộ các phương pháp phát triển Agile và là chủ tịch của Object Mentor Inc. Chuyên môn của Martin bao gồm Thiết kế Hướng đối tượng, Mẫu thiết kế, UML và Lập trình Cực đoan. Ông đã làm việc với các khách hàng trên toàn thế giới, chia sẻ kiến thức của mình thông qua các buổi tư vấn và diễn thuyết. Martin từng là Tổng biên tập của tạp chí C++ Report từ năm 1996 đến 1999. Ông là một nhân vật nổi bật trong cộng đồng phát triển phần mềm, thường xuyên thuyết trình tại các hội nghị và triển lãm quốc tế. Ảnh hưởng của ông không chỉ dừng lại ở công việc tư vấn mà còn lan tỏa qua các cuốn sách và bài viết về nghề thủ công phần mềm và các thực hành tốt nhất.

0:00
-0:00
1x
Create a free account to unlock:
Bookmarks – save your favorite books
History – revisit books later
Ratings – rate books & see your ratings
Listening – audio summariesListen to the first takeaway of every book for free, upgrade to Pro for unlimited listening.
🎧 Upgrade to continue listening...
Get lifetime access to SoBrief
Listen to full summaries of 73,530 books
Save unlimited bookmarks & history
More pro features coming soon!
How your free trial works
Create an account
You successfully signed up.
Today: Get Instant Access
Listen to full summaries of 73,530 books.
Day 4: Trial Reminder
We'll send you an email reminder.
Cancel anytime in just 15 seconds.
Day 7: Trial Ends
Your subscription will start on Sep 26.
Monthly$4.99
Yearly$44.99
Lifetime$79.99