Bài giảng Kỹ nghệ phần mềm - Bài 8: Lập trình - Nguyễn Văn Vỵ

Lập trình hiệu quả hơn, sản phẩm rẻ tiền hơn

? Tốc độ phát triển cao hơn

 năng lực biểu diễn cao hơn

 khả năng sử dụng lại cao hơn

? Dễ bảo trì hơn

 dễ hiểu, dễ sửa đổi, thích nghi

? Chất lượng cao hơn

 sử dụng các cấu trúc an toμn hơn

chương trình cần dễ hiểu

Khái niệm lập trình hiệ

 

pdf 78 trang yennguyen 3720
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ nghệ phần mềm - Bài 8: Lập trình - Nguyễn Văn Vỵ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Kỹ nghệ phần mềm - Bài 8: Lập trình - Nguyễn Văn Vỵ

Bài giảng Kỹ nghệ phần mềm - Bài 8: Lập trình - Nguyễn Văn Vỵ
Bộ môn Công nghệ phần mềm- Khoa CNTT- ĐHCN
Email: vynv@coltech.vnu.vn
Kỹ nghệ phần mềm
Software Engeneering
Nguyễn Văn Vỵ
Bộ mụn Cụng nghệ phần mềm – ĐHCN 2
NguyễnVănVỵ
Nội dung
Bài 8: Lập trỡnh 
„ Ngôn ngữ lập trình
„ Phong cách lập trình
„ Lập trình tránh lỗi
„ Lập trình h−ớng hiệu quả
Bộ mụn Cụng nghệ phần mềm – ĐHCN 3
NguyễnVănVỵ
TÀI LiỆU THAM KHẢO
1. Nguyễn Văn Vỵ, Nguyễn Việt Hà. Giỏo trỡnh kỹ nghệ phần 
mềm. Nhà xuất bản Đại học Quốc gia Hà nội, 2008
2. Grady Booch, James Rumbaugh, Ivar Jacobson. The Unified 
Modeling language User Guid. Addison-Wesley, 1998.
3. M. Ould. Managing Software Quality and Business Risk, John 
Wiley and Sons, 1999.
4. Roger S.Pressman, Software Engineering, a Practitioner’s 
Approach. Fifth Edition, McGraw Hill, 2001.
5. Ian Sommerville, Software Engineering. Sixth Edition, Addison-
Wasley, 2001.
6. Nguyễn Văn Vỵ. Phõn tớch thiết kế hệ thống thụng tin hiện đại. 
Hướng cấu trỳc và hướng đối tượng, NXB Thống kờ, 2002, Hà
Nội.
Bộ mụn Cụng nghệ phần mềm – ĐHCN 4
NguyễnVănVỵ
Khái niệm lập trình hiệu quả
„ Sản phẩm phần mềm tốt khi
 phân tích tốt 
 thiết kế tốt 
 lập trình tốt
 kiểm thử chặt chẽ
„ kỹ thuật lập trình tốt
 chuyên nghiệp (tuân theo các chuẩn)
 ổn định
 hiệu quả
Bộ mụn Cụng nghệ phần mềm – ĐHCN 5
NguyễnVănVỵ
Lập trình hiệu quả hơn, sản phẩm rẻ tiền hơn
„ Tốc độ phát triển cao hơn
 năng lực biểu diễn cao hơn
 khả năng sử dụng lại cao hơn
„ Dễ bảo trì hơn
 dễ hiểu, dễ sửa đổi, thích nghi
„ Chất l−ợng cao hơn
 sử dụng các cấu trúc an toμn hơn
ch−ơng trình cần dễ hiểu
Khái niệm lập trình hiệu quả
Bộ mụn Cụng nghệ phần mềm – ĐHCN 6
NguyễnVănVỵ
Tốc độ viết mã nguồn
„ Tốc độ phát triển cao ≠ lμm ngắn ch−ơng trình nguồn
 Tốc độ không tỷ lệ thuận với số dòng lệnh
 Câu lệnh phức tạp lμm giảm độ dễ hiểu
„ Ngôn ngữ mức cao (4GL)
 năng lực biểu diễn cao
 tốc độ phát triển nhanh
