Định dạng (Formatting)

Mục đích của định dạng (The Purpose of Formatting)

  • Mã của bạn viết có thể do người khác bảo trì hoặc nâng cấp mở rộng, bạn cần làm theo quy chuẩn format dành riêng cho team hoặc nhóm làm chung của bạn.

Định dạng chiều dọc (Vertical Formatting)

  • Các tiệp nhỏ thường dễ đọc hơn các file lớn, kích thước mỗi tiệp thường nhỏ hơn 200 dòng.

Format mẫu

1.png

Comments

Comment không bù đấp cho bad code (Comments Do Not Make Up for Bad Code)

  • Thay vì comment cho đoạn code xấu trở nên dễ hiểu, thì hãy viết đoạn mã dễ hiểu để khỏi phải comment.

Comments pháp lý (Legal Comments)

  • Có những nhận xét bắt buộc trước mỗi Class về bản quyền, tên người tạo, những thông tin liên quan.

Nhận xét thêm thông tin (Informative Comments)

  • Ví dụ giải thích cho giá trị trả về của hàm1.png

Làm rõ (Clarification)1.png

Sẽ làm (TODO Comments)1.png

Nhận xét đánh dấu (Position Markers)1.png

 

 

Hàm (Function)

  • Nội dung

    • Nhỏ, ngắn (Small)
    • Khối và thụt đầu dòng (Blocks and Indenting)
    • Chỉ làm 1 việc (Do one thing)
    • Một mức trù tượng của 1 hàm (One Level of Abstraction per Function)
    • Đọc code từ trên xuống (The Stepdown rule)
    • Chuyển đổi câu lệnh (Switch Statements)
    • Sử dụng những tên miêu tả (Use Descriptive Names)
    • Các tham số hàm (Function Arguments)
    • Hình thức đơn thuần, phổ biến (Common Modadic Forms)
    • Đối số là cờ (Flag Arguments)
    • Đối số là các đối tượng (Argument Objects)
    • Đối số là các danh sách (Argument Lists)
    • Động từ và keyword (Verb and Keywords)
    • Tách truy vấn lệnh (Command Query Separation)
    • Ưu tiên ngoại lệ cho mã lỗi (Prefer Exception to Returning Error Code)
    • Truy xuất khối Try/Catch (Extract Try/Catch Blocks)
    • Xử lý lỗi là 1 điều (Error Handing Is One Thing)
    • Đừng lập lại chính nó (Don’t Repeat Yourself)
    • Lập trình có cấu trúc (Structured Programming)
    • Làm thế nào để viết các hàm như thế này (How Do You Write Functions Like This)
    • Kết luận (Conclusion)

Nhỏ, Ngắn gọn – Small

  • Quy tắt đầu tiên của những hàm là cần phải ngắn (small). Những hàm chỉ nên dài 2, 3 hoặc cao nhất là 4 dòng. Mỗi hàm phải rõ ràng, mỗi hàm chỉ có 1 mục đích.

Khối và thụt đầu dòng

  • Mỗi khối lệnh if-else, while-do, do-while, … biểu thức điều kiện cần nằm trên 1 dòng, nếu biểu thức dài quá thì có thể tạo hàm cho biểu thức đó và gọi hàm đó.

Chỉ làm 1 việc

  • Để biết 1 hàm làm bao nhiêu việc, thì với mỗi lời gọi hàm trong đó nghĩa là nó làm 1 việc.
  • Nếu 1 hàm làm nhiều việc hơn tên hàm nó đặt thì hàm đó là hàm nhiều việc, còn nếu 1 hàm làm những việc giống với tên hàm thì hàm đó chỉ làm 1 việc.

Tham số của hàm

  • Chỉ nên đặt từ 3 tham số trở lại
  • Tham số của hàm không nên đặt biến boolean, nếu có 2 trường hợp nên chia thành 2 hàm.
  • Ưu tiên ngoại lệ cho hàm có nhiều mã lỗi.1.pngthay bằng1.png thay như vầy sẽ đẹp hơn 1.png

