Guest User

Untitled

a guest
Dec 16th, 2017
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.95 KB | None | 0 0
  1. API: Application Program Interface
  2. ABI: Application Binary Interface
  3. -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  4. P: Philosophy
  5. Mang tính triết lý không có miêu tả code rõ ràng. Áp dụng theo tư tưởng
  6.  
  7. P.1: Express ideas directly in code
  8. Thể hiện rõ ý tưởng trong code
  9. Reason: Bởi vì trình biên dịch không ̉ọc comments hay tài liệu thiết kế. Vì vậy lập trình viên cần tường minh, khai bá rõ ràng mục đích khi code. Tránh gây nhầm lẫn khó hiểu tối nghĩa.
  10. VD: setRotate(float r) Tối nghĩa vì không rõ r là gì. đơn vị radian hay deg
  11. VD: thay vì tìm kiếm theo vòng for thì sử dụng std::find sẽ rõ nghĩa hơn
  12.  
  13. P.2: Write in ISO Standard C++
  14. Sử dụng thư viện chuẩn
  15.  
  16. P.3: Express intent
  17. Ngoài việc sử dụng hàm, tên hàm code rõ nội dung như ở P.1 thì lập trình viên cũng cần kiểm soát bắt chặt mục đích mong muốn thực hiện theo logic
  18.  
  19. P.4: Ideally, a program should be statically type safe
  20. Hãy khai báo và sử dụng kiểu dữ liệu một cách an toàn, giảm thiểu việc ép kiểu, các dạng dữ liệu nhập nhằng không tường minh, độ tin cậy thấp
  21.  
  22. P.5: Prefer compile-time checking to run-time checking
  23. Hãy cố gắng kiểm tra code trong quá trình biên dịch
  24.  
  25. P.6: What cannot be checked at compile time should be checkable at run time
  26. Những gì không thể check trong quá trình biên dịch thì cần phải check trong quá trình chạy
  27.  
  28. P.7: Catch run-time errors early
  29. Cần tìm và khắc phục các lỗi trong quá trình runtime sớm
  30.  
  31. P.8: Don’t leak any resources
  32. Không được rò rỉ bất cứ nguổn tài nguyên nào. Tất cả được tao ra vầ cẩn phải huỷ bỏ ngay sau đó khi không sử dụng
  33.  
  34. P.9: Don’t waste time or space
  35. Không lãng phí thời gian và không gian
  36.  
  37. P.10: Prefer immutable data to mutable data
  38. Sử dụng dữ liệu không thay đổi tốt hơn so với dữ liệu thay đổi
  39.  
  40. P.11: Encapsulate messy constructs, rather than spreading through the code
  41. Đóng gói các mã lệnh có cấu trúc lộn xộn thay vì cứ lan rộng code ra. Tuy rằng có thể tối ưu tăng hiệu suất hơn nhưng lại tiềm ẩn lỗi và khó viết
  42.  
  43. P.12: Use supporting tools as appropriate
  44. Sử dụng các công cụ hỗ trợ tích hợp, nó sẽ tốt hơn trong việc tự sinh code, quản lý phân tích code... đo hiệu suắt
  45.  
  46. P.13: Use support libraries as appropriate
  47. Sử dụng các thư viện hỗ trợ nếu như nó thích hợp
  48. ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  49. I: Interfaces
  50. Giao diện nó như một giao kèo giữa nhà cung cấp dịch vụ và người sử dụng dịch vụ. Nó sẽ giúp cho mọi thứ dễ hiểu, khuyến khích sử dụng hiệu quả, không dê bị lỗi, hỗ trợ thử nghiệm
  51.  
  52. I.1: Make interfaces explicit
  53. Tạo ra một giao diện rõ ràng. Các hàm nên chỉ làm đúng nhiệm vụ và phạm vi của mình không truy suất vào biến toàn cục cũng như tự đưa ra quyết định về luồng dựa trên giá trị biến nằm ngoài phạm vi
  54.  
  55. I.2: Avoid global variables
  56. Tránh sử dụng các biến toàn cục
  57.  
  58. I.3: Avoid singletons
  59. Tránh sử dụng singletons
  60.  
  61. I.4: Make interfaces precisely and strongly typed
  62. Xây dựng giao diện đơn giản rõ ràng
  63.  
  64. I.5: State preconditions (if any)
  65. Hạn chế các tham số đầu vào
  66.  
  67. I.6: Prefer Expects() for expressing preconditions
  68. Hãy sử dụng Expects cho những điều kiện kiên quyết
  69.  
  70. I.7: State postconditions
  71. Xem xét giá trị trước khi trở về
  72.  
  73. I.8: Prefer Ensures() for expressing postconditions
  74. Sử dụng Expects để kiểm tra giá trị trước khi trả về
  75.  
  76. I.9: If an interface is a template, document its parameters using concepts
  77. Nếu như giao diện được tạo bởi template
  78.  
  79. I.10: Use exceptions to signal a failure to perform a required task
  80. Sử dụng ngoại lệ để báo hiếu một nhiệm vụ bị thất bại
  81.  
  82. I.11: Never transfer ownership by a raw pointer (T*) or reference (T&)
  83. Không bao giờ được thay đổi quyền sở hữu của con trỏ hoặc tham chiếu
  84.  
  85. I.12: Declare a pointer that must not be null as not_null
  86. Quy định tham số truyền vào không phải là null với not_null
  87.  
  88. I.13: Do not pass an array as a single pointer
  89. Không sử dụng một mảng như là con trỏ đơn
  90.  
  91. I.22: Avoid complex initialization of global objects
  92. Tránh việc khởi tạo các biến cục bộ một cách phức tạp
  93.  
  94. I.23: Keep the number of function arguments low
  95. Dữ cho số lượng tham sô đầu vào của function ở ít. Hàm mà nhiều tham số thường do thiếu sự trừu tượng hoặc hàm đang sử lý nhiều việc khác nhau vì vậy cần phải sắp xếp và tổ chức lại
  96.  
  97. I.24: Avoid adjacent unrelated parameters of the same type
  98. Tránh các tham số không liên quan nằm cùng nhau bởi vì các tham sấ cùng loại nằm gần nhau có thể dễ bị đảo ngược gây nhầm lẫn
  99.  
  100. I.25: Prefer abstract classes as interfaces to class hierarchies
  101. Nên sử dụng abstract classes hơn là interface để phân cấp cấu trúc lớp
  102.  
  103. I.26: If you want a cross-compiler ABI, use a C-style subset
  104. Nếu bạn muốn support nhiều trình biên dịch khác nhau bạn nên sử dụng C-style, bởi mỗi trình biên dịch có thể khác nhau
  105.  
  106. I.27: For stable library ABI, consider the Pimpl idiom
  107. Cho một thư viện abi ổn định, xem xét cạc diễn đạt Pimpl
  108.  
  109. I.30: Encapsulate rule violations
  110. Đóng gói các quy tắc hay mục đích riêng của dự án lại để không lây lan ra những chỗ khác trong hệ thống
  111. ---------------------------------------------------------------------------------------------------------------------------------------------------------------
  112. F: Functions
  113.  
  114. F.1: “Package” meaningful operations as carefully named functions
  115. Chú ý đóng gói với tên phương thức cần đật tên cẩn thận. Việc đóng gói làm cho mã dễ đọc hơn, tái sử dụng hạn chế lỗi từ mã phức tạp. Nếu là một hành động rõ ràng lên tách nó ra và đật tôn cho nó
  116. Các mã ngắn nhất không phải là luôn luôn tốt nhất cho hiệu suất và bảo trì
  117.  
  118. F.2: A function should perform a single logical operation
  119. Một function nên thực hiện một hoạt động hợp lý duy nhất
  120.  
  121. F.3: Keep functions short and simple
  122. Giữ cho function ngắn gọn và đơn giản
  123.  
  124. F.4: If a function may have to be evaluated at compile time, declare it constexpr
  125. Nếu một function có thể đánh giá trong quá trình biên dịch, khai báo với constexpr
  126. VD: constexpr int fac(int)
  127.  
  128. F.5: If a function is very small and time-critical, declare it inline
  129. Nế́u function nhỏ và yếu tố thời gian đặt lên hàng đầu thì địng nghĩa nó với inline
  130. VD: inline string cat(const string& s, const string& s2) {return s+s2;}
  131.  
  132. F.6: If your function may not throw, declare it noexcept
  133. Nếu function có thể không sinh ra ngoại lệ, định nghĩa nó với noexcept. Các chưng năng như swap, move, destructors và default constructors thường không phát sinh ngoại lệ
  134. VD: vector<string> collect(istream& is) noexcept
  135.  
  136. F.7: For general use, take T* or T& arguments rather than smart pointers
  137. ?
  138.  
  139. F.8: Prefer pure functions
  140. Nên sử dụng các function thuần tuý
  141.  
  142. F.9: Unused parameters should be unnamed
  143. Các tham số chưa được sử dụng lên khai báo không tên
  144. -----------------------------------------------------------------------------------------------------------------------------------------------------------------
  145. F.call Parameter passing
  146.  
  147. F.15: Prefer simple and conventional ways of passing information
  148. Truyền thông tin một cách đơn giản và thông thường
  149.  
  150. F.16: For “in” parameters, pass cheaply-copied types by value and others by reference to const
  151. Các tham số truyền vào cần truyền với nên chuyền vào đúng cách với từ khoá const
  152. VD: void f1(const stirng& s)
  153. void f2(int x)
  154.  
  155. F.17: For “in-out” parameters, pass by reference to non-const
  156. Đối với tham số in-out thì không sử dụng từ khoá const
  157. VD: void update(Record& r);
  158.  
  159. F.18: For “consume” parameters, pass by X&& and std::move the parameter
  160. Đối với những tham số được dùng để sử dụng, truyền tham số sử dụng X&& và std::move
  161.  
  162. F.19: For “forward” parameters, pass by TP&& and only std::forward the parameter
  163. Nếu tham số được chuyển tiếp cho mã khác và không được trược tiếp sử dụng ở mã này thì sử dụng std::forward
  164.  
  165. F.20: For “out” output values, prefer return values to output parameters
  166. Trả về giá trị qua return không nên sử dụng trả về giá trị qua paramester.
  167.  
  168. F.21: To return multiple “out” values, prefer returning a tuple or struct
  169. Nếu có nhiều giá trị cần truyền ra sử dụng std::tuple hoặc đóng gói struct
  170.  
  171. F.22: Use T* or owner<T*> to designate a single object
  172. Sử dụng T* hoặc owner<T*> để chỉ định một giá trị duy nhất
  173.  
  174. F.23: Use a not_null<T> to indicate that “null” is not a valid value
  175. Sử dụng not_null<T> để chỉ ra rằng null không phải là giá trị hợp lệ
  176.  
  177. F.24: Use a span<T> or a span_p<T> to designate a half-open sequence
  178. Sử dụng span<T> hoặc span_p<T> để duyệt qua danh sách. Việc này sẽ tránh gây ra lỗi tràn bộ nhớ khi duyệt qua danh sách
  179. VD:
  180. X* find(span<X> r, const X& v);
  181. vector<X> vec;
  182. auto p = find({vec.begin(), vec.end()}, X{});
  183.  
  184. F.25: Use a zstring or a not_null<zstring> to designate a C-style string
  185. sử dụng zstring hoặc not_null<zstring> để thiết kế kiểu string theo C-style
  186.  
  187. F.26: Use a unique_ptr<T> to transfer ownership where a pointer is needed
  188. Sử dụng unique_ptr<T> để thay đổi quyền sở hữu của một con trỏ khi cần
  189.  
  190. F.27: Use a shared_ptr<T> to share ownership
  191. Sử dụng shared_ptr<T> để thay đổi việc chia sẻ quyển sở hữu con trỏ
  192.  
  193. F.60: Prefer T* over T& when “no argument” is a valid option
  194. Sử dụng T* hơn là T& khi không có tham số lựa chọn hợp lệ. T* có thể null còn T& thi không thể null.
  195.  
  196. F.42: Return a T* to indicate a position (only)
  197. Trả vể T* để trả về một vị trí duy nhất. Một con trỏ có thể thay đổi vị trí nên nếu không sử dụng nullptr thì sử dụng tham chiếu.
  198.  
  199. F.43: Never (directly or indirectly) return a pointer or a reference to a local object
  200. Không bao giờ được trực tiếp hoặc gián tiếp trả về một con trỏ hay một tham chiếu địa phương.
  201. int* f()
  202. {
  203. int fx = 9;
  204. return &fx; // BAD
  205. }
  206.  
  207. F.44: Return a T& when copy is undesirable and “returning no object” isn’t needed
  208. Trả về T& khi sao chép là không momg muốn và "trả về không có đối tượng" là không cần thiết
  209.  
  210. F.45: Don’t return a T&&
  211. Không được trả về T&&, ngoại trừ std::move và std::forward
  212.  
  213. F.46: int is the return type for main()
  214. Hàm main cần trả về int
  215.  
  216. F.47: Return T& from assignment operators
  217. Trả về T& đối với toán tử chuyển nhượng
  218.  
  219. F.50: Use a lambda when a function won’t do (to capture local variables, or to write a local function)
  220. Sử dụng lambda khi sử dụng một function như là cục bộ, địa phương
  221.  
  222. F.51: Where there is a choice, prefer default arguments over overloading
  223. Nên sử dụng đối số mặc định hơn là quả tải phương thức
  224.  
  225. F.52: Prefer capturing by reference in lambdas that will be used locally, including passed to algorithms
  226. Tốt hơn nếu sử dụng & trong lambda tại địa phương bao gồm thông qua thuật toán
  227. [&](buffer& b)
  228.  
  229. F.53: Avoid capturing by reference in lambdas that will be used nonlocally, including returned, stored on the heap, or passed to another thread
  230. Tránh sử dụng tham chiếu trong lambda khi không cùng thuộc phạm vi. Bao gồm cả return, lưu trữ trên heap hoặc thread
  231.  
  232. F.54: If you capture this, capture all variables explicitly (no default capture)
  233. Lên truyền các tham số vào lambda theo cách rõ rành nhất để tránh gây nhầm lẫn
  234. [i, this]{ use(i, x); }
  235.  
  236. F.55: Don’t use va_arg arguments
  237. Không sử dụng đối số va_arg. Có thể thay thế bằng overloading, variadic templates, variant arugments, initializer_list
  238. -----------------------------------------------------------------------------------------------------------------------------------------------------------------
  239. C: Classes and Class Hierarchies
  240.  
  241. C.1: Organize related data into structures (structs or classes)
  242. Tổ chức những dữ liệu liên quan tới nhau vào lớp hoặc struct
  243.  
  244. C.2: Use class if the class has an invariant; use struct if the data members can vary independently
  245. Sử dụng struct khi dữ liệu bên trong có thể thay đổi độc lập
  246.  
  247. C.3: Represent the distinction between an interface and an implementation using a class
  248. Phân biệt rõ ràng giữa giao diện và thực hiện giúp cải thiện khả năng đọc và đơn giản hóa việc bảo trì
  249.  
  250. C.4: Make a function a member only if it needs direct access to the representation of a class
  251. Tạo một function chỉ là thành viên nếu nó cần truy cập trực tiếp đến thể hiện của lớp
  252.  
  253. C.5: Place helper functions in the same namespace as the class they support
  254. Đặt các hàm trợ giúp trong không gian tên giống như lớp mà chúng hỗ trợ
  255.  
  256. C.7: Don’t define a class or enum and declare a variable of its type in the same statement
  257. Không xác định một lớp hoặc enum và khai báo một biến kiểu trong cùng một lệnh
  258.  
  259. C.8: Use class rather than struct if any member is non-public
  260. Sử dụng class hơn là struct nếu bất kỳ thành viên nào không phải là public
  261.  
  262. C.9: Minimize exposure of members
  263. Giảm thiểu sự phơi bầy thành viên
Add Comment
Please, Sign In to add comment