Bộ mụn Cụng nghệ phần mềm – ĐHCN 7
NguyễnVănVỵ
Tiến hóa của kỹ thuật lập trình
„ Lập trình tuần tự (tuyến tính)
„ Lập trình có cấu trúc (thủ tục)
„ Lập trình h−ớng chức năng
„ Lập trình h−ớng đối t−ợng
„ Kỹ thuật thế hệ thứ 4
Bộ mụn Cụng nghệ phần mềm – ĐHCN 8
NguyễnVănVỵ
Lập trình tuần tự
■ không có/thiếu các lệnh có cấu trúc
(for, while, do while)
■ lạm dụng các lệnh GOTO
■ thiếu khả năng khai báo biến cục bộ
 độ ghép nối cao
 ch−ơng trình khó hiểu, khó sửa, dễ sinh lỗi
Ngôn ngữ dùng: thế hệ 1, 2: assembly, basic,...
Bộ mụn Cụng nghệ phần mềm – ĐHCN 9
NguyễnVănVỵ
Lập trình có cấu trúc
■ sử dụng các lệnh có cấu trúc 
(for, while, do while)
■ hạn chế/cấm dùng GOTO
■ sử dụng ch−ơng trình con, biến cục bộ
dễ hiểu hơn, an toμn hơn
Ngôn ngữ dùng: thế hệ 2, 3: Fortran, Pascal, C,
Bộ mụn Cụng nghệ phần mềm – ĐHCN 10
NguyễnVănVỵ
Lập trình h−ớng chức năng
„ Dựa trên nguyên tắc ghép nối dữ liệu
 trao đổi dữ liệu bằng tham số vμ giá trị trả lại
 loại bỏ hoμn toμn dữ liệu dùng chung
„ Loại bỏ các hiệu ứng phụ khi sửa đổi các mođun 
ch−ơng trình; nâng cao tính tái sử dụng
„ Ví dụ: Lisp
Bộ mụn Cụng nghệ phần mềm – ĐHCN 11
NguyễnVănVỵ
Lập trình h−ớng đối t−ợng
■ Bao gói & che dấu thông tin
■ thao tác với dữ liệu qua các giao diện xác định
■ kế thừa
Ngôn ngữ h−ớng đối t−ợng: C++, Java, C#
 cục bộ hơn
 dễ tái sử dụng hơn
 thuận tiện cho các ứng dụng lớn
Bộ mụn Cụng nghệ phần mềm – ĐHCN 12
NguyễnVănVỵ
Lập trình logic
„ Tách tri thức về bμi toán khỏi kỹ thuật lập trình
„ Mô tả tri thức
 các qui tắc
 các sự thực
 mục tiêu
„ Hệ thống tự chứng minh
 tìm đ−ờng đi đến mục tiêu
„ Ví dụ:Prolog
Bộ mụn Cụng nghệ phần mềm – ĐHCN 13
NguyễnVănVỵ
Ví dụ. Prolog: 8 hậu
member(X,[X|L]).
member(X,[Y|L]):-member(X,L).
solution([]).
solution([X/Y|Other]):-
solution(Other),
member(Y, [1,2,3,4,5,6,7,8]),
noattack(X/Y, Other).
noattack(_,[]).
noattack(X/Y, [X1/Y1 | Other]):-
Y =\= Y1, Y1-Y =\= X1-X, Y1-Y =\= X-X1,
noattack(X/Y , Other).
Bộ mụn Cụng nghệ phần mềm – ĐHCN 14
NguyễnVănVỵ
Lựa chọn ngôn ngữ
■ Đặc tr−ng của ngôn ngữ
 năng lực (kiểu biến, các cấu trúc)
 tính khả chuyển
 mức độ hỗ trợ của các công cụ
■ Miền ứng dụng của ngôn ngữ
 lập trình hệ thống
 nghiệp vụ, kinh doanh
 khoa học kỹ thuật
 trí tuệ nhân tạo
■ Năng lực, kinh nghiệm của nhóm phát triển
■ Yêu cầu của khách hμng
Bộ mụn Cụng nghệ phần mềm – ĐHCN 15
NguyễnVănVỵ
Năng lực của ngôn ngữ
■ Ngôn ngữ bậc cao:
 có cấu trúc, câu lệnh phong phú
 hỗ trợ nhiều kiểu dữ liệu
 hỗ trợ con trỏ, đệ qui
 hỗ trợ h−ớng đối t−ợng
 th− viện phong phú
nên dùng ngôn ngữ bậc cao (hơn)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 16
NguyễnVănVỵ
Tính khả chuyển
■ Yếu tố quan trọng của ngôn ngữ, cần khi
ƒ thay đổi phần cứng
ƒ thay đổi OS
 Java khả chuyển
 Các ngôn ngữ thông dịch (script) khả chuyển