Tên có ý nghĩa (Meaningful Names)

  • Giới thiệu

    • Tên có khắp mọi nơi trong phần mềm của bạn. Chúng ta có tên của biến, tên của hàm, tên của tham số, lớp, và các gói. Chúng ta có tên của bộ mã nguồn và tên của các thư mục chứa chúng. Chúng ta có tên của  tập tin .jar và war files và ear files. Vì chúng ta làm nhiều với nó. Chúng ta sẽ làm nót tốt hơn (We woud better do it well).
    • Những gì dưới đây là một số quy tắt đơn giản để tạo một cái tên tốt.
  • Sử dụng tên “thể hiện rõ ý nghĩa

    • Chăm sóc tên của bạn và thay đổi chúng thi bạn tìm thấy 1 cái tên tốt hơn. Những người đọc code của bạn (bao gồm bạn) sẽ thấy hạnh phúc hơn nếu bạn làm điều này.
    • Tên của một biến, hàm, hoặc lớp, cần trả lời các câu hỏi lớn. Nó cần nói cho bạn biết nó tại sao nó tồn tại, những gì nó làm và nó được sử dụng như thế nào. Nếu một tên yêu cầu 1 coment thì cái tên đó không thể hiện được ý định của nó.
    • 1.png
    • Cái tên không nói lên gì cả. Nó không gợi lên một cảm giác của thời gian trôi qua, cũng không của ngày. Chúng ta cần chọn một tên mà tên này cần phải định nghĩa rõ những gì nó đang đo và là một đại lượng đo lường (measure-ment)
    • 1.png
    • Chọn những tên mà nó thể hiện được ý định mà nó có thể giúp bạn hiểu cà thay đổi code. Mục đinh của đoạn mã bên dưới là gì?
    • 1.png
    • Tại sao lại khó có thể nói đoạn mã này đang làm gì? Nó không phải biểu thức phức tạp. Khoảng cách và thụt đầu dòng là hợp lý. Nó chỉ có 3 biến và 2 hằng số được đề cập. Thậm chí, chúng không có lớp lạ và phương thước đa hình, chỉ có 1 danh sách của mảng.
    • Vấn đề không phải là sự đơn giản của đoạn code nhưng nó là “the implicity” của đoạn mã. Đoạn mã yêu cầu phải trả lời cho chúng ta biết các câu hỏi sau:
  1. Những thứ gì có trong theList?
  2. Ý nghĩa của chỉ số zeroth của một phần tử trong theList?
  3. Ý nghĩa của giá trị  4 là gì?
  4. Làm cách nào để sử dụng được danh sách trả về? 

Câu trả lời cho những câu hỏi này không có chung 1 mẫu, nhưng chúng có thể có. Giả sử chúng ta đang làm một trò chơi quét mìn. Chúng ta tìm thấy “board” là 1 danh sách của các “cell” được gọi là theList. Chúng ta đổi tên lại thành gameBoard.

Mỗi cell trên boad được biểu diễn là một mảng đơn giản. Chúng ta tiếp tục thấy rằng zeroth mô tả giá trị của trạng thái và giá trị của số 4 sẽ được gắn cờ “Flagged”. Chỉ bằng cách đưa ra những khái niệm của tên, chúng ta có thể cải thiện đáng kể đoạn mã:

1

Lưu ý rằng sự đơn giản của đoạn mã không thay đổi. Nó đã trở nên rõ ràng hơn rất nhiều. Chúng ta có thể đi xa hơn nữa để viết một class đơn giản cho các cell thay thế việc sử dụng các số nguyên. Nó có thể bao gồm các hàm “intention-revealing” để ẩn đi các con số ảo (4). Đây là kết quả trên một phiên bản mới của hàm:

1.png

Với những thay đổi tên đơn giản, nó không có khăn cho việc hiểu chuyện gì đang xảy ra. Đây là sức mạnh của việc thay đổi tên.

  • Sử dụng tên có thể phát âm

    • Con người rất giỏi từ ngữ. Một phần quan trọng của bộ não dành riêng cho khái niệm về từ ngữ. Nếu như bạn không thể phát âm nó, bạn sẽ nói chuyện như một thằng ngốc. So sánh:
    • 1
    • Rõ ràng chúng ta đã tạo ra một lớp có thể phát âm chính xác.
  • Tiền tố

    • Không nên làm tiền tố hoặc hậu tố của biến
    • 1.png
    • 1.png
  • Đặt tên

    • Đặt tên lớp là một danh từ danh từ hoặc cụm danh từ ví dụ: Customer, WikiPage, Account, và AddressPerser.
    • Đặt tên hàm là một động từ hoặc cụm động từ như: get, set và is
    • Thêm ngữ cảnh có ý nghĩa, lớp bên dưới
    • 1.png
    • 1.png