Khái quát Tiêu chuẩn lập trình C++ và 101 quy tắc

Estimated reading: 10 minutes 121 views

Khái quát Tiêu chuẩn lập trình C++ và 101 quy tắc.

Phần 1: Tổ chức và Chính sách

0. Đừng lo lắng về những gì không quan trọng (Hoặc: Biết rõ những gì không cần tiêu chuẩn hóa)

1. Biên dịch sạch sẽ ở mức độ cảnh báo cao

2. Xây dựng hệ thống Build hoàn toàn tự động

3. Sử dụng một hệ thống quản lý phiên bản (Version)

4. Đầu tư thời gian cho review code

Phần 2: Phong cách Thiết kế

5. Một thực thể (Entity) / Một nhiệm vụ

6. Chính xác, Đơn giản, Rõ Ràng

7. Biết rõ khi nào và cách lập trình mở rộng quy mô

8. Không tối ưu hóa một cách hấp tấp

9. Không gây áp lực cho máy (Hoặc: Phải viết mã hiệu quả cho máy)

10. Tối thiểu biến toàn cục và dữ liệu chia sẻ chung

11. Che giấu thông tin

12. Biết rõ Khi nào và Như thế nào để lập trình song song

13. Chắc chắn rằng tài nguyên được sở hữu bởi các đối tượng (objects). Hãy sử dụng ngăn xếp RAII và con trỏ thông minh (smart pointers)

Phần 3: Phong cách lập trình (Viết mã)

14. Thà có lỗi biên dịch (compiler) và lỗi liên kết (linker) còn hơn lỗi khi chạy chương trình (run-time)

15. Tích cực sử dụng const

16. Tránh dùng Macro

17. Tránh dùng các con số ma thuật (magic number)

18. Khai báo biến càng cục bộ càng tốt

19. Luôn luôn khởi tạo biến

20. Tránh hàm dài. Tránh rẽ nhánh sâu.

21. Tránh việc khởi tạo phụ thuộc qua lại giữa những đơn vị trình biên dịch

22. Tối thiểu những định nghĩa phụ thuộc. Tránh những phụ thuộc qua lại/ tuần hoàn.

23. Hãy làm cho các File Header tự lập

24. Luôn viết #include bảo vệ bên trong. Không bao giờ viết #include bảo vệ bên ngoài.

Phần 4. Hàm và Toán tử

25. Truyền tham số theo giá trị, con trỏ (thông minh) hay tham chiếu cho hợp lý

26. Sử dụng ngữ nghĩa tự nhiên cho nạp chồng toán tử

27. Sử dụng thể chính tắc cho các toán tử toán học và toán tử gán

28. Nên sử dụng thể chính tắc cho “++”, “- -“. Nên sử dụng ở dạng tiền tố.

29. Xem xét việc nạp chồng toán tử để loại bỏ những chuyển đổi kiểu ngầm định

30. Tránh nạp chồng toán tử “&&”, “||”, “,”

31. Không viết code phụ thuộc vào thứ tự tham số

Phần 5. Thiết kế Lớp và Kế thừa

32. Hiểu rõ loại class mà bạn đang viết

33. Những class nhỏ vẫn hơn những class đơn khối

34. Hợp thành tốt hơn Kế thừa

35. Không kế thừa từ những class không được thiết kế làm lớp cơ sở

36. Nên cung cấp những giao diện ảo

37. Kế thừa Public mang tính chất cung cấp sự thay thế. Hãy kế thừa không cho mục đích “sử dụng lại” mà cho “được sử dụng lại”.

38. Ghi đè (overriding) một cách an toàn

39. Nên tạo những hàm ảo không public (virtual functions nonpublic) và những hàm public không ảo (public functions nonvirtual)

40. Từ chối chuyển đổi kiểu ngầm định

41. Tạo biến thành viên private, trừ kiểu tập hợp dữ liệu không hành vi (cấu trúc trong C)

42. Không làm lộ thông tin bên trong

43. Sử dụng pimpl cho khôn ngoan

44. Hãy viết hàm phi thành viên, không là hàm bạn (nonmember nonfriend functions)

45. Luôn cung cấp new và delete cùng nhau

46. Nếu cung cấp new đặc thù, hãy cung cấp theo tiêu chuẩn (plain, in-place and nothrow)

Phần 6. Hàm tạo, Hàm huỷ và Toán tử gán sao chép

47. Định nghĩa và khởi tạo biến thành viên theo cùng thứ tự

48. Trong hàm tạo sử dụng khởi tạo tốt hơn là gán

