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 đủ
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:
bai_giang_ky_thuat_lap_trinh_chuong_5_phong_cach_lap_trinh.pdf