ƒ sử dụng các tính năng chuẩn của ngôn ngữ
ƒ sử dụng script khi có thể
Bộ mụn Cụng nghệ phần mềm – ĐHCN 17
NguyễnVănVỵ
Có công cụ hiệu quả
■ Trình biên dịch hiệu quả
 biên dịch tốc độ cao
 khả năng tối −u cao
 khai thác các tập lệnh, kiến trúc phần cứng mới
■ Các công cụ trợ giúp hiệu quả
 editor, debugger, linker, make...
 IDE (Integrated Develop Environment)
 môi tr−ờng Unix th−ờng không dùng IDE
Bộ mụn Cụng nghệ phần mềm – ĐHCN 18
NguyễnVănVỵ
Miền ứng dụng vμ ngôn ngữ
■ Phần mềm hệ thống: 
 hiệu quả, vạn năng, dễ mở rộng
 C, C++
■ Hệ thời gian thực: C, C++, Ada, Assembly
■ Phần mềm nhúng: C++, Java
■ Phần mềm khoa học kỹ thuật: 
 tính toán chính xác, th− viện toán học 
mạnh,dễ dμng song song hóa
 Fortran vẫn phổ biến
Bộ mụn Cụng nghệ phần mềm – ĐHCN 19
NguyễnVănVỵ
Miền ứng dụng vμ ngôn ngữ (t)
■ Phần mềm nghiệp vụ:
 CSDL: Oracle, DB2, SQL Server, MySQL...
 ngôn ngữ: FoxPro, COBOL, VB, VC++
■ Trí tuệ nhân tạo:
 Lisp, Prolog, OPS5,...
■ Lập trình Web/CGI:
 Perl, ASP, PHP, Java, Java script, Python...
Bộ mụn Cụng nghệ phần mềm – ĐHCN 20
NguyễnVănVỵ
Phong cách lập trình
H−ớng tới phong cách lμm cho mã nguồn 
 dễ hiểu, dễ sửa đổi
 an toμn (ít lỗi)
■ Bao gồm các yếu tố:
 cách đặt tên hμm vμ biến
 cách xây dựng câu lệnh, cấu trúc ch−ơng trình
 cách viết chú thích
Ng−ời khác có thể hiểu đ−ợc, bảo trì đ−ợc 
Bộ mụn Cụng nghệ phần mềm – ĐHCN 21
NguyễnVănVỵ
Tại sao cần dễ hiểu
Phần mềm luôn cần sửa đổi
 sửa lỗi 
 nâng cấp
kéo dμi tuổi thọ, nâng cao hiệu quả kinh tế
Nếu không dễ hiểu
 bảo trì tốn thời gian, chi phí cao
 tác giả phải bảo trì suốt vòng đời của phần mềm
 bản thân tác giả cũng không hiểu
Bộ mụn Cụng nghệ phần mềm – ĐHCN 22
NguyễnVănVỵ
Chú thích
Mọi điều đ−ợc Chú thích trong ch−ơng trình 
■ Mục đích sử dụng của các biến
■ Chức năng của khối lệnh, câu lệnh
 các lệnh điều khiển
 các lệnh phức tạp
■ Chú thích các mô đun
 mục đích, chức năng của mô đun 
 tham số, giá trị trả lại (giao diện)
 các mô đun thuộc cấp
 cấu trúc, thuật toán
 nhiệm vụ của các biến cục bộ
 tác giả, ng−ời kiểm tra, thời gian
Bộ mụn Cụng nghệ phần mềm – ĐHCN 23
NguyễnVănVỵ
Đặt tên
Đặt tên biến, tên hμm có nghĩa, gợi nhớ
■ Sử dụng các ký hiệu, từ tiếng Anh có nghĩa
■ Lμm cho dễ đọc
 dùng DateOfBirth hoặc date_of_birth
 không viết dateofbirth
■ Tránh đặt tên quá dμi
 không đặt tên dμi với các biến cục bộ
■ Thống nhất cách dùng
 i cho vòng lặp, tmp cho các giá trị tạm thời...
Bộ mụn Cụng nghệ phần mềm – ĐHCN 24
NguyễnVănVỵ
Câu lệnh
■ Các câu lệnh phải mô tả cấu trúc
 tụt lề, dễ đọc, dễ hiểu
■ Lμm đơn giản các lệnh
 mỗi lệnh trên một dòng
 triển khai các biểu thức phức tạp
 hạn chế truyền tham số lμ kết quả của hμm, biểu thức
printf("%s", strcpy(des, src));
■ Tránh các cấu trúc phức tạp:
 các lệnh if lồng nhau
 điều kiện phủ định if not
