
Coding Standards Và Cách Viết Code C++ Chuẩn Đẹp
Trong lập trình, ngoài vấn đề đảm bảo output, chắc hẳn rất nhiều người đã từng suy nghĩ về “cách trình bày code”.
Tuy nhiên, một số người, đa số beginner thường có suy nghĩ: “code sao chả được miễn chạy không lỗi, ra kết quả đúng là được”. Suy nghĩ đó chỉ đúng, nếu các bạn tự code tự đọc và code cho xong, không dùng lại. Nhưng hãy thử nghĩ xem, khi người khác cần đọc code của bạn, ví dụ khi làm việc nhóm chẳng hạn, sẽ rất khó khăn nếu không có một quy chuẩn chung cho cả nhóm. Vì thế Coding standards ra đời để giải quyết vấn đề đó. Vậy Coding Standards là gì? Nó quan trọng thế nào? Làm sao để viết code chuẩn, đẹp? Trong bài viết này, mình sẽ làm rõ các vấn đề trên.
1. Coding standards là gì?
Coding Standards (Quy chuẩn mã nguồn) là một bộ quy tắc quy định cách viết code của một chương trình mà lập trình viên phải tuân theo khi tham gia vào dự án phát triển chương trình đó. Tùy theo mỗi dự án mà sẽ có những tiêu chuẩn khác nhau.
Môt bộ quy tắc bao gồm:
- Đặt tên biến, hằng, hàm, class, …
- Khoảng trắng, tab
- Khai báo và sử dụng biến
- Comment
- Độ dài tối đa mỗi dòng code, mỗi file, …
- …
2. Coding Standards có quan trọng không?
Coding standards giúp:
- Các lập trình viên biết rõ mình đang làm gì, và chuyện gì đang xảy ra với code của họ. Vì vậy họ dễ dàng tìm và sửa các lỗi sai.
- Những người mới có thể làm quen nhanh hơn, không bị mắc lỗi lặp đi lặp lại.
- Những người mới không mất công tạo phong cách code riêng và “bảo vệ nó đến chết”.
- Mọi người sẽ ít mắc lỗi hơn trong môi trường nhất quán.
Nhưng nó cũng có một số mặt trái như:
- Tiêu chuẩn sẽ là ngu ngốc nếu nó được đặt ra từ một người, và buộc người khác tuân thủ.
- Tiêu chuẩn, khuôn mẫu làm giảm sự sáng tạo.
- Dễ bị bỏ qua trong quá trình viết code.
Thực tế nhiều dự án đã cho thấy rằng sử dụng coding standards sẽ giúp dự án suôn sẻ hơn. Tuy nhiên, nếu cho rằng tiêu chuẩn là điều cần có để đạt được thành công thì không hẳn. Chúng ta phải thừa nhận rằng coding standards rất quan trọng nhưng đối với một số trường hợp lại không có hiệu quả, ngược lại còn gây nhiều trở ngại. Vì thế không nên áp dụng quy chuẩn mã nguồn một cách bừa bãi, để tránh bị phản tác dụng nhé.
3. Cách để viết code chuẩn, đẹp
3.1. Đặt tên như thế nào?
Nói “những cái tên là linh hồn của chương trình” chắc là không quá đâu nhỉ. Thật vậy, những cái tên đóng vai trò rất quan trọng. Nếu có những tên phù hợp, mọi thứ sẽ khớp với nhau một cách tự nhiên, các mối quan hệ sẽ trở nên rõ ràng, và dễ thể hiện lý luận của người viết code.
Có một số quy tắc đặt tên như sau:
1. Biến cục bộ:
Sử dụng tất cả chữ thường và dấu ‘_
’ để phân cách các chữ.
Ví dụ: int age{}; bool is_prime; …
2. Biến con trỏ:
Sử dụng tiền tố ‘p
’ đứng trước khi đặt tên biến.
Khi khai báo dấu * sẽ đứng sát ngay sau kiểu dữ liệu chứ không phải tên biến.
Ví dụ: int* pName; …
3. Biến toàn cục:
Có tiền tố g
đứng trước, quy ước này giúp ta nhanh chóng biết được phạm vi sử dụng của biến.
Ví dụ: int gCount; int* gpName; …
4. Hằng với từ khóa const:
Viết hoa toàn bộ và dùng dấu ‘_
’ để phân cách các chữ.
Khi khai báo nên để từ khóa const
trước kiểu dữ liệu để dễ nhận biết.
Ví dụ: const double PI = 3.14; const string MY_NAME = “Delta J”; …
5. Biến tĩnh
Có thể dùng tiền tố s
đứng đầu tên biến.
Ví dụ: static int sNumber{}; …
6. #defind và tên các macro
Bạn có thể sử dụng quy tắc như với hằng const.
Ví dụ: #defind CONSTANT 1234 #defind WATER_LEVEL 3 …
7. Hàm
Bạn có thể đặt tên hàm như cách đặt tên biến cục bộ, hoặc cũng có thể viết hoa chữ cái đầu của mỗi từ.
Ví dụ: void do_something(); int ResetList();
Mình thấy các hàm chuẩn (STL) dùng cách đặt tên bằng chữ cái thường và dấu gạch nối, nên mình thích dùng kiểu này hơn.
3.2. Định dạng code
1. Quy tắc ngoặc {}
Có hai cách chủ yếu là:
Đặt dấu mở ngoặc cùng một dòng với từ khóa, kiểu:
if (condition) {
do_something();
}
Đặt dấu mở ngoặc ở dòng tiếp theo để gióng thẳng hàng với dấu đóng ngoặc, kiểu:
if (condition)
{
do_something();
}
Trong 2 cách, mình thích cách thứ hai hơn, vì khi viết nhiều khối lệnh lồng nhau, việc để cặp đóng – mở ngoặc thẳng hàng sẽ dễ quản lý code hơn.
Cặp dấu {} thường dùng để bao một khối lệnh, nhưng theo mình khi chỉ có một câu lệnh các bạn vẫn nên sử dụng {}. Ví dụ:
bool is_prime(int val)
{
if (val < 2)
{
return 0;
}
else
{
if (val < 4)
{
return 1;
}
else
{
for (int i = 2; i <= sqrt(val); i++)
{
if (val % i == 0)
{
return 0;
}
}
return 1;
}
}
}
Thì dễ quản lý hơn là:
bool is_prime(int val)
{
if (val < 2)
return 0;
else
if (val < 4)
return 1;
else
{
for (int i = 2; i <= sqrt(val); i++)
if (val % i == 0)
return 0;
return 1;
}
}
Hơn nữa việc sử dụng dấu ngoặc như thế tạo nên sự nhấn quán giữa các cấu trúc với nhau.
2. Tab và Dòng trống
Lùi vào một tab đối với các dòng code được bao hàm bên trong một cấu trúc sẽ giúp dễ dàng nhận biết mỗi quan hệ giữa chúng.
Dòng trống giúp phân tách giữa các khối lệnh thực hiện các công việc khác nhau.
int main()
{
// declare and open the file
ifstream fin;
fin.open(file.txt);
// read data from file
fin >> number_of_elements;
for (int i = 1; i <= number_of_elements; i++)
{
fin >> arr[i];
}
// close file
fin.close();
// do something
}
3. Độ dài mỗi dòng code
Mỗi dòng code chỉ nên chứa một câu lệnh và mỗi dòng nên chứa không quá 78 ký tự để tối ưu hiển thị
4. Câu điều kiện
Luôn đặt biến so sánh bên trái và giá trị so sanh bên phải toán tử quan hệ.
// should
if (val == 0) {}
// shouldn’t
if (0 == val) {}
T5. oán tử ba ngôi (condition)?func_1():func_2();
Toán từ này thật sự rất nguy hiểm, theo mình các bạn không nên sử dụng, mà hãy dùng cấu trúc if … else
… thay thế cho nó.
3.3. Comment
Comment rất quan trọng trong các chương trình, đặc biệt là các chương trình lớn, phức tạp, việc comment một cách hiệu quả sẽ code dễ hiểu hơn. Tuy nhiên, không nên lạm dụng comment hay sử dụng comment một cách bừa bãi. Một comment tốt là một comment ngắn gọn, dễ hiểu, làm tròn nhiệm vụ giải thích code. Comment nên đặt ngay trên dòng code mà nó giải thích, tuy nhiên những comment nhỏ cũng có thể đặt sau dòng code cũng được. Miễn sao giúp code thêm dễ hiêu mà không làm code thêm rườm ra.
– Ở mức các hàm, thư viện, … comment tốt sẽ cho biết mục đích, nhiệm vụ của hàm, thư viện, … đó.
– Ở trong các hàm, thư viện, … comment tốt sẽ cho biết hàm, thư viện, … thực hiện như thế nào.
– Ở từng dòng code, comment tốt sẽ giải thích tại sao, chứ không giải thích làm gì.
Khuyến khích comment ngay khi viết code chứ không nên viết xong code mới quay lại comment.
Trong quá trình debug, nếu dùng comment để out-code, các bạn nên xóa ngay sau khi debug thành công để code có thể clean nhất có thể nhé.
Kết
Trên đây mình đã chia sẻ hiểu biết của mình về Coding Standard và một số quy chuẩn để code C++ chuẩn đẹp. Mong nó sẽ hữu ích với các bạn!!!
Đây là bài viết đầu tiên của mình. Nếu có gì sai sót, các bạn vui lòng để lại bình luận góp ý để mình hoàn thiện hơn trong tương lai. Nếu thấy bài viết hay và giúp được gì đó cho các bạn hãy rate 5* và share giúp mình nhé 🙂
Mình cảm ơn!
Post Comment