Coding convention trong C/C++

Coding convention trong C/C++

December 10, 2021 0 By Nam Vu

Tại sao tôi cần phải viết mã theo quy tắc?

Bạn ko bỏ nhiều thời gian nhất để lập trình, mà là để hoàn thiện, sửa chữa nó. Bạn có muốn viết khoảng 500 dòng code, rồi phải quay lên hoặc mở file header ra để xem tên class, tên function. Hoặc khi đọc code lại phải mở phần prototype lên để đọc comment xem cái hàm đó có tác dụng gì? Đấy chính là lí do cần Coding Convention.

Quy tắc về file

Quy tắc cơ bản

Quy tắc đầu tiên, quy tắc quan trọng nhất, đó là code phải được dịch 1 cách hoàn chỉnh được bởi các trình biên dịch thông dụng. Chú ý rằng dịch hoàn chỉnh tức là file phải được dịch mà ko có bất cứ 1 error hay warning nào (thường thì warning nhưng file sẽ vẫn được dịch, điều này là ko được chấp nhận).

Quy tắc về tên file

Tên file phải dễ hiểu và dễ nhớ và ko quá dài. Thường thì có 1 giới hạn 14 chữ cái được đặt ra, tuy nhiên bạn có thể làm theo hay ko thì…tùy.Phần mở rộng của file phải theo đúng chuẩn

-------------------------------------------
File Contents Name
-------------------------------------------
C++ Source Code filename.cc
C++ Header File filename.hh
C Source Code filename.c
C Header File filename.h
Object Code filename.o
Archive Libraries filename.a
Dynamic Shared Libraries filename.so.
Shell Scripts filename.sh
Yacc/C Source Code filename.y
Yacc/C++ Source Code filename.yy
Lex/C Source Code filename.l
Lex/C++ Source Code filename.ll
Directory Contents README
Build rules for make Makefile
-------------------------------------------

Mặc dù danh sách đuôi mở rộng ko có .cpp, nhưng với giới hạn làm việc của sinh viên ta bây giờ thì điều đó là chấp nhận thỏa mái.

Quy tắc về nội dung

Mặc dù không có quy định nào về độ dài file, nhưng ko nên viết 1 file có code quá dài, sẽ rất khó chỉ để duyệt nội dung hoặc tìm đến 1 vị trí nào đó.

Không nên viết quá dài trên 1 dòng, ko được phép viết quá 80 cột bởi vì sẽ gặp 1 vài vấn đề trong khi in ấn hoặc in ra terminal.

Trong header file phải có dòng

#ifndef _WF_FILENAME_HH
#define _WF_FILENAME_HH

Những phần còn lại có thể tìm đọc trong tài liệu vì mình thấy những phần đó ko cần thiết cho tài liệu căn bản lắm

Các quy tắc về định danh

Quy tắc chung

Các tên nên được viết = tiếng Anh, trừ khi bạn dùng nó cho mục đích cá nhân hoặc chỉ trao đổi với người nói cùng ngôn ngữ thì có thể dùng tiếng Việt. Nhưng dù dùng ngôn ngữ nào thì cũng đảm bảo rằng tên của bạn là có đủ ý nghĩa, và ngắn nhất có thể.

– Tránh các tên 1 chữ cái (ví dụ a,i,j). Tuy nhiên đối với vài định danh ít ý nghĩa (ví dụ 1 biến chạy trong vòng lặp) thì có thể dùng 1 chữ cái.

– Tránh các tên trùng hoặc dễ trùng, ví dụ 0 với O, i với 1 hay l, tránh các tên mà chỉ khác nhau về case, ví dụ như string với String, is với Is. Mặc dù điều này ko cấm, nhưng bạn nên tránh nó.

Có thể bạn nghe nói đến “Hungarian” style, nhưng đừng nghe nó, bởi vì mình thấy nó…xấu. Ví dụ thay vì viết someName, bạn phải viết shjtxSomeName…

Quy tắc về biến, phương thức và hàm

Biến, phương thức hay hàm phải được viết thường chữ cái đầu tiên, các chữ cái sau viết hoa, các từ được viết liền nhau. Ví dụ someName, myVar, myLength…

Các tên tạm thường dùng (biến chạy trong vòng lặp nhỏ) thường là i,j,k,n,m cho int, char thì thường là c,d..Tên biến phải ngắn gọn và có nghĩa. Có thể thêm prefix, tuy nhiên ko nên dùng prefix làm dấu hiệu nhận biết kiểu như p bắt đầu cho biến con trỏ, s cho static… vì nó làm tên biến của bạn trở nên khó nhớ, và mất đi tính có nghĩa.

Một vài sufix và prefix thường dùng

  • is_, has_… ví dụ isPrime, hasSomething rất dễ nhớ và dễ hiểu
  • the_… dành riêng cho biến Global, theOne, chỉ là duy nhất
  • _count..dành cho biến đếm, ví dụ someCount…

Với tên mảng thì bạn nên đặt thêm chữ s ở cuối thể hiện số nhiều, ví dụ weapons[100]. Tuy nhiên 1 số trường hợp ko nên thêm, ví dụ như filename…Việc thêm hay ko tùy bạn.

Nếu phương thức hay hàm có biến truyền theo quá dài thì hãy cắt nó thành nhiều dòng, và đảm bảo là dấu phẩy ở cuối mỗi dòng (chứ ko phải là đầu dòng tiếp theo).

Quy tắc về hằng

Hằng phải được viết HOA toàn bộ, và phân cách bởi dấu gạch dưới, ví dụ như INT_MAX, MAX_WIDTH…

Quy tắc về coding

if, if else, else if

if( condition ) {
    statements;
}
else if( condition ) {
    statements;
}
else {
    statements;
}

Dễ đọc, dễ hiểu. Hãy đặt 1 dấu cách sau dấu ( và trước dấu ). Dấu { nên được đặt ngay sau condition, code trong {} được lùi 1 tab. Đi theo order trên là cách hợp lí nhất rồi .

Nếu sau if chỉ có 1 câu lệnh, hãy đặt nó ở dòng tiếp theo.

if( bullet_count == 0 )
    reload();

Tuy nhiên nếu câu lệnh tiếp theo là 1 câu lệnh return, break thì hãy đặt nó trong cùng 1 dòng.

while, do..while

while( condition ) {
    statements;
}



do {
    statements;
} while( condition )

Đơn giản là hãy làm theo nó

for…

for( int i = 0; i < MAX_ELEMENTS; i++ ) {
    statements;
}

Cũng đơn giản như while… hay làm y hệt như vậy, có thể dùng các biến tạm như i,j,k,l,m,n để làm biến chạy

switch…

switch( variable ) {
    case 0:
        statements;
        break;
    case 1:
        statements;
        break;
    default:
        break;
}

Sau break bạn nên để 1 dòng trắng để cho dễ nhìn.

Tổng thế code

Bạn nên viết code thế nào cho người đọc dễ nhìn nhất. Ví dụ như:

int object_verts[6][3] = {
    {-100, 0, 100}, {100, 0, 100}, { 100, 0, -100},
    {-100, 11, 100}, (100, 0, -100}, {-100, 0, -100}
};
RECT rect;
rect.left = x;
rect.top = y;
rect.right = rect.left + width;
rect.bottom = rect.right + height;

Các khoảng trống hợp lí sẽ khiến cho code của bạn dễ đọc hơn

Khi khai báo biến, chỉ đặt nhiều biến cùng 1 dòng nếu chúng có cùng kiểu và cùng mục đích, nếu ko, hãy đặt chúng vào các dòng khác nhau. Ví dụ


int x,y;
int length

#ntechdevelopers