Bộ mụn Cụng nghệ phần mềm – ĐHCN 25
NguyễnVănVỵ
Hμm vμ biến cục bộ
■ Ch−ơng trình cần đ−ợc chia thμnh nhiều mô đun
(hμm)
■ Không viết hμm quá dμi
 không quá 2 trang mμn hình
 tạo ra các hμm thứ cấp để giảm độ dμi từng hμm
■ Không dùng quá nhiều biến cục bộ
 không thể theo dõi đồng thời hoạt động 
của nhiều biến
(vd. không quá 7 biến cục bộ)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 26
NguyễnVănVỵ
Xử lý lỗi
■ Có thể phát hiện lỗi trong khi thực hiện
 lỗi chia 0
 lỗi input/output,
■ Xử lý lỗi
 nhất quán trong xử lý: phân loại lỗi; thống nhất 
định dạng thông báo,
 phân biệt output vμ thông báo lỗi
 các hμm th− viện nên tránh việc tự xử lý, tự đ−a ra 
thông báo lỗi
Bộ mụn Cụng nghệ phần mềm – ĐHCN 27
NguyễnVănVỵ
Output vμ thông báo (lỗi)
■ Output lμ dữ liệu, còn đ−ợc dùng để lμm input
cho phần mềm khác
■ Thông báo (lỗi) lμ các thông tin nhất thời,
trạng thái hệ thống, lỗi vμ cách khắc phục
■ Cần tách output vμ thông báo lỗi
■ OS th−ờng cung cấp 3 luồng dữ liệu chuẩn
 stdin (cin): input chuẩn (bμn phím)
 stdout (cout): output chuẩn (mμn hình)
 stderr (cerr): luồng thông báo lỗi chuẩn
(không định h−ớng lại đ−ợc)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 28
NguyễnVănVỵ
void main()
{
int count = 0;
char buf[128];
while (NULL != scanf(”%s”, buf)) {
upcase(buf);
printf(“%s”, buf);
count += strlen(buf);
}
fprintf(stderr, ”number of chars: %d\n”, count);
} 
#convert uppercase.txt
number of chars: 678
convert.c
Bộ mụn Cụng nghệ phần mềm – ĐHCN 29
NguyễnVănVỵ
Xử lý lỗi trong hμm th− viện
■ Ng−ời viết vμ ng−ời sử dụng th− viện lμ khác nhau
■ Ng−ời sử dụng th−ờng muốn có cách xử lý riêng
■ Hμm th− viện trả lại trạng thái lỗi, không tự xử lý
 trả trạng thái bằng giá trị trả lại
 trả trạng thái bằng tham số
 trả lại bằng ném ngoại lệ (trong các OOL)
int lookup(int a[], int key, int& err_code){ if (not found) err_code = 0;else err_code =1;}
Bộ mụn Cụng nghệ phần mềm – ĐHCN 30
NguyễnVănVỵ
Ngoại lệ
„ Lμ cách thức xử lý lỗi tiến tiến trong các ngôn ngữ
h−ớng đối t−ợng
 môđun xử lý ném ra một ngoại lệ (đối t−ợng chứa 
thông tin lỗi)
 môđun điều khiển bắt ngoại lệ (nếu có) 
„ Tách phần xử lý lỗi khỏi phần cμi đặt thuật toán 
thông th−ờng, lμm cho ch−ơng trình dễ đọc hơn
„ Dễ dùng hơn, an toμn hơn
Bộ mụn Cụng nghệ phần mềm – ĐHCN 31
NguyễnVănVỵ
Ném ngoại lệ
double MyDivide(double num, double denom) 
{
if (denom == 0.0) {
throw invalid_argument(”The denom cannot be 0.”);
} 
else {
return num / denom;
}
}
Bộ mụn Cụng nghệ phần mềm – ĐHCN 32
NguyễnVănVỵ
Bắt ngoại lệ
try {
result = MyDivide(x, y);
}
catch (invalid_argument& e) {
cerr << e.what() << endl;
... // mã xử lý với ngoại lệ
};
Bộ mụn Cụng nghệ phần mềm – ĐHCN 33
NguyễnVănVỵ
Giao diện của mô đun
■ Thống nhất định dạng
 thứ tự truyền tham số
 strcpy(des, src)
■ Kiểm tra tính hợp lệ của dữ liệu
 chỉ thực hiện xử lý với dữ liệu hợp lệ
■ Lμm đơn giản giao diện (giảm độ ghép nối)
 không truyền thừa tham số
 tìm cách kết hợp các khoản mục liên quan
