Phong Cach Lap Trinh

  • Upload
    thanh

  • View
    239

  • Download
    0

Embed Size (px)

Citation preview

  • 8/17/2019 Phong Cach Lap Trinh

    1/50

    trueclass

    cout

    C++operator

    catch

    virtual throw

    try

    friend bool

    cinnew

    inline private OOP

    deleteusing falseSTL

    public

    1

    T h S . Đ ặ n g B ì n h P h ư ơ n gd b p h u o n g @ f i t . h c m u s . e d u . v n

     VCBB© 13.09a

    this

    Bộ môn Công nghệ phần mềm

    Khoa Công nghệ thông tin

    Trường Đại học Khoa học Tự nhiên

    PP LT HƯỚNG ĐỐI TƯỢNG

    PHONG CÁCH LẬP TRÌNH

  • 8/17/2019 Phong Cach Lap Trinh

    2/50

    2

     VC

     

    BB

    1 2 3 4 5 6 7 8

    Nội dung

    Phong cách lập trình

    Quy ước đặt tên (naming convention)Quy tắc trình bày tổng thể chương trình

    Quy tắc trình bày dòng lệnh

    Quy tắc liên quan đến hằng số

    Quy tắc liên quan đến kiểu tự định nghĩa

    Quy tắc liên quan đến biến

    Quy tắc liên quan đến hàm

    Quy tắc chú thích chương trình #include using namespace std;void main()

    { cout

  • 8/17/2019 Phong Cach Lap Trinh

    3/50

    3

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Sức mạnh của làm việc nhóm

    Phong cách lập trình

    Phim quảng cáo của hãng Coca-Cola

  • 8/17/2019 Phong Cach Lap Trinh

    4/50

    4

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Vì sao phải có chuẩn và quy ước?

    Phong cách lập trình

  • 8/17/2019 Phong Cach Lap Trinh

    5/50

    5

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Quy ước đặt tên trong lập trình

    Ngoài tính đúng đắn, chương trình máy tínhcần phải dễ đọc và dễ hiểu.

    Hai chuẩn đang được sử dụng rộng rãi: Quy tắc đặt tên theo kiểu “lạc đà”.

    Quy tắc đặt tên theo phong cách Hung-ga-ri.

    Phong cách lập trình

    vs.

  • 8/17/2019 Phong Cach Lap Trinh

    6/50

    6

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Quy tắc “lạc đà” (Camel Case)

    Khái niệm

    Cách viết tránh sử dụng các khoảng trắnggiữa các từ, được sử dụng trong hầu hết các

    ngôn ngữ lập trình hiện đại và phổ biến nhưC, C++, Visual Basic (VB) và JavaScript.

    Phong cách lập trình

  • 8/17/2019 Phong Cach Lap Trinh

    7/50

    7

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Quy tắc “lạc đà” (Camel Case)

    Một số từ đồng nghĩa với ký hiệu CamelCase BumpyCaps, BumpyCase

    CamelCaps, CamelHumpedWord

    CapWordsPython

    mixedCase trong Python (lowerCamelCase)

    ClCl (Capital-lower Capital-lower)

    HumpBackNotation InterCaps, NerdCaps, InternalCapitalization

    WordsStrungTogether, WordsRunTogether 

    Phong cách lập trình

  • 8/17/2019 Phong Cach Lap Trinh

    8/50

    8

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Quy tắc “lạc đà” (Camel Case)

    Phân loại UpperCamelCase (thường gọi là PascalCase)

    nếu ký tự đầu tiên của câu được viết hoa.

    Ví dụ:TheQuickBrownFoxJumpsOverTheLazyDog

    lowerCamelCase (thường gọi là camelCase)nếu ký tự đầu tiên của câu được viết thường.

    Ví dụ:theQuickBrownFoxJumpsOverTheLazyDog

    Phong cách lập trình

  • 8/17/2019 Phong Cach Lap Trinh

    9/50

    9

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Ký hiệu Hung-ga-ri

    Khái niệm Là quy ước đặt tên trong lập trình máy tính

    được phát minh bởi Charles Simonyi.

    Thường sử dụng trong môi trường lập trìnhWindows như C, C++ và Visual Basic.

    Tên của biến cho biết kiểu, ý định sử dụnghoặc thậm chí là tầm vực của biến đó:

    • Tiền tố viết thường chứa thông tin về kiểu của biến.

    • Phần còn lại bắt đầu bằng ký tự hoa cho biết biếnchứa thông tin gì.

    Phong cách lập trình

  • 8/17/2019 Phong Cach Lap Trinh

    10/50

    10

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Ký hiệu Hung-ga-ri

    Phân loại theo mục đích của tiền tố Ký hiệu Hung-ga-ri hướng hệ thống

    (Systems Hungarian notation) sử dụng tiền tố

    để thể hiện kiểu dữ liệu thực sự, ví dụ:• lAccountNum (“l” – long integer)

    • szName (“sz” – zero-terminated string)

    Ký hiệu Hung-ga-ri hướng ứng dụng( Apps Hungarian notation) sử dụng tiền tố đểthể hiện mục đích sử dụng của biến, ví dụ:

    • rwPosition (“rw” – row, dòng)

    • fBusy (“f” – flag, cờ trạng thái) Phong cách lập trình

  • 8/17/2019 Phong Cach Lap Trinh

    11/50

    11

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Một số Ký hiệu Hung-ga-ri thường gặp

    Tiền tố chỉ kiểu dữ liệu của biến (type prefix ):

    Phong cách lập trình

    Tiền tố   Ý nghĩa   Ví  dụ

    b boolean bool bHasEffect;

    c char (chứa ký tự) char cLetter;

    n, i short, int, long, char int nValue;

    f, fp floating-point float fPrice, fpPrice;

    d, db double, long double double dPi, dbPi;

    sz zero-terminated string char szName[20];

    str C++ string std::string strName;

    Tiền tố n, f và d thường được sử dụng hơn tiền tố i , fp, db.Tiền tố n thường được sử dụng hàm ý số lượng ( count  ) còn tiền tố i được sửdụng hàm ý chỉ số ( index  ).

  • 8/17/2019 Phong Cach Lap Trinh

    12/50

    12

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Một số Ký hiệu Hung-ga-ri thường gặp

    Tiền tố bổ nghĩa cho kiểu dữ liệu (type modifier )được đặt trước tiền tố kiểu dữ liệu của biến(type prefix ) muốn áp dụng:

    Phong cách lập trình

    Tiền tố   Ý nghĩa   Ví  dụ

    u unsigned

    unsigned int unValue;

    unsigned short u16Value;

    unsigned long u32Value;

    a, rg array, range int anValue, rgnValue;

    p pointer int* pnValue;char* pszName;

    pfn function pointer int (pfnFunc)(int);

    pa dynamic array int* panValue = new int[10];

    Tiền tố a thường được sử dụng hơn tiền tố rg .

  • 8/17/2019 Phong Cach Lap Trinh

    13/50

    13

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Một số Ký hiệu Hung-ga-ri thường gặp

    Tiền tố bổ nghĩa cho tầm vực (scope modifier )được đặt trước tiền tố bổ nghĩa cho kiểu dữ liệu(type modifier ) muốn áp dụng:

    Phong cách lập trình

    Tiền tố   Ý nghĩa   Ví  dụg_ biến toàn cục (global) g_nValue, g_value

    _ biến cục bộ (local) _nValue, _value

    s_ biến tĩnh (static) s_nValue, s_value

    m_thành viên (member)

    của cấu trúc/lớp m_nValue, m_value

  • 8/17/2019 Phong Cach Lap Trinh

    14/50

    14

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Một số Ký hiệu Hung-ga-ri thường gặp

    Thường thấy trong lập trình Windows (trongsách “Programming Windows”, sách đầu tiên vềlập trình Windows API của Charles Petzold)

    Phong cách lập trình

    Tiền tố   Ý nghĩa   Ví  dụw word-size wParam

    l long-integer lParam

    hwnd handle to a window hwndFoo

    lpsz long pointer to a zero-terminated string lpszBar

    Q ớ ê ( )

  • 8/17/2019 Phong Cach Lap Trinh

    15/50

    15

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Đánh giá ký hiệu Hung-ga-ri

    Ưu điểm Kiểu biến có thể thấy được từ tên biến đó.

    Nhiều biến các nhau với cùng ngữ nghĩa có thể

    được sử dụng trong cùng một khối mã nguồn:nWidth, fWidth, dWidth.

    Các tên biến được thống nhất hơn.

    Có thể phát hiện dễ dàng việc ép kiểu không

    phù hợp hoặc các biểu thức sử dụng kiểu khôngtương thích khi đọc mã nguồn.

    Tránh sử dụng nhầm thao tác:heightWindow = window.getWidth()

    Phong cách lập trình

    Q ớ đặt tê ( i ti )1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    16/50

    16

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Đánh giá ký hiệu Hung-ga-ri

    Khuyết điểm Việc kiểm tra bằng mắt là thừa khi việc kiểm tra

    kiểu được thực hiện tự động bởi trình biên dịch.

    Một số IDE hiện đại tự động đánh dấu những chỗsử dụng kiểu không tương thích.

    Khi kiểu của biến thay đổi, tên của biến đó cũngphải thay đổi nếu không sẽ không thống nhất.

    Trong đa số trường hợp, việc biết ý nghĩa sửdụng của một biến bao hàm việc biết kiểu của nó.Vì vậy, nếu không biết biến dùng để làm gì thìviệc biết kiểu của nó cũng vô ích!

    Phong cách lập trình

    Q ớ đặt tê ( i ti )1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    17/50

    17

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Một số quan điểm đáng chú ý

    Linus Torvalds (cha đẻ của hệ điềuhành mã nguồn mở Linux )không ủng hộ ký hiệu Hung-ga-ri

    hướng hệ thống.“ Encoding the type of a function into the name (so-called Hungariannotation) is brain damaged —the compiler knows the types anyway and cancheck those, and it only confuses the programmer ” 

    Phong cách lập trình

    Q ớ đặt tê ( i ti )1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    18/50

    18

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Một số quan điểm đáng chú ý

    Steve McConnell (tác giả của nhiềusách CNPM nổi tiếng, được tạp chíSoftware Development xem là một

    trong ba người có ảnh hưởng nhất trong công nghiệp phần mềm cùng với Bill Gatesvà Linus Torvalds) ủng hộ ký hiệu Hung-ga-ri.“Although the Hungarian naming convention is no longer in widespread use,the basic idea of standardizing on terse, precise abbreviations continues to

    have value. ... Standardized prefixes allow you to check types accurately

    when you're using abstract data types that your compiler can't necessarily

    check” 

    Phong cách lập trình

    Q ớc đặt tên (naming con ention)1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    19/50

    19

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Một số quan điểm đáng chú ý

    Bjarne Stroustrup (nhà khoa học ngườiĐan Mạch phát triển NNLT C++)không ủng hộ ký hiệu Hung-ga-ri

    hướng hệ thống cho NNLT C++.“No I don't recommend ‘Hungarian’. I regard ‘Hungarian’ (embedding anabbreviated version of a type in a variable name) a technique that can be

    useful in untyped languages, but is completely unsuitable for a language

    that supports generic programming and object-oriented programming —bothof which emphasize selection of operations based on the type an arguments

    (known to the language or to the run-time support). In this case, 'building thetype of an object into names' simply complicates and minimizes abstraction” 

    Phong cách lập trình

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    20/50

    20

     VC

     

    BB

    Quy ước đặt tên (naming convention)1 2 3 4 5 6 7 8

    Một số quan điểm đáng chú ý

    Joel Spolsky (kỹ sư phần mềm và tácgiả của blog về phát triển phần mềmđặc biệt về phần mềm Windows) ủng hộ

    ký hiệu Hung-ga-ri hướng ứng dụng.“If you read Simonyi’s paper closely, what he was getting at was the samekind of naming convention as I used in my example above where we

    decided that us meant “unsafe string” and s meant “safe string.” They’reboth of type string. The compiler won’t help you if you assign one to theother and Intellisense won’t tell you bupkis. But they are semantically

    different; they need to be interpreted differently and treated differently andsome kind of conversion function will need to be called if you assign one to

    the other or you will have a runtime bug. If you’re lucky. (...) There’s still atremendous amount of value to Apps Hungarian, in that it increases

    collocation in code, which makes the code easier to read, write, debug, and

    maintain, and, most importantly, it makes wrong code look wrong”.

    Phong cách lập trình

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    21/50

    21

     VC

     

    BB

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

    Quy tắc 1

    Chương trình nên được tách thànhnhiều đơn thể (module), mỗi đơn thể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àysẽ giúp chương trình dễ bảo dưỡng

    hơn và khi đọc chương trình, ta 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.

    Phong cách lập trình

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    22/50

    22

     VC

     

    BB

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

    Quy tắc 2

    Nên sử dụng các tham số khi truyềnthông tin cho các chương trình con.Tránh sử dụng các biến toàn cục

    để truyền thông tin giữa cácchương trình con vì như vậy sẽ làm mất tínhđộc lập giữa các chương trình con và rấtkhó khăn khi kiểm soát giá trị của chúng khi

    chương trình thi hành.

    Phong cách lập trình

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    23/50

    23

     VC

     

    BB

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

    Quy tắc 3

    Cách trình bày chương trình càngnhất quán sẽ càng dễ đọc và dễ hiểu.Từ đó, ta sẽ mất ít thời gian để nghĩ

    về cách viết chương trình vànhư vậy sẽ có nhiều thời gian hơn

    để nghĩ về các vấn đề cần giải quyết.

    Phong cách lập trình

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    24/50

    24

     VC

     

    BB

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

    Quy tắc 4

    Chương trình nên giữ được tínhđơn giản và rõ ràng trong hầu hếtcá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 trình 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.

    Phong cách lập trình

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    25/50

    25

     VC

     

    BB

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

    Quy tắc 4

    Ví dụ

    Phong cách lập trình

    1

    2

    3

    45

    6

    7

    8

    9

    10

    11

    12

    13

    14

    a[i++] = 1; // Khó hiểu!

    a[i] = 1; // Viết thành 2 dòng

    i++; // dễ hiểu hơn…

    if (doSomething() == false) … // Hơi phức tạp!

    bool bResult = doSomething(); // Viết thành 2 dòng

    if (bResult == false) … // dễ hiểu hơn…

    *x += (*xp = (2*k < (n – m) ? c[k + 1] : d[k--])); // !!!

    if (2 * k < n – m) // Sử dụng lệnh điều kiện if else

    *xp = c[k + 1]; // thay vì toán tử 3 ngôi

    else // dễ đọc và dễ hiểu hơn…

    *xp = d[k--];

    *x = *x + *xp;

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    26/50

    26

     VC

     

    BB

    Quy tắc trình bày tổng thể chương trình1 2 3 4 5 6 7 8

    Quy tắc 5

    Chương trình nên thực hiện như một dòng chảy từtrên xuống dưới

    Các chỉ thị #include, #define trên cùng.

    Sau đó đến khai báo các biến toàn cục,class hay struct.

    Không nên có những thay đổi bất chợt dosử dụng goto hay continue.

    Phong cách lập trình

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    27/50

    27

     VC

     

    BB

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

    Quy tắc 6

    Mỗi câu lệnh nên được đặt riêng trên một dòng đểchương trình dễ đọc và dễ quan sátcách thực hiện trong quá trình tìm lỗi (debug ).

    Phong cách lập trình

    12

    3

    4

    5

    6

    7

    8

    9

    10

    x=a+b-c*d;for(int i=0; i

  • 8/17/2019 Phong Cach Lap Trinh

    28/50

    28

     VC

     

    BB

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

    Quy tắc 7

    Câu lệnh phải thể hiện đúng cấu trúc chương trìnhbằng cách sử dụng hợp lý thụt đầu dòng (tab)

    Phong cách lập trình

    1

    23

    4

    5

    6

    7

    if (nCount == 0) printf(“No data!\n”); // Khó debug!

    if (nCount == 0) // Không thấy được quan hệ

    printf(“No data!\n”); // phân cấp (lệ thuộc)

    if (nCount == 0) // OK

    printf(“No data!\n”);

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    29/50

    29

     VC

     

    BB

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

    Quy tắc 8

    Các cặp dấu {} bao các khối lệnh phải được canhthẳng hàng theo một trong hai cách sau:

    Nên viết cặp dấu {} trước rồi viết các lệnh vàogiữa để tránh thiếu các dấu ngoặc này.

    Phong cách lập trình

    1

    2

    34

    5

    6

    7

    89

    // Cách 1 // Cách 2

    if (…) if (…) {

    { …

    … }

    } else {

    else …

    { }

    …}

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    30/50

    30

     VC

     

    BB

    Quy ắc bày dò g ệ1 2 3 4 5 6 7 8

    Quy tắc 9

    Các câu lệnh nằm giữa cặp dấu {} được viếtthụt vào một khoảng tab (các lệnh ngang cấpthì phải thụt vào như nhau).

    Phong cách lập trình

    12

    3

    4

    5

    6

    7

    8

    if (a == 1)

    {

    printf(“One\n”);

    if (a == 2)

    printf(“Two\n”);

    else

    printf(“Neither one nor two!\n”);

    }

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    31/50

    31

     VC

     

    BB

    y y g ệ

    Quy tắc 10

    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 bởi 1 khoảng trắng nhằm làmbiểu thức dễ đọc hơn (trừ các toán tử ++, ––, –)

    Phong cách lập trình

    12

    3

    4

    5

    67

    8

    a=b*c; // Khó đọc!a = b * c; // Dễ đọc hơn!

    a = b ++; // Không nên!

    a = b++; // Nên!

    a = - b; // Không nên!

    a = -b; // Nên!

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    32/50

    32

     VC

     

    BB

    y y g ệ

    Quy tắc 11

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

    Phong cách lập trình

    1

    2

    34

    5

    6

    7

    89

    10

    11

    // Khoảng trắng sau dấu , trong khai báo hàm

    void swap(int a,int b); // Khó đọc!

    void swap(int a, int b); // Dễ đọc hơn…

    // Khoảng trắng sau dấu , trong lời gọi hàm

    swap(x,y); // Khó đọc!

    swap(x, y); // Dễ đọc hơn…

    // Khoảng trắng sau dấu ; trong vòng lặp for

    for (int i = 1;i < n;i++) … // Khó đọc!

    for (int i = 1; i < n; i++) … // Dễ đọc hơn…

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    33/50

    33

     VC

     

    BB

    y y g ệ

    Quy tắc 12

    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àmvà dấu (

    Phong cách lập trình

    12

    3

    4

    5

    6

    7

    8

    9

    10

    // Không nên có khoảng trắng giữa hoanVi và (

    void swap (int a, int b); // Dư khoảng trắng!

    void swap(int a, int b);

    // Nên có khoảng trắng giữ if và (

    // Không nên có khoảng trắng giữa strcmp và (

    if(strcmp (szInput, “info”) == 0) // Dư khoảng trắng!

    if (strcmp(szInput, “info”) == 0) // OK

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    34/50

    34

     VC

     

    BB

    y y g

    Quy tắc 13

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

    Phong cách lập trình

    1

    2

    int i = a >= b && c < d && e = b) && (c < d) && (e

  • 8/17/2019 Phong Cach Lap Trinh

    35/50

    35

     VC

     

    BBQuy tắc 14

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

    Phong cách lập trình

    12

    3

    4

    5

    6

    7

    8

    9

    10

    11

    void main()

    {

    // (Các) Đoạn lệnh nhập ở đây

    // ...

    // (Các) Đoạn lệnh xử lý ở đây

    // ...

    // (Các) Đoạn lệnh xuất

    // ...

    }

    Quy tắc trình bày dòng lệnh1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    36/50

    36

     VC

     

    BBQuy tắc 15

    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ìnhdễ dàng hơn khi không phải thực hiệncác thao tác cuộn ngang màn hình.Trong trường hợp dòng lệnh quá dài

    thì nên ngắt thành nhiều dòng.

    Phong cách lập trình

    1

    23

    4

    5

    6

    int myComplexFunction(unsigned int unValue, int nValue, ...

    int myComplexFunction(unsigned int unValue,

    int nValue,

    char cValue,

    int* pnValue);

    Quy tắc liên quan đến hằng số1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    37/50

    37

     VC

     

    BBQuy tắc 16

    Không nên viết trực tiếp các hằng số vào chươngtrình mà nên sử dụng #define hay const để địnhnghĩa. Điều này sẽ giúp lập trình viên dễ kiểm soátnhững chương trình lớn vì giá trị của hằng số khicần thay đổi thì chỉ phải thay đổi một lần duy nhấtở giá trị định nghĩa (ở #define hay const).

    Tuy vậy, 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ìnhdebug, ta sẽ không thể xem được giá trị của mộthằng số định nghĩa bằng #define.

    Phong cách lập trình

    Quy tắc liên quan đến hằng số1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    38/50

    38

     VC

     

    BBQuy tắc 17

    Tên hằng cần phải rõ nghĩa và không theo quy tắcPascalCase, camelCase hay Hung-ga-ri mà đượcviết in toàn bộ và giữa các từ cách nhau bởi dấu _

    Phong cách lập trình

    12

    3

    4

    5

    67

    #define N 100 // Không rõ nghĩa!

    const int NumberOfElements 100; // Nhầm với biến/hàm

    const int NUMBEROFELEMENTS 100; // Khó đọc

    const int NUMBER_OF_ELEMENTS 100; // Dễ đọc và rõ nghĩa

    Quy tắc liên quan đến kiểu tự định nghĩa1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    39/50

    39

     VC

     

    BBQuy tắc 18

    Tên kiểu tự định nghĩa là danh từ được đặt theoPascalCase và bắt đầu bằng một ký tự đại diện:

    TMyTypeName: Kiểu tự định nghĩa (typedef)

    SMyStructName: Kiểu cấu trúc (structure)

    UMyUnionName: Kiểu hợp nhất (union)

    EMyEnumName: Kiểu tập hợp (enumeration)

    CMyClassName: Lớp đối tượng (class)

    Phong cách lập trình

    Quy tắc liên quan đến biến1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    40/50

    40

     VC

     

    BBQuy tắc 19

    Tên biến được đặt theo ký hiệu Hung-ga-ri saocho đủ nghĩa, có thể là là các từ hoàn chỉnh hoặcviết tắt nhưng phải dễ đọc (dễ phát âm)

    Phong cách lập trình

    12

    3

    4

    5

    int nmaxnumber; // Không theo ký hiệu Hung-ga-ri

    int nMaxnumber; // Không theo ký hiệu Hung-ga-ri

    int nMaxNumber;

    Quy tắc liên quan đến biến1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    41/50

    41

     VC

     

    BBQuy tắc 20

    Tên biến kiểu dữ liệu tự định nghĩa (typedef,struct, union, class, …) được viết theocamelCase và không có tiền tố (T, S, U, C)

    Phong cách lập trình

    12

    3

    4

    5

    SFraction SFractionA; // Không nên có tiền tố S

    SFraction FractionA; // Không nên viết theo PascalCase

    SFraction fractionA, fracA;

    Quy tắc liên quan đến biến1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    42/50

    42

     VC

     

    BBQuy tắc 21

    Biến nên được khai báo ở gần vị trímà nó bắt đầu được sử dụng nhằmtránh việc khai báo một loạt cácbiến dư thừa ở đầu hàm haychương trình.

    Trong C chuẩn, tất các biến bắt buộc phải khaibáo ở đầu khối trước khi sử dụng.

    Trong C++ biến có thể khai báo ở bất kỳ nơi đâutrước khi sử dụng.

    Phong cách lập trình

    Quy tắc liên quan đến biến1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    43/50

    43

     VC

     

    BBQuy tắc 22

    Mỗi biến hay nhóm các biến cùng ý nhĩa nên khaibáo trên một dòng nhằm dễ chú thích về ý nghĩacủa mỗi biến.

    Phong cách lập trình

    12

    3

    4

    float fA, fB, fRoot; // Khó chú thích ý nghĩa!

    float fA, fB; // Hệ số a, b của phương trình bậc 1

    float fRoot; // Nghiệm của phương trình bậc 1

    Quy tắc liên quan đến biến1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    44/50

    44

     VC

     

    BBQuy tắc 23

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

    Phong cách lập trình

    1

    2

    3

    4

    5

    for (i = 0; i < n; i++) // n là số lần lặp

    for (n = 0; n < 10; n++) // n lại là biến điều khiển

    Quy tắc liên quan đến hàm1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    45/50

    45

     VC

     

    BBQuy tắc 24

    Tên hàm được viết theo camelCase và phải làđộng từ phản ánh công việc hàm sẽ thực hiệnhoặc giá trị trả về của nó.

    Phong cách lập trình

    12

    3

    4

    5

    int Max(int a[], int n); // Không rõ hành động!

    int FindMax(int a[], int n); // Sai quy tắc đặt tên

    int findMax(int a[], int n); // OK

    Quy tắc chú thích chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    46/50

    46

     VC

     

    BBQuy tắc 25

    Nên sử dụng dấu // để ghi chú vìdấu này không có ảnh hưởng khi sửdụng cặp ký hiệu /* */ để vô hiệuhóa một đoạn lệnh trong quá trìnhsửa lỗi chương trình.

    Nên nhớ rằng trong C/C++ không cho phép cáccặp dấu /* */ lồng nhau.

    Phong cách lập trình

    // ...

    /*

    …*/

    Quy tắc chú thích chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    47/50

    47

     VC

     

    BBQuy tắc 26

    Nên viết chú thích ngắn gọn nhưngđầy đủ, dễ hiểu qua việc trình bàychương trình rõ ràng, đơn giản vàcách đặt tên hợp lý.

    Với các chú thích ngắn, nê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 hãy đặt câu chú thích trênmột dòng riêng ngay phía trên câu lệnh cầnchú thích.

    Phong cách lập trình

    Quy tắc chú thích chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    48/50

    48

     VC

     

    BBQuy tắc 26

    Ví dụ

    Phong cách lập trình

    1

    2

    3

    45

    6

    7

    8

    910

    11

    12

    13

    if (a == 2)

    return true; // Trường hợp đặc biệt

    else

    return isPrime(a)); // Trường hợp khác

    if (argc > 1)

    {

    // Mở và xử lý tập tin…

    FILE *fp = fopen(argv[1], “rb”);

    if (fp != NULL)

    fclose(fp);

    }

    Quy tắc chú thích chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    49/50

    49

     VC

     

    BBQuy tắc 27

    Không nên lạm dụng chú thích, cố gắng giữ chochương trình dễ đọc, dễ hiểu.

    Phong cách lập trình

    1

    2

    34

    5

    6

    void main() // Hàm chính!!!

    { // Bắt đầu hàm chính!!!

    int i; // Khai báo biến i kiểu số nguyên!!!i = 369; // Gán cho i giá trị 369!!!

    i++; // Câu lệnh này để tăng i thêm 1 đơn vị!!!

    } // Kết thúc hàm chính!!!

    Quy tắc chú thích chương trình1 2 3 4 5 6 7 8

  • 8/17/2019 Phong Cach Lap Trinh

    50/50

     VC

     

    BBQuy tắc 28

    Viết chú thích cho từng hàm và cho từng tập tinmã nguồn (.h và .cpp).

    1

    2

    34

    5

    6

    7

    89

    10

    11

    12

    // Mô tả : Chương trình xử lý mảng một chiều

    // Tác giả : Đặng Bình Phương

    // Email : [email protected]// Ngày cập nhật : 15/06/2012

    // Tên hàm : findMax

    // Mô tả : Tìm số lớn nhất trong mảng cho trước

    // Kiểu trả về : int// Tham số: int a[] – Mảng một chiều các phần tử kiểu int

    // Tham số: int n – Số lượng phần tử 

    int findMax(int a[], int n);