Chương 5: Phong Cách Lập Trình và Tại Sao Nó Quan Trọng

Tài liệu nghiên cứu Chương 5 phong cách lập trình, tổng hợp lý thuyết và thực hành, cung cấp kiến thức chuyên sâu về ., phục vụ nghiên cứu và ứng dụng thực tiễn

Người đăng

Ẩn danh

Thể loại

tài liệu

2020

51
3
0

Phí lưu trữ

30 Point

Mục lục chi tiết

5. CHƯƠNG 5: Phong cách lập trình

5.1. Khái niệm phong cách lập trình

5.2. Một số quy tắc cơ bản về phong cách lập trình

5.3. Viết tài liệu chương trình

Tóm tắt

I. Tổng quan về Phong Cách Lập Trình Quy Tắc và Hướng Dẫn Cơ Bản

Phong cách lập trình là một tập hợp các quy tắc và hướng dẫn được sử dụng khi viết mã nguồn chương trình. Việc áp dụng phong cách lập trình không chỉ giúp mã nguồn trở nên dễ đọc hơn mà còn tạo điều kiện thuận lợi cho việc bảo trì và phát triển trong tương lai. Các lập trình viên cần hiểu rõ về phong cách lập trình để có thể giao tiếp hiệu quả với đồng nghiệp và cải thiện chất lượng mã nguồn.

1.1. Khái niệm về Phong Cách Lập Trình

Phong cách lập trình không chỉ đơn thuần là cách viết mã, mà còn là cách tổ chức và cấu trúc mã nguồn. Nó bao gồm các quy tắc về định dạng, cách đặt tên biến, và cách viết chú thích. Một phong cách lập trình tốt giúp lập trình viên dễ dàng đọc và hiểu mã của người khác, cũng như mã của chính mình trong tương lai.

1.2. Tại sao cần Phong Cách Lập Trình

Phong cách lập trình có ảnh hưởng lớn đến khả năng bảo trì và mở rộng mã nguồn. Theo Tomer Ben Rachel, một lập trình viên full stack, "Programming is 10% writing code, and 90% reading code." Điều này cho thấy rằng việc viết mã rõ ràng và dễ hiểu là rất quan trọng.

II. Các Quy Tắc Cơ Bản về Phong Cách Lập Trình

Các quy tắc cơ bản về phong cách lập trình bao gồm định dạng mã, cách đặt tên biến, và viết chú thích. Những quy tắc này giúp mã nguồn trở nên dễ đọc và dễ hiểu hơn. Việc tuân thủ các quy tắc này không chỉ giúp lập trình viên hiện tại mà còn giúp các lập trình viên trong tương lai dễ dàng làm việc với mã nguồn.

2.1. Định Dạng Mã Nguồn

Định dạng mã nguồn bao gồm việc sử dụng thụt đầu dòng, khoảng cách, và dòng trống để phân tách các phần khác nhau trong mã. Việc này giúp mã trở nên dễ đọc hơn và giảm thiểu khả năng xảy ra lỗi. Một quy tắc quan trọng là thụt đầu dòng phải nhất quán, ví dụ, sử dụng 2 hoặc 4 dấu cách cho mỗi cấp độ thụt đầu dòng.

2.2. Cách Đặt Tên Biến và Hàm

Cách đặt tên biến và hàm cũng rất quan trọng trong phong cách lập trình. Tên biến nên có ý nghĩa rõ ràng để người đọc có thể hiểu được vai trò của nó. Ví dụ, thay vì sử dụng tên biến như 'a' hay 'b', nên sử dụng tên như 'distance' hay 'numLetters' để dễ hiểu hơn.

III. Hướng Dẫn Viết Tài Liệu Chương Trình Hiệu Quả

Việc viết tài liệu cho chương trình là một phần không thể thiếu trong quá trình phát triển phần mềm. Tài liệu giúp các lập trình viên khác hiểu rõ hơn về mã nguồn và cách sử dụng nó. Một tài liệu tốt cần phải rõ ràng, đầy đủ và dễ hiểu.

3.1. Các Bước Viết Tài Liệu Chương Trình