Bộ mụn Cụng nghệ phần mềm – ĐHCN 34
NguyễnVănVỵ
Phong cách lập trình tốt
■ Tuân theo các chuẩn thông dụng
■ Chuẩn đ−ợc chấp nhận rộng rãi hơn dễ hiểu hơn
■ Chú giải đầy đủ mỗi khi không tuân theo chuẩn
"Ng−ời khác có hiểu đ−ợc không?"
Bộ mụn Cụng nghệ phần mềm – ĐHCN 35
NguyễnVănVỵ
Kỹ thuật lập trình tránh lỗi
Kỹ thuật lập trình tốt dựa trên các yếu tố
„ lập trình có cấu trúc
 dùng các lệnh có cấu trúc
 mođun hóa
 hạn chế dùng các cấu trúc nguy hiểm
„ đóng gói/che dấu thông tin
 xây dựng kiểu dữ liệu trừu t−ợng
 hạn chế thao tác trực tiếp lên thuộc tính
Bộ mụn Cụng nghệ phần mềm – ĐHCN 36
NguyễnVănVỵ
Tránh các cấu trúc nguy hiểm
„ Số thực
 các phép toán đ−ợc lμm tròn, kết quả không 
 chính xác tuyệt đối
 so sánh (=) hai số thực lμ không khả thi
„ Con trỏ
 khái niệm mức thấp 
 có khả năng gây lỗi nghiêm trọng
 dễ nhầm
double r;
int* n = &r;
Bộ mụn Cụng nghệ phần mềm – ĐHCN 37
NguyễnVănVỵ
Tránh các cấu trúc nguy hiểm
„ Cấp phát bộ nhớ động
 quên cấp phát
 quên giải phóng 
 chỉ nên dùng với ngôn ngữ h−ớng đối t−ợng 
(C++)
„ Đệ qui
 khó hiểu
 dễ nhầm điều kiện dừng
Bộ mụn Cụng nghệ phần mềm – ĐHCN 38
NguyễnVănVỵ
Bộ nhớ động với C++
ƒ Tự động hóa cấp phát bộ nhớ
ƒ Tự động hóa giải phóng
class Stack {
private:
int* buf;
int pos;
public:
Stack (int size) { buf = new int[size]; }
int push(int);
int pop();
~Stack() { delete[] buf; }
}
hμm khởi tạo đối t−ợng
hμm hủy đối t−ợng
Bộ mụn Cụng nghệ phần mềm – ĐHCN 39
NguyễnVănVỵ
int use_stack()
{
int m;
Stack s(10);
...
s.push(m);
...
return 0;
}
đối t−ợng s đ−ợc khởi tạo,
hμm khởi tạo đ−ợc gọi tự động
hết phạm vi sử dụng,
đối t−ợng s đ−ợc hủy,
hμm hủy đ−ợc gọi tự động
Bộ nhớ động với C++
Bộ mụn Cụng nghệ phần mềm – ĐHCN 40
NguyễnVănVỵ
Định kiểu dữ liệu
ƒ Nhiều lỗi lập trình do gán dữ liệu sai kiểu
ƒ Các ngôn ngữ bậc cao cung cấp nhiều kiểu dữ liệu vμ
cho phép đặc tả miền dữ liệu
ƒ Tên kiểu có nghĩa lμm cho ch−ơng trình dễ hiểu
typedef enum {Green, Yellow, Red} TLColor;
...
TLColor CurrentColor;
CurrentColor = Red;
CurrentColor = 4;
phát hiện các lỗi sai kiểu khi biên dịch
Bộ mụn Cụng nghệ phần mềm – ĐHCN 41
NguyễnVănVỵ
Lớp/kiểu dữ liệu trừu t−ợng
ƒ Mức cao hơn của định kiểu dữ liệu lμ xây dựng lớp đối t−ợng
ƒ Kiểm tra động về tính đúng đắn của dữ liệu
class PrimeNumber {
private:
int value;
public:
...
int set(int val, int& err_code) {
// verify val
// if val is not a prime number
// set err_code = 1
...
}
};
Bộ mụn Cụng nghệ phần mềm – ĐHCN 42
NguyễnVănVỵ
...
PrimeNumber p;
int n, err_code;
err_code = 1;
while (err_code) {
cout << "input a prime number: ";
cin >> n;
p.set(n, err_code);
}
gán vμ kiểm tra tính hơp lệ tự động
Lớp/kiểu dữ liệu trừu t−ợng
Bộ mụn Cụng nghệ phần mềm – ĐHCN 43
NguyễnVănVỵ
Lập trình phòng thủ (Defensive programming)
ƒ Nhiều lệnh có khả năng sinh lỗi
– lệnh vμo/ra
– các phép toán
– thao tác với bộ nhớ
– truyền tham số sai kiểu
ƒ Dự đoán khả năng xuất hiện lỗi
ƒ Khắc phục lỗi
– l−u trạng thái an toμn
– quay lại trạng thái an toμn gần nhất
Bộ mụn Cụng nghệ phần mềm – ĐHCN 44
NguyễnVănVỵ
ƒ Lệnh vμo ra 
 dữ liệu không hợp lệ
 trμn bộ đệm (kiểu ký tự)
 lỗi thao tác file (sai tên, ch−a đ−ợc mở,)