49. Không gọi hàm ảo trong hàm tạo và hàm hủy

50. Tạo hàm hủy của lớp cơ sở public và virtual, hoặc protected và nonvirtual

51. Hàm hủy, Giải phóng tài nguyên và Swap không được thất bại

52. Copy và phá hủy phải thống nhất

53. Phải rõ ràng việc có thể hay không thể copy

54. Từ chối cắt đối tượng (object slicing). Trong lớp cơ sở sử dụng Clone thay vì copy.

55. Hãy tạo toán tử gán chính tắc

56. Trong tất cả trường hợp thông thường, cung cấp hàm swap không thất bại (và chính xác)

Phần 7. Không gian tên và Module

57. Đặt kiểu và interface hàm phi thành viên trong cùng không gian tên

58. Đặt các kiểu và hàm trong các không gian tên riêng, trừ khi chủ định làm việc cùng nhau

59. Không sử dụng không gian tên trong file tiêu đề (header) hoặc trước #include

60. Không cấp phát và giải phóng bộ nhớ ở các module khác nhau

61. Không định nghĩa các chủ thế liên kết ngoài trong file tiêu đề (header)

62. Không truyền ngoại lệ (exception) ra ngoài biên giới module

63. Sử dụng kiểu với đầy đủ tính dùng lại cho giao diện module

Phần 8. Template và Tính linh hoạt

64. Cẩn trọng khi trộn lẫn giữa đa hình tĩnh và động (static and dynamic polymorphism)

65. Sửa đổi template phải có ý đồ và rõ ràng

66. Không đặc thù hóa các template hàm

67. Không vô tình viết mã không mang tính linh hoạt

Phần 9. Xử lý lỗi và Ngoại lệ

68. Sử dụng assert để làm rõ những điều kiện bên trong và điều kiện bất biến

69. Thiết lập chính sách xử lý lỗi hợp lý và làm theo một cách nghiêm khắc

70. Phân biệt giữa lỗi và không lỗi

71. Viết mã code an toàn với lỗi

72. Hãy báo cáo lỗi bằng sử dụng ngoại lệ

73. Với ngoại lệ, throw bằng giá trị, catch bằng tham chiếu

74. Báo cáo, xử lý và phiên dịch lỗi hợp lý

75. Tránh viết mã có thông số ngoại lệ

Phần 10. STL:Lưu trữ

76. Sử dụng vector theo mặc định. Nếu không, hãy chọn một container phù hợp.

77. Sử dụng vector và string thay cho mảng

78. Sử dụng vector (và string::c_str) để trao đổi dữ liệu với các API không phải C++

79. Trong container, chỉ lưu trữ các giá trị và con trỏ thông minh

80. Nên sử dụng push_back khi mở rộng chuỗi (sequence)

81. Ưu tiên các phép toán phạm vi hơn các phép toán phần tử đơn

82. Sử dụng các mẹo được chấp nhận để giảm dung lượng và xoá các phần tử

Phần 11. STL:Thuật toán

83. Hãy sử dụng phiên bản debug của STL (đã được kiểm tra kỹ)

84. Ưu tiên gọi thuật toán có sẵn hơn là vòng lặp viết tay

85. Sử dụng thuật toán tìm kiếm STL phù hợp

86. Sử dụng đúng thuật toán sắp xếp STL

87. Tạo các hàm predicate thuần khiết

88. Với tham số của các giải thuật hay bộ so sánh, nên dùng đối tượng hàm hơn là hàm

89. Viết chính xác các đối tượng hàm

Phần 12. Kiểu an toàn

90. Từ chối switch, nên sử dụng tính đa hình

91. Tin vào kiểu dữ liệu chứ không phải cách biểu diễn dữ liệu trong bộ nhớ

92. Tránh sử dụng reinterpret_cast

93. Tránh sử dụng static_cast ở con trỏ

94. Tránh ép kiểu bỏ const

95. Tránh ép kiểu phong cách ngôn ngữ C

96. Không dùng memcpy hoặc memcmp mà không phải POD

97. Không sử dụng union để diễn giải lại biểu diễn dữ liệu

98. Không sử dụng varargs (kí hiệu rút gọn)

99. Không sử dụng các đối tượng hết hiệu lực. Không sử dụng các hàm không an toàn.

100. Không xử lý mảng theo kiểu đa hình

Leave a Comment

Chia sẻ:

Khái quát Tiêu chuẩn lập trình C++ và 101 quy tắc

Or copy link

CONTENTS