Bài giảng Kỹ nghệ phần mềm - Nguyễn Văn Vỵ - Bài 8: Lập trình
?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ả
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:
Bài giảng Kỹ nghệ phần mềm - Nguyễn Văn Vỵ - Bài 8 Lập trình.pdf