Các bước viết tài liệu chương trình bao gồm mô tả tổng quát về chức năng của chương trình, quy trình nghiệp vụ, và giải thích các hàm chính. Tài liệu cũng nên bao gồm các ví dụ minh họa để người đọc dễ dàng hiểu hơn.

3.2. Tài Liệu Kiểm Thử và Hướng Dẫn Sử Dụng

Tài liệu kiểm thử là một phần quan trọng trong dự án phần mềm. Nó giúp đảm bảo rằng chương trình hoạt động đúng như mong đợi. Hướng dẫn sử dụng cũng cần được viết rõ ràng để người dùng có thể dễ dàng sử dụng phần mềm.

IV. Nguyên Tắc SOLID trong Lập Trình Hướng Đối Tượng

Nguyên tắc SOLID là một tập hợp các nguyên tắc thiết kế phần mềm giúp lập trình viên viết mã nguồn dễ bảo trì và mở rộng. Các nguyên tắc này bao gồm: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, và Dependency Inversion.

4.1. Nguyên Tắc Single Responsibility

Nguyên tắc này yêu cầu mỗi lớp chỉ nên có một lý do để thay đổi. Điều này giúp giảm thiểu sự phụ thuộc giữa các lớp và làm cho mã nguồn dễ bảo trì hơn.

4.2. Nguyên Tắc Open Closed

Nguyên tắc này cho rằng các lớp nên được mở để mở rộng nhưng đóng để sửa đổi. Điều này có nghĩa là lập trình viên có thể thêm chức năng mới mà không cần thay đổi mã nguồn hiện tại.

V. Kết Luận và Tương Lai của Phong Cách Lập Trình

Phong cách lập trình là một yếu tố quan trọng trong việc phát triển phần mềm. Việc áp dụng các quy tắc và hướng dẫn cơ bản sẽ giúp lập trình viên viết mã nguồn dễ đọc, dễ hiểu và dễ bảo trì. Tương lai của phong cách lập trình sẽ tiếp tục phát triển cùng với sự tiến bộ của công nghệ và nhu cầu của ngành công nghiệp.

5.1. Xu Hướng Mới trong Phong Cách Lập Trình

Các xu hướng mới trong phong cách lập trình bao gồm việc sử dụng các công cụ tự động hóa để kiểm tra mã nguồn và cải thiện chất lượng mã. Điều này giúp lập trình viên tiết kiệm thời gian và nâng cao hiệu quả công việc.

5.2. Tầm Quan Trọng của Đào Tạo và Học Tập Liên Tục

Đào tạo và học tập liên tục là rất quan trọng trong ngành lập trình. Các lập trình viên cần cập nhật kiến thức và kỹ năng mới để đáp ứng nhu cầu thay đổi của công nghệ và thị trường.

24/07/2025

Trích đoạn nội dung tài liệu

