Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 18 kết quả

Đề tài: Phong cách lập trình C --> Tham khảo (ko thật sự chất lượng)

  1. #1
    Ngày gia nhập
    08 2006
    Bài viết
    14

    Lightbulb Phong cách lập trình C --> Tham khảo (ko thật sự chất lượng)

    Sau đây là một phong cách lập trình tuy chưa hẳn là tối ưu nhưng cũng là một bài viết đáng chú ý.
    I. Mục tiêu của tài liệu này:

    Bạn đang học lập trình, vậy bạn nghĩ về một chương trình máy tính như thế nào?

    Một chương trình máy tính có thể xem như một tác phẩm (như bài báo, một câu truyện, một cuốn tiểu thuyết, …) bởi vì nó được đọc bởi bạn (có thể bây giờ, mà cũng có thể là 10 năm sau!), và bởi những lập trình viên khác sau bạn (để phát triển, sửa chửa, cập nhật, …). Chính vì lẽ đó, một chương trình máy tính nên đáp ứng cả 3 yêu cầu sau: đúng, dễ đọc và dễ hiểu.

    Mục tiêu của tài liệu này là cung cấp cho bạn:

    1. Một tập hợp các chuẩn trình bày chương trình thông dụng.

    2. Một thói quen để từ đó bạn có một phong cách lập trình tương đối chuyên nghiệp.

    Tuy nhiên, tài liệu này không có tham vọng đề cập đến toàn bộ các khía cạnh của một phong cách lập trình. Nó chỉ nói đến những gì cần thiết để cho bạn, một sinh viên, khi chưa tìm được một phong cách phù hợp tạo được những thói quen tốt ngay từ đầu.



    II. Một số nguyên tắc cần tuân thủ khi lập trình:

    A. Trình bày tổng thể chương trình:

    1. Môđun hóa chương trình của bạn

    Chương trình của bạn nên được tách thành nhiều môđun, mỗi môđun thực hiện một công việc và càng độc lập với nhau càng tốt. Điều này sẽ giúp bạn dễ bảo dưỡng chương trình hơn và khi đọc chương trình, bạn không phải đọc nhiều, nhớ nhiều các đoạn lệnh nằm rải rác để hiểu được điều gì đang được thực hiện.

    Khi muốn chuyển thông tin cho các chương trình con, bạn nên sử dụng các tham số. Tránh sử dụng các biến toàn cục để chuyển thông tin giữa các chương trình con. làm như vậy bạn sẽ triệt tiêu tính độc lập giữa các chương trình con và rất khó khăn khi kiểm soát giá trị của chúng khi chương trình thi hành. (Chú ý, bạn nên phân biệt giữa biến toàn cục và hằng số toàn cục)



    2. Cách trình bày chương trình nên nhất quán

    Chương trình của bạn càng nhất quán, thì nó sẽ càng dễ đọc và dễ hiểu. Hơn nữa, bạn sẽ càng mất ít thời gian nghĩ về cách viết chương trình, và như vậy bạn sẽ có nhiều thời gian hơn để nghĩ về các vấn đề cần giải quyết.



    3. Chương trình nên giữ được tính đơn giản và rõ ràng trong hầu hết các tình huống.

    Việc sử dụng các mẹo lập trình chỉ thể hiện sự khéo léo của lập trinh viên và làm tăng hiệu quả chương trình lên một chút, trong khi điều đó sẽ đánh mất đi tính đơn giản và rõ ràng của chương trình.

    Ví dụ:
    a[i++] = 1;

    nên được viết là:

    a[i] = 1;
    i++;

    Hoặc:
    if (doSomeThing() == false)

    nên được viết là:
    bool result = doSomeThing();
    if (result == false) …



    4. Mã lệnh mà bạn viết phải thể hiện đúng cấu trúc chương trình của bạn.

    Ví dụ:

    Dòng lệnh:

    if (count == 0) printf(``No data.\n'');

    nên được viết là:

    if (count == 0)

    printf(``No data.\n'');

    Và như vậy, theo bạn, dòng lệnh sau có thể hiện đúng cấu trúc chương trình không?

    if (count != 0)

    printf(``%d\n'', count);

    average = total/count;



    5. Chương trình của bạn nên thực hiện như một dòng chảy từ trên xuống dưới, không nên có những thay đổi bất chợt. Để có được điều này, bạn không nên sử dụng goto hay continue.



    B. Khai báo biến và hàm

    1. Một câu lệnh nên được đặt riêng trên một dòng, điều này sẽ giúp bạn rất nhiều trong quá trình debug.

    Ví dụ:

    Nếu bạn viết:

    while (i < 100) i++;

    bạn sẽ không biết được vòng lặp trên được thực hiện bao nhiêu lần khi debug..

    Cũng tương tự:

    if (i < 100) i++;

    bạn sẽ không biết được lệnh if có được thực hiện hay không trong quá trình debug (trừ khi bạn phải theo dõi giá trị của i).



    2. Các dấu {} bao các khối lệnh phải được canh thẳng hàng.

    Có 2 cách thường được chấp nhận để canh thẳng các dấu {}:

    a. Cách 1:

    if (...)
    {
    .
    .
    .
    }
    else
    {
    .
    .
    .
    }
    while (...)
    {
    .
    .
    .
    }

    b. Cách 2:

    if (...) {
    .
    .
    .
    }
    else {
    .
    .
    .
    }
    while (...) {
    .
    .
    .
    }


    Và như vậy, khi viết các khối lệnh nằm trong một cặp ngoặc {}, bạn nên viết cặp ngoặc trước rồi mới viết các lệnh vào giữa, làm như vậy bạn sẽ tránh trường hợp thiếu các dấu ngoặc này.

    3. Biến nên được khai báo ở gần vị trí mà nó bắt đầu được sử dụng, như vậy bạn sẽ tránh được việc khai báo một loạt các biến dư thừa ở đầu hàm hay chương trình.

    4. Mỗi biến nên khai báo trên một hàng nhằm dễ chú thích về ý nghĩa của mỗi biến.

    Ví dụ:

    int level = 0; // indentation level
    int size = 0; // size of symbol table
    int lines = 0; // lines read from input

    5. Tên biến nên đặt sao cho đủ nghĩa, có thể là là các từ hoàn chỉnh hoặc viết tắt nhưng phải dễ đọc (dễ phát âm).

    Ví dụ:

    wages = hoursWorked * hourlyRate;
    rõ ràng hơn là
    w = h * r;
    Ngoại lệ: Các biến sử dụng để chạy các vòng lặp nên đặt đơn giản là: i, j, k, …



    6. Tên của một hàm nên phản ánh công việc hoặc giá trị trả về của nó.

    Ví dụ:

    CheckForErrors() thay vì ErrorCheck()
    DumpDataToFile() thay vì DataFile().



    7. Bạn nên sử dụng hợp lý các ký tự hoa và thường khi đặt tên biến, điều này sẽ giúp chương trình dễ đọc hơn, một số gợi ý như sau:

    • Tên biến được viết bằng chữ thường, viết hoa chữ các đầu tiên của từ thứ hai trong tên biến (kiểu camelBack), ví dụ: totalHouseWorked.

    • Tên hằng số được viết hoa toàn bộ, các từ viết cách nhau bằng dấu gạch dưới, ví dụ: TAX_RATE.

    • Các kiểu dữ liệu do người dùng định nghĩa được viết hoa toàn bộ hoặc viết hoa các ký tự đầu, ví dụ: BIGINT hay BigInt.

    • Tên các hàm được viết hoa chữ cái đầu từ, có thể bắt đầu từ từ thứ nhất hay thứ hai, ví dụ: DisplayInfo() hoặc displayInfo().



    8. Các hằng số không nên viết trực tiếp vào chương trình.

    Thay vì thế, người ta thường sử dụng lệnh #define hay const để đặt cho những hằng số này những tên có ý nghĩa. Điều này sẽ giúp lập trình viên dễ kiểm soát những chương trình lớn vì giá trị của hằng số khi cần thay đổi thì chỉ phải thay đổi một lần duy nhất ở giá trị định nghĩa (ở #define hay const).

    Ví dụ:

    popChange = (0.1758 - 0.1257) * population;
    nên được viết là:
    const double BIRTH_RATE = 0.1758,
    DEATH_RATE = 0.1257;
    ...
    popChange = (BIRTHRATE - DEATH_RATE) * population;
    Ghi chú: bạn không nên dùng #define thường xuyên để định nghĩa các hằng số, bởi vì trong quá trình debug, bạn sẽ không thể xem được giá trị của một hằng số định nghĩa bằng #define.



    9. Khi khai báo con trỏ, dấu con trỏ nên được đặt liền với tên, nhằm tránh trường hợp sau:

    char* p, q, r; // ß q, r không là con trỏ

    Trong trường hợp này nên viết là:

    char *p, *q, *r;

    (luật này cũng được dùng khi khai báo tham chiếu với dấu &)



    C. Trình bày dòng lệnh:

    1. Các biến không nên được sử dụng lại với nhiều nghĩa khác nhau trong cùng một hàm.

    Ví dụ:

    Không nên sử dụng biến như sau:

    for (i = 0; i < n; i++) // ß n mang ý nghĩa là số lần lặp

    . . .



    for (i = 0; i < 10; i++)

    for (n = 0; n < 10; n++) //ß n sử dụng như biến điều khiển lặp

    . . .



    2. Các toán tử và toán hạng trong một biểu thức nên được tách rời nhau nhằm làm biểu thức dễ đọc hơn.

    Ví dụ:

    mass = volume * density;

    Thay vì:

    mass=volume*density;

    Ngoại lệ: không chèn khoảng trắng vào giữa toán hạng và toán tử ++ và –



    3. Nên có khoảng trắng ngăn cách giữa dấu phẩy hay chấm phẩy với các tham số.



    4. Nên có khoảng trắng giữa từ khóa và dấu ‘(’, nhưng không nên có khoảng trắng giữa tên hàm và dấu ‘(‘.

    Ví dụ:

    // no space between 'strcmp' and '(',
    // but space between 'if' and '('
    if (strcmp(input_value, "done") == 0)
    return 0;

    5. Nên sử dụng các dấu ( ) khi muốn tránh các lỗi về độ ưu tiên toán tử.

    Ví dụ:

    // No!
    int i = a >= b && c < d && e <= g + h;
    // Better
    int j = (a >= b) && (c < d) && (e <= (g + h));


    6. Nên dùng các dòng trắng để phân chia các hàm trong một tập tin, các đoạn lệnh trong một hàm như: đoạn nhập xuất dữ liệu, các đoạn tương ứng với các bước xử lý khác nhau,



    7. Mỗi dòng lệnh không nên dài quá 80 ký tự, điều này giúp việc đọc chương trình dễ dàng hơn khi không phải thực hiện các thao tác cuộn ngang mang hình.



    8. Một dòng lệnh quá dài nên được tách thành nhiều dòng.

    Ví dụ:

    if (foo->next == NULL
    && totalcount < needed && needed <= MAX_ALLOT
    && server_active(current_input))
    {
    ...
    }
    Hoặc:

    for (curr = *listp, trail = listp;
    curr != NULL;
    trail = &(curr->next), curr = curr->next)
    {
    ...
    }

    Hoặc:

    int myComplexFunction( unsigned unsignedValue,
    int intValue,
    char *charPointerValue,
    int *intPointerValue,
    unsigned *unsignedPointerValue);


    D. Chú thích chương trình:

    1. Khi đặt các chú thích, bạn nên sử dụng dấu // vì dấu này sẽ không có ảnh hưởng khi bạn sử dụng cặp ký hiệu /* */ để vô hiệu hóa một đoạn lệnh trong quá trình sửa lỗi chương trình. Bạn nên nhớ rằng trong C/C++ không cho phép các cặp dấu /* */ lồng nhau.



    2. Với các chú thích ngắn, bạn đặt nó trên cùng dòng lệnh cần chú thích. Với các chú thích dài hơn, hoặc chú thích cho cả một đoạn lệnh, bạn đặt câu chú thích trên một dòng riêng ngay phía trên câu lệnh cần chú thích.

    Ví dụ:

    Chú thích ngắn:

    if (a == 2)
    return(TRUE); // special case
    else
    return(isprime(a)); // works only for odd a
    ...
    Chú thích dài:

    if (argc > 1) {
    // Get input file from command line.
    if (freopen(argv[1], "r", stdin) == NULL)
    error("can't open %s\n", argv[1]);
    }

    3. Không nên lạm dụng chú thích.

    Ví dụ:

    i++; // tăng i lên 1 đơn vị

    Chú thích như trên là không cần thiết vì bản thân dòng lệnh đã nói lên mục tiêu của nó. Thay vì vậy, bạn nên cố gắng giữ cho chương trình của bạn dễ đọc, dễ hiểu qua việc trình bày chương trình rõ ràng, đơn giản và cách đặt tên hợp lý.



    II. Ví dụ:

    C Code:
    1. /***********************************************
    2. *      Program        : Equation solving
    3. *     Written by      : Nguyen Tan Dat
    4. *     Email           : [email]ntdat@fit.hcmuns.edu.vn[/email]
    5. *     Last update     : 10/3/2002
    6. ************************************************/
    7.  
    8. #include <conio.h>
    9. #include <stdio.h>
    10.  
    11. #define     NO_SOL         1     //no solution
    12. #define     ONE_SOL        2     //one solution
    13. #define MULTI_SOL     3     //undefined solution
    14.  
    15.  
    16. // Function name     : Input
    17. // Description             : get coefficients
    18. // Return type      : void
    19. // Argument              : int *a
    20. // Argument              : int *b
    21. void Input(int *a, int *b)
    22.  
    23. {
    24.      printf("a = ");
    25.      scanf("%d", a);
    26.      printf("b = ");
    27.      scanf("%d", b);
    28. }
    29.  
    30. // Function name     : Output
    31. // Description             : print result
    32. // Return type      : void
    33. // Argument              : int nSol -- solution type
    34. // Argument              : float x -- the solution
    35.  
    36. void Output(int nSol, float x = 0)
    37. {
    38.      switch (nSol)
    39.      {
    40.           case NO_SOL:
    41.                printf("No solution!\n");
    42.                break;
    43.           case ONE_SOL:
    44.                printf("One solution: %f\n", x);
    45.                break;
    46.           case MULTI_SOL:
    47.                printf("Undefined solution!\n");
    48.                break;
    49.      }
    50. }
    51.  
    52.  
    53. void main()
    54. {
    55.      int a, b;     // coefficients
    56.      int nSol;     // solution type
    57.      float x;     // the solution
    58.      Input(&a, &b);
    59.  
    60.      if (a == 0)
    61.      {
    62.           if (b == 0)
    63.                nSol = MULTI_SOL;
    64.           else
    65.                nSol = NO_SOL;
    66.      }
    67.      else
    68.      {
    69.           nSol = ONE_SOL;
    70.           x = -(float)b/a;
    71.      }
    72.  
    73.      Output(nSol, x);
    74.      getch();
    75. }

    Bài viết được trích từ diễn đàn toán tin ĐHKHTN TPHCM

  2. #2
    Ngày gia nhập
    11 2006
    Bài viết
    633

    Hoặc:

    if (doSomeThing() == false) …

    nên được viết là:

    bool result = doSomeThing();

    if (result == false) …
    Có cái này tui thấy hơi bị dư, biến result là 1 biến có kiểu bool tức là sẽ trả về true hoặc false, cho nên chỉ cần ghi if (!result) là được rồi, ko cần phải if (result == false)

  3. #3
    Ngày gia nhập
    04 2007
    Bài viết
    2

    Trích dẫn Nguyên bản được gửi bởi huynguyen Xem bài viết
    Có cái này tui thấy hơi bị dư, biến result là 1 biến có kiểu bool tức là sẽ trả về true hoặc false, cho nên chỉ cần ghi if (!result) là được rồi, ko cần phải if (result == false)
    Ghi như thế là có 2 lí do đó bạn
    1 ) Sau này nhỡ ... có ngày mà wên đi dấu (!result) là giá trị ==NULL hay !=NULL thì mất công phải mò mẫm lắm
    2) Dễ dàng cho ng khác khi đọc code của mình mà ^^

  4. #4
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất nhiều sóng gió
    Bài viết
    356

    ==0 hay !=0 (hoặc ==NULL hay !=NULL) là một chuyện. ==false hay ==true là một chuyện hoàn toàn khác.

    Các biểu thức điều kiện của ifwhile trong mọi ngôn ngữ lập trình đều được xem là biểu thức boolean. Các tên biến boolean đều nên theo quy ước câu hỏi có-không (ví dụ: isResultOK thay vì result). Vì thế người ta không bao giờ viết các biểu thức so sánh 1 giá trị boolean với true, false. Trong biểu thức điều kiện của lệnh if và while thì càng không. Trong mọi ngôn ngữ, người ta viết if(isResultOK) chứ không viết if(isResultOK== true) bao giờ.

  5. #5
    Ngày gia nhập
    03 2008
    Bài viết
    57

    bài viết của bạn n04dethuong rất hay. Đó là các kiếm thức cơ bản khi viết code. Những cái này mặc dù mình đã được " rèn " từ khi mới học lt lần đầu từ người thầy đáng kính của mình .
    Nhưng mình thấy nhiều bạn viết code vẫn còn rất " hoang dã " không theo một chuẩn nào hết. khi post bài lên mà đoạn code của các bạn cứ viết các câu lệnh chồng lên nhau trên có một dòng , hoặc khai báo nguyên tên hàm dài thòng trong câu điều kiện. Như thế khi dò lỗi sẽ rất oải và khó phát hiện lỗi sai.
    Điều này vừa gây khó khăn cho cả người đọc lẫn người viết khi ct bị lỗi mà muốn tra lỗi để sửa.
    Cho nên những điều bạn dethuong nêu trên là rất bổ ích mặc dù trong đoạn code hd không tránh khỏi có những chỗ viết chưa thật tối ưu.
    Và các bạn nào mới học lập trình nên tham khảo kỹ bài hd đó để viết code cho "đẹp" mắt và dễ đọc

  6. #6
    Ngày gia nhập
    06 2007
    Nơi ở
    UIT
    Bài viết
    44

    Mặc định Phong cách lập trình C --> Tham khảo (ko thật sự chất lượng)

    Góp ý chút n04dethuong cho mấy đoạn code minh họa vào tagcode cho nó dễ nhìn chút !!

  7. #7
    Ngày gia nhập
    05 2008
    Bài viết
    1

    mình thấy bài viết của bạn rất hay,hãy tếp tuc post bài lên cho anh em nha!

  8. #8
    Ngày gia nhập
    08 2008
    Bài viết
    6

    các bạn nào cao thủ rồi mình nghĩ nên tham khảo thêm cuốn "Coding Standard" và cuốn "Code Complete".
    Đọc rất hay và nhiều cái mới so với những standard bạn được rèn ở trường như ở trên.

    VD:
    không nên ghi if (result == false)
    mà phải ghi if (false == result)
    Lý do: nhìu bạn quên thường ghi = thay vì ==, và compiler thì hiểu đó là phép gán, còn nếu bạn ghi false = result thì compiler sẽ báo lỗi ngay.

    Tên biến, interface nên có prefix, ví dụ Node *pRoot;
    static int sTotal;

    và nhìu nhìu nữa ...
    Một chút đóng góp,

  9. #9
    Ngày gia nhập
    05 2007
    Nơi ở
    UNS
    Bài viết
    9

    oh, của UNS hèn gì nhìn quen quen

    Mình nghĩ cách mà bạn Ada nói, cách đó chỉ nên áp dụng với tên hàm cho nó rõ ràng, thường là vậy, trong hàm đó thường có 1 số bước kiểm tra, còn tên biến thường chỉ bắt đầu bằng tiếp đầu ngữ để cho biết kiểu dữ liệu là đủ rồi

  10. #10
    Ngày gia nhập
    11 2007
    Bài viết
    294

    Trích dẫn Nguyên bản được gửi bởi Tcst Xem bài viết
    không nên ghi if (result == false)
    mà phải ghi if (false == result)
    Lý do: nhìu bạn quên thường ghi = thay vì ==, và compiler thì hiểu đó là phép gán, còn nếu bạn ghi false = result thì compiler sẽ báo lỗi ngay.

    Tên biến, interface nên có prefix, ví dụ Node *pRoot;
    static int sTotal;

    và nhìu nhìu nữa ...
    Một chút đóng góp,
    Cái này thực ra ko cần .
    Coder thì hay ghi là if(!result) chứ ít ai ghi tường minh như bạn cả.
    Còn về prefix thì thường có thêm kiểu dữ liệu để dễ kiểm soát các biến tiện cho quá trình chuyển kiểu của các biến.
    Is the moon rising...

Các đề tài tương tự

  1. Tham số, tham trị, tham biến. Ý nghĩa như thế nào trong lập trình C?
    Gửi bởi toend2008 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 28-08-2014, 10:24 AM
  2. Share website bán máy tính - hàng điện tử (chỉ mang tính chất tham khảo)
    Gửi bởi tuanvu199x trong diễn đàn Dự án & Source code C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 16-04-2013, 10:06 PM
  3. Tham quan Du lịch nhân dịp Lễ hội Khao lề Thế lính Hoàng Sa
    Gửi bởi trungnghia828282 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 13-04-2013, 04:48 PM
  4. Sách lập trình C C-Tham khảo toàn diện của Thạc sĩ Nguyễn Cẩn.
    Gửi bởi banbegiupdo007 trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 0
    Bài viết cuối: 09-04-2013, 10:10 AM
  5. Tư vấn phong thủy cho phòng ngủ, Tình yêu chắp cánh thăng hoa nhờ phong thủy
    Gửi bởi tomitoan22jambon trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 05-11-2012, 08:28 AM

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn