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ả

pdf78 trang | Chuyên mục: Công Nghệ Phần Mềm | Chia sẻ: dkS00TYs | Lượt xem: 1604 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Kỹ nghệ phần mềm - Nguyễn Văn Vỵ - Bài 8: Lập trình, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

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