Chương 5: Phong cách lập trình 31/03/2020 SangDV 1 Nội dung 1. Khái niệm phong cách lập trình 2. Một số quy tắc cơ bản về phong cách lập trình 3. Viết tài liệu chương trình 31/03/2020 SangDV 2 Khái niệm phong cách lập trình 31/03/2020 SangDV 3 Tại sao cần phong cách lập trình? • Ai đọc chương trình của chúng ta? • Trình dịch • Các lập trình viên khác và… bản thân chúng ta typedef struct{double x,y,z}vec;vec U,black,amb={.02};struct sphere{ vec cen,color;double rad,kd,ks,kt,kl,ir}*s,*best,sph[]={0.5,};yx;double u,b,tmin,sqrt(),tan();double vdot(A,B)vec A ,B;{return A.z;}vec vcomb(a,A,B)double a;vec A,B;{B.z;return B;}vec vunit(A)vec A;{return vcomb(1./sqrt( vdot(A,A)),A,black);}struct sphere*intersect(P,D)vec P,D;{best=0;tmin=1e30;s= sph+5;while(s--sph)b=vdot(D,U=vcomb(-1.,P,s-cen)),u=b*b-vdot(U,U)+s-rad*s - rad,u=u0?sqrt(u):1e31,u=b-u1e-7?b-u:b+u,tmin=u=1e-7&&u<tmin?best=s,u: tmin;return best;}vec trace(level,P,D)vec P,D;{double d,eta,e;vec N,color; struct sphere*s,*l;if(!level--)return black;if(s=intersect(P,D));else return amb;color=amb;eta=s-ir;d= -vdot(D,N=vunit(vcomb(-1.,N,black),eta=1/eta,d= -d;l=sph+5;while(l--sph)if((e=l - kl*vdot(N,U=vunit(vcomb(-1.,P,l-cen))))0&&intersect(P,U)==l)color=vcomb(e ,l- color,color);U=s-color;color.0f\n",U);} This is a working ray tracer! (courtesy of Paul Heckbert) 31/03/2020 SangDV 4 Tại sao cần phong cách lập trình? • Chương trình thường phải chỉnh sửa vì những lí do: • Chưa hoàn thiện hoặc bị lỗi: phải bảo trì • Thêm chức năng mới: mở rộng • Phong cách lập trình có ảnh hưởng rất lớn tới nguồn lực cần thiết để đọc hiểu và chỉnh sửa chương trình.

31/03/2020 SangDV 5 Tại sao cần phong cách lập trình? • “Programming is an art of telling another human what one wants the computer to do. • “Programming is 10% writing code, and 90% reading code. Reading your own code and reading other code.” • “Taking that extra time to write a proper description of what you worked on will save huge amounts of time in the future.” Tomer Ben Rachel, a full stack developer. 31/03/2020 SangDV 6 Thế nào là một phong cách lập trình? • Là một tập hợp các quy tắc và hướng dẫn được sử dụng khi viết mã nguồn chương trình 31/03/2020 SangDV 7 Chọn phong cách lập trình nào? • Có nhiều phong cách lập trình khác nhau.

Thường mỗi công ty hoặc tổ chức có phong cách lập trình riêng. • Ví dụ: • Google: https://google.io/styleguide/cppguide.html • Linux kernel: https://slurm.com/coding_style.pdf • GNU: https://www.org/prep/standards/standards.html 31/03/2020 SangDV 8 Một số quy tắc cơ bản 31/03/2020 SangDV 9 Các quy tắc cơ bản • Chúng ta sẽ đề cập một số quy tắc đơn giản của một phong cách lập trình tốt: • Định dạng (format) • Cách đặt tên (naming conventions) • Viết đặc tả hàm (specification) • Chú thích (comments) • Chúng ta tập trung chủ yếu vào làm cách nào để viết một chương trình dễ đọc. • Chúng ta sẽ minh họa các quy tắc bằng cách ví dụ. • Phong cách lập trình thật có thể bao gồm hàng trăm quy tắc.

31/03/2020 SangDV 10 Định dạng: thụt đầu dòng và dấu ngoặc int gcd(int a, int b) int gcd(int a, int b) { { while (a != b) { while (a != b) if (a > b) a = a – b; { else b = b – a; if (a > b) a = a – b; } else b = b – a; return a; } } return a;} • Thụt đầu dòng bằng 2 hoặc 4 dấu cách (phải nhất quán!). Tránh dùng • Đóng mở ngoặc nhất quán (ví dụ mở ngoặc ở cuối dòng) 31/03/2020 SangDV 11 Ví dụ thụt đầu dòng if (month == FEB) { if (month == FEB) { if (year % 4 == 0) if (year % 4 == 0) { if (day > 29) if (day > 29) legal = FALSE; legal = FALSE; else } if (day > 28) else { legal = FALSE; if (day > 28) } legal = FALSE; } } (else matches “if day > 29”) 31/03/2020 SangDV 12 Ví dụ thụt đầu dòng • Use “else-if” cho cấu trúc đa lựa chọn • Ví dụ: Tìm kiếm nhị phân if (x < v[mid]) if (x < v[mid]) high = mid – 1; high = mid – 1; else else if (x > v[mid]) if (x > v[mid]) low = mid + 1; low = mid + 1; else else return mid; return mid; 31/03/2020 SangDV 13 Đây có phải là một phong cách lập trình tốt? • Lập trình viên Python sử dụng Java 31/03/2020 SangDV 14 Định dạng: dòng trống và dấu cách • Dùng dòng trống ngăn các phần khác nhau trong chương trình: • Giữa các hàm khác nhau • Giữa các phần khác nhau của cùng một hàm (khởi tạo, vòng lặp chính, return…) • Dùng khoảng cách để chương trình dễ đọc hơn: • Trong các biểu thức phức tạp (nhấn mạnh thứ tự ưu tiên các phép toán) • Phân tách các phần tử trong một danh sách 31/03/2020 SangDV 15 Ví dụ dấu cách // Dense code // Spaced declarations int numCars=0,time=0; int numCars = 0, time = 0; // Confusing expression // Emphasize precedences a = b  c+d  2; a = b*c + d*2; // No space after if/while while(a!=0) {…} // Space after if/while while (a != 0) {…} // Space after function name x = power (y,2); // No space after function name // but space between parameters x = power(y, 2); 31/03/2020 SangDV 16 Ví dụ dòng trống • Dùng dòng trống để chia code thành các phần chính #include <stdio.h> /* Read a circle's radius from stdin, and compute and write its diameter and circumference to stdout. Return 0 if successful. */ int main() { const double PI = 3.14159; int radius; int diam; double circum; printf("Enter the circle's radius:\n"); if (scanf("%d", &radius) != 1) { fprintf(stderr, "Error: Not a number\n"); exit(EXIT_FAILURE); } … 31/03/2020 SangDV 17 Ví dụ dòng trống • Dùng dòng trống để chia code thành các phần chính diam = 2 * radius; circum = PI * (double)diam; printf("A circle with radius %d has diameter %d\n", radius, diam); printf("and circumference %f.\n", circum); return 0; } 31/03/2020 SangDV 18 Định dạng biểu thức • Nên dùng các biểu thức dạng nguyên bản • Ví dụ: Kiểm tra nếu n thỏa mãn j < n < k if (!(n >= k) && !(n <= j)) if ((j < n) && (n < k)) • Biểu thức điều kiện có thể đọc như cách thức bạn viết thông thường • Đừng viết biểu thức điều kiện theo kiểu mà bạn không bao giờ sử dụng 31/03/2020 SangDV 19 Định dạng biểu thức • Dùng () để tránh nhầm lẫn • Ví dụ: Kiểm tra nếu n thỏa mãn j < n < k if (j < n && n < k) if ((j < n) && (n < k)) • Nên nhóm các nhóm một cách rõ ràng • Toán tử quan hệ (ví dụ “>”) có độ ưu tiên cao hơn các toán tử logic (ví dụ “&&”), nhưng không phải ai cũng nhớ điều đó.

31/03/2020 SangDV 20 Định dạng biểu thức • Dùng () để tránh nhầm lẫn • Ví dụ: đọc và in các ký tự cho đến cuối tệp. while (c = getchar() != EOF) putchar(c); while ((c = getchar()) != EOF) putchar(c); • Nên nhóm các nhóm một cách rõ ràng • Toán tử Logic (“!=“) có độ ưu tiên cao hơn toán tử gán (“=“) 31/03/2020 SangDV 21 Định dạng biểu thức • Đơn giản hóa các biểu thức phức tạp • Ví dụ: Xác định các ký tự tương ứng với các tháng của năm if ((c == 'J') || (c == 'F') || (c == 'M') || (c == 'A') || (c == 'S') || (c == 'O') || (c == 'N') || (c == 'D')) if ((c == 'J') || (c == 'F') || (c == 'M') || (c == 'A') || (c == 'S') || (c == 'O') || (c == 'N') || (c == 'D')) • Nên xắp xếp các cơ cấu song song. 31/03/2020 SangDV 22 Quy tắc đặt tên • Một vấn đề quan trọng trong phong cách lập trình là làm thế nào đặt tên thích hợp cho các thành phần của chương trình: • Các tệp (files) • Các hàm • Các biến • etc • Quy tắc đặt tên có thể gây tranh cãi và thường đề cập tới: • Độ dài các định danh • Làm thế nào kết hợp ký tự (hoa và thường) với các số • Làm thế nào để phân tách các từ trong một định danh nhiều từ (dấu cách không được dùng) • etc 31/03/2020 SangDV 23 Quy tắc đặt tên Files: Files: x2.h Variables: Variables: int nl; int numLetters; double n, m; double x, y; // coordinates Functions: Functions: double f(double n); double sqrt(double x); 31/03/2020 SangDV 24 Một số khuyến nghị về quy tắc đặt tên • Đặt tên có ý nghĩa để từ tên gọi có thể hiểu được vai trò của nó. • Có thể đặt tên ngắn nếu ý nghĩa của nó tường minh trong ngữ cảnh.

Ví dụ: for (int i = 0; i < n; ++i) … double d; // represents distance // this could be obvious in a program // written by Physicists 31/03/2020 SangDV 25 Một số khuyến nghị về quy tắc đặt tên • Các tên i, j, k được dùng cho các chỉ sổ. • Các biến bắt đầu bởi n thường dùng để chỉ các số tự nhiên. • Các biến bắt đầu bởi x, y, z thường để chỉ các số thực (ví dụ tọa độ). • Ví du: tên cho khoảng cách.

• di (rất tệ: difference? 𝑑𝑖 ?.) • dis (tệ: display? disjoint?.) • dist (tốt hơn nhưng có thể cải thiện thêm) • distance (tốt nhất) • d (chấp nhận được trong ngữ cảnh toán hay vật lý khi 𝑑 luôn dùng để ký hiệu khoảng cách. Dùng ký tự khác có thể gây nhầm lẫn. 31/03/2020 SangDV 26 Một số khuyến nghị về quy tắc đặt tên • Dùng tên có nhiều từ để cải thiện khả năng đọc: numLetters, first_element, IsPrime, StartTime, … • Lập trình với các tên ngắn sẽ dẫn tới hậu quả mất nhiều thời gian hơn để phát triên: do khó hiểu và khó debug. Thêm một vài ký tự vào tên biến có thể tiết kiệm nhiều thời gian.

Ví dụ: int t; → int timeInSeconds; • Lập trình với tên biến dài cũng không hiệu quả. Đa số IDE có chế độ tự hoàn thành và có thể định dang tên biến chỉ sau khi gõ vài ký tự. • Bạn muốn sử dụng thời gian của mình vào việc nào hơn: viết chương trình hay ngồi debug? 31/03/2020 SangDV 27 Kết hợp các từ: một vài phong cách Camel Case myFunctionName Pascal Case MyClassName Snake Case my_variable_name SCREAMING SNAKE CASE MY_CONSTANT_NAME Phương án nào tốt hơn? • Hãy tuân theo quy tắc của phong cách lập trình • Hãy nhất quán 31/03/2020 SangDV 28 Đặc tả hàm • Mẹ tôi nói: “Con ơi, ra chợ mua cho mẹ 1 chai sữa. Nếu có trứng thì mua 6” Tôi quay về với 6 chai sữa.

Mẹ nói: “Sao lại mua 6 chai sữa?” Tôi nói: “VÌ HỌ CÓ TRỨNG!!!” 31/03/2020 SangDV 29 Đặc tả hàm • Trong khóa này ta tập trung vào vấn đề làm sao viết đặc tả tốt cho hàm. Những quy tắc quan trọng: • Đặt tên tốt cho hàm và các tham số • Mô tả ý nghĩa và miền giá trị của các tham số • Mô tả hàm làm cái gì và/hoặc trả về cái gì. • Một đặc tả hàm tốt sẽ cho phép lập trình viên hiểu chính xác hàm làm gì mà không cần nhìn vào thân hàm • Cần thiết: mỗi tham số cần được đề cập trong đặc tả của hàm. 31/03/2020 SangDV 30 Ví dụ đặc tả hàm // Checks whether it is a multiple bool check(int n, int m); // Questions: // What does the function name mean? // Who is multiple of whom?

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