Bài giảng Kỹ thuật lập trình - Chương 5: Phong cách lập trình

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,.02,.02};struct sphere{  
vec cen,color;double rad,kd,ks,kt,kl,ir}*s,*best,sph[]={0.,6.,.5,1.,1.,1.,.9,  
.05,.2,.85,0.,1.7,-1.,8.,-.5,1.,.5,.2,1.,.7,.3,0.,.05,1.2,1.,8.,-.5,.1,.8,.8,  
1.,.3,.7,0.,0.,1.2,3.,-6.,15.,1.,.8,1.,7.,0.,0.,0.,.6,1.5,-3.,-3.,12.,.8,1.,  
1.,5.,0.,0.,0.,.5,1.5,};yx;double u,b,tmin,sqrt(),tan();double vdot(A,B)vec A  
,B;{return A.x*B.x+A.y*B.y+A.z*B.z;}vec vcomb(a,A,B)double a;vec A,B;{B.x+=a*  
A.x;B.y+=a*A.y;B.z+=a*A.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.,P=vcomb(tmin,D,P),s-cen  
)));if(d<0)N=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.x*=U.x;color.y*=U.y;color.z*=U.z;e=1-eta* eta*(1-  
d*d);return vcomb(s-kt,e0?trace(level,P,vcomb(eta,D,vcomb(eta*d-sqrt  
(e),N,black))):black,vcomb(s-ks,trace(level,P,vcomb(2*d,N,D)),vcomb(s-kd,  
color,vcomb(s-kl,U,black))));}main(){printf("%d %d\n",32,32);while(yx<32*32)  
U.x=yx%32-32/2,U.z=32/2-yx++/32,U.y=32/2/tan(25/114.5915590261),U=vcomb(255.,  
trace(3,black,vunit(U)),black),printf("%.0f %.0f %.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.”  
Donald Knuth.  
• “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  
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:  
• Linux kernel:  
• GNU:  
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 (year % 4 == 0)  
if (day > 29)  
legal = FALSE;  
else  
if (month == FEB) {  
if (year % 4 == 0) {  
if (day > 29)  
legal = FALSE;  
}
if (day > 28)  
legal = FALSE;  
}
else {  
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])  
high = mid – 1;  
else  
if (x < v[mid])  
high = mid – 1;  
else if (x > v[mid])  
low = mid + 1;  
else  
if (x > v[mid])  
low = mid + 1;  
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  
int numCars=0,time=0;  
// Spaced declarations  
int numCars = 0, time = 0;  
// Confusing expression  
a = b c+d 2;  
// Emphasize precedences  
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>  
#include <stdlib.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  
Tải về để xem bản đầy đủ
pdf 51 trang Thùy Anh 16920 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 5: Phong cách lập trình", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_5_phong_cach_lap_trinh.pdf