ƒ Các phép toán
 lỗi chia 0
 trμn số
 so sánh số thực (bằng nhau)
Lập trình phòng thủ (Defensive programming)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 45
NguyễnVănVỵ
ƒ Thao tác bộ nhớ
 quên cấp phát, quên giải phóng bộ nhớ
 thiếu bộ nhớ
 sai địa chỉ, trμn bộ nhớ
Lập trình phòng thủ (Defensive programming)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 46
NguyễnVănVỵ
Lập trình phòng thủ
FILE* fp;
fp = fopen("data", "r");
FILE* fp;
if (NULL == (fp = fopen("data", "r")) {
fprintf(stderr, "can not open file...");
...
}
Bộ mụn Cụng nghệ phần mềm – ĐHCN 47
NguyễnVănVỵ
Lập trình thứ lỗi
Fault tolerance programming
  Không thể loại trừ hoμn toμn lỗi
  Cần có các hệ thống có độ tin cậy đặc biệt
  Dung thứ lỗi: chấp nhận sự xuất hiện lỗi lập trình
  Phát hiện, khắc phục lỗi
  Khởi nguyên từ thứ lỗi phần cứng
  Dựa trên nguyên tắc song song hóa chức năng
Bộ mụn Cụng nghệ phần mềm – ĐHCN 48
NguyễnVănVỵ
Nguyên lý thứ lỗi
ƒ Song song hóa thiết bị
ƒ Dùng thông tin d− thừa để khôi phục dữ liệu
system 1
system 2
system N
...
xác suất có lỗi α <1
xác suất cả hệ thống
ngừng hoạt động
αN
 Error Correction Code  ECC
 parity check, check sum
Bộ mụn Cụng nghệ phần mềm – ĐHCN 49
NguyễnVănVỵ
N - version programming
version 1
version 2
version 3
comparison
ƒ sử dụng nhiều nhóm lập trình
ƒ so sánh kết quả
ƒ cùng thuật toán thì có xu h−ớng mắc cùng lỗi
Bộ mụn Cụng nghệ phần mềm – ĐHCN 50
NguyễnVănVỵ
Khối phục hồi (Recovery block)
Thuật toán 1
ƒ sử dụng các thuật toán khác nhau
ƒ kiểm tra tính hợp lệ của kết quả
Kiểm thử chấp nhận
Thuật toán 2 Thuật toán 3
quick sort
bubble sort simple sort
Bộ mụn Cụng nghệ phần mềm – ĐHCN 51
NguyễnVănVỵ
Thứ lỗi dữ liệu (Data fault tolerance)
ƒ Phục hồi lùi
 kiểm tra tính hợp lệ của dữ liệu mỗi khi biến đổi
 chỉ chấp nhận các dữ liệu hợp lệ
ƒ Phục hồi tiến
 dùng dữ liệu d− thừa
 kiểm tra vμ khôi phục dữ liệu
Bộ mụn Cụng nghệ phần mềm – ĐHCN 52
NguyễnVănVỵ
H−ớng hiệu quả thực hiện
ƒ Phần mềm ngμy cμng phức tạp, đa dạng
 mô phỏng
 ứng dụng thời gian thực
 phần mềm nhúng
 trò chơi
ƒ Hiệu quả thực hiện luôn cần đ−ợc xem xét
 thuật toán hiệu quả
 kỹ thuật lập trình hiệu quả
 ngôn ngữ lập trình hiệu quả
Bộ mụn Cụng nghệ phần mềm – ĐHCN 53
NguyễnVănVỵ
Cải thiện tốc độ
ƒ Tối −u hóa chu trình
 đ−a phép toán bất biến ra ngoμi chu trình
 tính sẵn giá trị đ−ợc sử dụng nhiều lần
ƒ Hạn chế gọi hμm nhỏ với tần số cao
 phí tổn cho gọi hμm nhỏ
 dùng hμm inline, dùng macro
ƒ Hạn chế truyền tham số trị lμ cấu trúc phức tạp
 tham số đ−ợc copy lên stack
 truyền tham số biến (tham chiếu)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 54
NguyễnVănVỵ
Phí tổn cho gọi hμm/thủ tục
ƒ Copy tham số lên stack
ƒ Copy giá trị trả lại từ stack
ƒ Chuyển điều khiển ch−ơng trình
 mất tính liên tục của dòng lệnh
 mất tính cục bộ của cache
Bộ mụn Cụng nghệ phần mềm – ĐHCN 55
NguyễnVănVỵ
Macro vμ hμm inline
#define CUBE(x) (x*x*x)
CUBE(n+1)
inline int cube(int x) { return x*x*x;}
 không có kiểu
 không an toμn
Bộ mụn Cụng nghệ phần mềm – ĐHCN 56
NguyễnVănVỵ
Truyền tham số
ƒ Tham số trị
 copy giá trị (bộ nhớ) của tham số lên stack
 không hiệu quả với biến kiểu cấu trúc lớn
 không an toμn với các cấu trúc phức tạp
ƒ Tham số biến/tham chiếu
 copy địa chỉ của tham số lên stack
 địa chỉ có độ lớn cố định (4 bytes)
 nội dung có thể bị thay đổi (dùng từ khóa 
const)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 57
NguyễnVănVỵ
Cải thiện tốc độ (tiếp)
ƒ Tránh dùng mảng nhiều chiều
ƒ Tránh dùng biến con trỏ
ƒ Dùng các kiểu dữ liệu đơn giản
double --> float
ƒ Rút gọn các biểu thức
ƒ Dùng các phép toán nhanh
++i;
n<<2;
Bộ mụn Cụng nghệ phần mềm – ĐHCN 58
NguyễnVănVỵ
Cải thiện tốc độ (tránh lệnh rẽ nhánh)
ƒ Tránh gọi hμm (ch−ơng trình con)
ƒ Tránh vòng lặp
ƒ Tránh điều kiện (if)
tận dụng hiệu quả pipeline
Bộ mụn Cụng nghệ phần mềm – ĐHCN 59
NguyễnVănVỵ
Pipeline
F D R E W
F D R E W
F D R E W
F D R E W
F D R E W
lệnh i
lệnh i+1
time
lệnh i+2
lệnh i+3
lệnh i+4
Bộ mụn Cụng nghệ phần mềm – ĐHCN 60
NguyễnVănVỵ
Hiệu quả vμo/ra
  Tối thiểu các yêu cầu input/output
 tốc độ thiết bị ngoại vi chậm 
 loại bỏ các inp/out không cần thiết
for (i=0; i<10000000; i++) {
...
printf("i = %d\n", i);
}
  Input/Output theo khối
 tối thiểu số lần gọi th− viện input/output
 tận dụng hiệu quả bộ đệm input/output
Bộ mụn Cụng nghệ phần mềm – ĐHCN 61
NguyễnVănVỵ
Person a[N];
...
for (i=0; i<N; i++) {
fread(&a[i], sizeof(Person), 1, fp);
...
}
fread(a, sizeof(Person), N, fp);
for (i=0; i<N; i++) {
...
}
Bộ mụn Cụng nghệ phần mềm – ĐHCN 62
NguyễnVănVỵ
Phong cách lập trình với C/C++
ƒ Phần mềm đ−ợc cấu thμnh bởi nhiều tệp, các 
tệp th−ờng đ−ợc biên dịch riêng rẽ
 .c: khai báo dữ liệu, hμm
 .h: định nghĩa các kiểu dữ liệu dùng chung
ƒ Không khai báo dữ liệu, định nghĩa hμm trong 
các tệp header (.h)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 63
NguyễnVănVỵ
Các b−ớc xây dựng phần mềm trên C/C++
ƒ Soạn thảo (edit)
ƒ Tiền biên dịch (pre-compile)
ƒ Biên dịch (compile)
ƒ Kết nối (link)
ƒ Thực hiện (execute)
Bộ mụn Cụng nghệ phần mềm – ĐHCN 64
NguyễnVănVỵ
date.h
typedef struct {
int year, mon, day;
} Date;
Date my_birthday;
void print_date(Date d)
{
printf(”year: %d, mon: %d, day: %d”,
d.year, d.mon, d.day);
}
Bộ mụn Cụng nghệ phần mềm – ĐHCN 65
NguyễnVănVỵdate.h
typedef struct {
int year, mon, day;
} Date;
void print_date(Date);
#include ”date.h”
void print_date(Date d)
{
printf(”year: %d, mon: %d, day: %d”,
d.year, d.mon, d.day);
}
date.c
date.h
Bộ mụn Cụng nghệ phần mềm – ĐHCN 66
NguyễnVănVỵ
.c
.o
.c
.o
...
.exe
compile
link
source
object
include
header.h
date.h
Bộ mụn Cụng nghệ phần mềm – ĐHCN 67
NguyễnVănVỵ
calender.c
calender.o
date.h
tools.c
tools.o
print_date()
print_date() print_date()
link error
date.h
Bộ mụn Cụng nghệ phần mềm – ĐHCN 68
NguyễnVănVỵ
calender.
c
calender.o
date.h
tools.c
tools.o
calender.exe
date.c
date.o
print_date()
print_date()
print_date()
date.h
Bộ mụn Cụng nghệ phần mềm – ĐHCN 69
NguyễnVănVỵ
Pre-compile
ƒ Chỉ thị ch−ơng trình dịch (tiền biên dịch)
ƒ Tạo ra các macro
ƒ Tạo ra các phiên bản phần mềm khác nhau
ƒ Quản lí các tệp header
#include
#define
#ifdef
#ifndef
#endif
Bộ mụn Cụng nghệ phần mềm – ĐHCN 70
NguyễnVănVỵ
#define Cube(x) (x*x*x)
...
void main()
{
...
m = Cube(n);
...
}
Pre-compile
Bộ mụn Cụng nghệ phần mềm – ĐHCN 71
NguyễnVănVỵ
Pre-compile
#define DEBUG
... 
int foo()
{
#ifdef DEBUG
fprintf(stderr, "foo() called");
#endif
...
}
Tạo các phiên bản phần mềm khác nhau
Bộ mụn Cụng nghệ phần mềm – ĐHCN 72
NguyễnVănVỵ
Header & Precompile
Date.h
Calender.h Schedule.h
JobManager.c
include
include
Bộ mụn Cụng nghệ phần mềm – ĐHCN 73
NguyễnVănVỵ
date.h
#ifndef DATE_H
#define DATE_H
typedef struct {
int year, mon, day;
} Date;
void print_date(Date);
#endif
Header & Precompile
Bộ mụn Cụng nghệ phần mềm – ĐHCN 74
NguyễnVănVỵ
#ifndef CALENDER_H
#define CALENDER_H
#include ”date.h”
...
#endif
calender.h
#ifndef SCHEDULE_H
#define SCHEDULE_H
#include ”date.h”
...
#endif
schedule.h
Header & Precompile
Bộ mụn Cụng nghệ phần mềm – ĐHCN 75
NguyễnVănVỵ
#include ”calender.h”
#include ”schedule.h”
...
void main()
{
...
}
JobManager.c
Header & Precompile
Bộ mụn Cụng nghệ phần mềm – ĐHCN 76
NguyễnVănVỵ
Câu hỏi ôn tập
1. Kỹ thật lập trình tốt thể hiện ở chỗ nμo? Hệ quả của nó?
2. Nêu các kỹ thuật lập trình đã có? đặc tr−ng của mỗi loại 
lμ gì?
3. Tiêu chuẩn lựa chọn ngôn ngữ lập trình?
4. Thế nμo lμ ngôn ngữ khả chuyển? Cho ví dụ?
5. Nêu các miền ứng ứng dụng vμ ngôn ngữ thích hợp với 
nó?
6. Các yêu tố tạo ra phong cách lập trình lμ gi? Nó h−ớng tới 
phần mềm có đặc tr−ng gì?
Bộ mụn Cụng nghệ phần mềm – ĐHCN 77
NguyễnVănVỵ
Câu hỏi ôn tập
7. GiảI thích cách lμm: chú thích?, đặt tên?, viết câu lệnh?, 
đặt hμm vμ biến cục bộ?, xử lý lỗi vμ thông báo? Xử lý lỗi 
trong th− viện? Xử lý ngoại lệ?
8. Tiêu chuẩn cho phong cách lập trình tôt? 
Bộ mụn Cụng nghệ phần mềm – ĐHCN 78
NguyễnVănVỵ
Câu hỏi và thảo luận

File đính kèm:

  • pdfbai_giang_ky_nghe_phan_mem_bai_8_lap_trinh_nguyen_van_vy.pdf