Kỹnghệphần mềm Software Engeneering

NguyÔn V¨n Vþ

Bém«n C«ng nghÖphÇn mÒm-Khoa CNTT-§HCN Email: vynv@coltech.vnu.vn

Bài 8: Lập trình

NguyễnVănVỵ

Nội dung

(cid:132) Ng«n ng÷ lËp tr×nh

(cid:132) Phong c¸ch lËp tr×nh

(cid:132) LËp tr×nh tr¸nh lçi

(cid:132) LËp tr×nh h−íng hiÖu qu¶

Bộ môn Công nghệ phần mềm – ĐHCN 2

TÀI LiỆU THAM KHẢO

NguyễnVănVỵ

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

5.

Approach. Fifth Edition, McGraw Hill, 2001. 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 3

Kh¸i niÖm lËp tr×nh hiÖu qu¶

NguyễnVănVỵ

(cid:132) S¶n phÈm phÇn mÒm tèt khi

(cid:144) ph©n tÝch tèt (cid:144) thiÕt kÕ tèt (cid:144) lËp tr×nh tèt (cid:144) kiÓm thö chÆt chÏ

(cid:132) kü thuËt lËp tr×nh tèt

(cid:144) chuyªn nghiÖp (tu©n theo c¸c chuÈn) (cid:144) æn ®Þnh (cid:144) hiÖu qu¶

Bộ môn Công nghệ phần mềm – ĐHCN 4

Kh¸i niÖm lËp tr×nh hiÖu qu¶

NguyễnVănVỵ

LËp tr×nh hiÖu qu¶ h¬n, s¶n phÈm rÎ tiÒn h¬n

(cid:132) Tèc ®é ph¸t triÓn cao h¬n (cid:144) n¨ng lùc biÓu diÔn cao h¬n (cid:144) kh¶ n¨ng sö dông l¹i cao h¬n

(cid:132) DÔ b¶o tr× h¬n

(cid:144) dÔ hiÓu, dÔ söa ®æi, thÝch nghi

(cid:132) ChÊt l−îng cao h¬n

(cid:144) sö dông c¸c cÊu tróc an toμn h¬n

ch−¬ng tr×nh cÇn dÔ hiÓu

Bộ môn Công nghệ phần mềm – ĐHCN 5

Tèc ®é viÕt m· nguån

NguyễnVănVỵ

(cid:132) Tèc ®é ph¸t triÓn cao ≠ lμm ng¾n ch−¬ng tr×nh nguån

(cid:144) Tèc ®é kh«ng tû lÖ thuËn víi sè dßng lÖnh (cid:144) C©u lÖnh phøc t¹p lμm gi¶m ®é dÔ hiÓu

(cid:132) Ng«n ng÷ møc cao (4GL) (cid:144) n¨ng lùc biÓu diÔn cao (cid:144) tèc ®é ph¸t triÓn nhanh

Bộ môn Công nghệ phần mềm – ĐHCN 6

TiÕn hãa cña kü thuËt lËp tr×nh

NguyễnVănVỵ

(cid:132) LËp tr×nh tuÇn tù (tuyÕn tÝnh)

(cid:132) LËp tr×nh cã cÊu tróc (thñ tôc)

(cid:132) LËp tr×nh h−íng chøc n¨ng

(cid:132) LËp tr×nh h−íng ®èi t−îng

(cid:132) Kü thuËt thÕ hÖ thø 4

Bộ môn Công nghệ phần mềm – ĐHCN 7

LËp tr×nh tuÇn tù

NguyễnVănVỵ

■ 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é

(cid:144) ®é ghÐp nèi cao (cid:144) 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 8

LËp tr×nh cã cÊu tróc

NguyễnVănVỵ

■ 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,(cid:31)

Bộ môn Công nghệ phần mềm – ĐHCN 9

LËp tr×nh h−íng chøc n¨ng

NguyễnVănVỵ

(cid:132) Dùa trªn nguyªn t¾c ghÐp nèi d÷ liÖu

(cid:144) trao ®æi d÷ liÖu b»ng tham sè vμ gi¸ trÞ tr¶ l¹i (cid:144) lo¹i bá hoμn toμn d÷ liÖu dïng chung

(cid:132) 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

(cid:132) VÝ dô: Lisp

Bộ môn Công nghệ phần mềm – ĐHCN 10

LËp tr×nh h−íng ®èi t−îng

NguyễnVănVỵ

■ 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

(cid:144) côc bé h¬n (cid:144) dÔ t¸i sö dông h¬n (cid:144) thuËn tiÖn cho c¸c øng dông lín

Ng«n ng÷ h−íng ®èi t−îng: C++, Java, C#

Bộ môn Công nghệ phần mềm – ĐHCN 11

LËp tr×nh logic

NguyễnVănVỵ

(cid:132) T¸ch tri thøc vÒ bμi to¸n khái kü thuËt lËp tr×nh (cid:132) M« t¶ tri thøc

(cid:144) c¸c qui t¾c (cid:144) c¸c sù thùc (cid:144) môc tiªu

(cid:132) HÖ thèng tù chøng minh

(cid:144) t×m ®−êng ®i ®Õn môc tiªu

(cid:132) VÝ dô:Prolog

Bộ môn Công nghệ phần mềm – ĐHCN 12

VÝ dụ. Prolog: 8 hËu

NguyễnVănVỵ

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 13

Lùa chän ng«n ng÷

NguyễnVănVỵ

■ §Æc tr−ng cña ng«n ng÷

(cid:144) n¨ng lùc (kiÓu biÕn, c¸c cÊu tróc) (cid:144) tÝnh kh¶ chuyÓn (cid:144) møc ®é hç trî cña c¸c c«ng cô ■ MiÒn øng dông cña ng«n ng÷

(cid:144) lËp tr×nh hÖ thèng (cid:144) nghiÖp vô, kinh doanh (cid:144) khoa häc kü thuËt (cid:144) 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 14

N¨ng lùc cña ng«n ng÷

NguyễnVănVỵ

■ Ng«n ng÷ bËc cao:

(cid:144) cã cÊu tróc, c©u lÖnh phong phó (cid:144) hç trî nhiÒu kiÓu d÷ liÖu (cid:144) hç trî con trá, ®Ö qui (cid:144) hç trî h−íng ®èi t−îng (cid:144) 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 15

TÝnh kh¶ chuyÓn

NguyễnVănVỵ

■ YÕu tè quan träng cña ng«n ng÷, cÇn khi

(cid:131) thay ®æi phÇn cøng (cid:131) thay ®æi OS

(cid:144) Java kh¶ chuyÓn (cid:144) C¸c ng«n ng÷ th«ng dÞch (script) kh¶ chuyÓn

(cid:131) sö dông c¸c tÝnh n¨ng chuÈn cña ng«n ng÷ (cid:131) sö dông script khi cã thÓ

Bộ môn Công nghệ phần mềm – ĐHCN 16

Cã c«ng cô hiÖu qu¶

NguyễnVănVỵ

■ Tr×nh biªn dÞch hiÖu qu¶ (cid:144) biªn dÞch tèc ®é cao (cid:144) kh¶ n¨ng tèi −u cao (cid:144) 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¶

(cid:144) editor, debugger, linker, make... (cid:144) IDE (Integrated Develop Environment) (cid:144) m«i tr−êng Unix th−êng kh«ng dïng IDE

Bộ môn Công nghệ phần mềm – ĐHCN 17

MiÒn øng dông vμ ng«n ng÷

NguyễnVănVỵ

■ PhÇn mÒm hÖ thèng:

(cid:144) hiÖu qu¶, v¹n n¨ng, dÔ më réng (cid:144) 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:

(cid:144) tÝnh to¸n chÝnh x¸c, th− viÖn to¸n häc

m¹nh,dÔ dμng song song hãa

(cid:144) Fortran vÉn phæ biÕn

Bộ môn Công nghệ phần mềm – ĐHCN 18

MiÒn øng dông vμ ng«n ng÷ (t)

NguyễnVănVỵ

■ PhÇn mÒm nghiÖp vô:

(cid:144) CSDL: Oracle, DB2, SQL Server, MySQL... (cid:144) ng«n ng÷: FoxPro, COBOL, VB, VC++

■ TrÝ tuÖ nh©n t¹o:

(cid:144) Lisp, Prolog, OPS5,...

■ LËp tr×nh Web/CGI:

(cid:144) Perl, ASP, PHP, Java, Java script, Python...

Bộ môn Công nghệ phần mềm – ĐHCN 19

Phong c¸ch lËp tr×nh

NguyễnVănVỵ

■ Bao gåm c¸c yÕu tè:

(cid:144) c¸ch ®Æt tªn hμm vμ biÕn (cid:144) c¸ch x©y dùng c©u lÖnh, cÊu tróc ch−¬ng tr×nh (cid:144) c¸ch viÕt chó thÝch

H−íng tíi phong c¸ch lμm cho m· nguån

(cid:144) dÔ hiÓu, dÔ söa ®æi (cid:144) an toμn (Ýt lçi)

Ng−êi kh¸c cã thÓ hiÓu ®−îc, b¶o tr× ®−îc

Bộ môn Công nghệ phần mềm – ĐHCN 20

T¹i sao cÇn dÔ hiÓu

NguyễnVănVỵ

PhÇn mÒm lu«n cÇn söa ®æi

(cid:144) söa lçi (cid:144) 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

(cid:144) b¶o tr× tèn thêi gian, chi phÝ cao (cid:144) t¸c gi¶ ph¶i b¶o tr× suèt vßng ®êi cña phÇn mÒm (cid:144) b¶n th©n t¸c gi¶ còng kh«ng hiÓu

Bộ môn Công nghệ phần mềm – ĐHCN 21

Chó thÝch

NguyễnVănVỵ

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

(cid:144) c¸c lÖnh ®iÒu khiÓn (cid:144) c¸c lÖnh phøc t¹p ■ Chó thÝch c¸c m« ®un

(cid:144) môc ®Ých, chøc n¨ng cña m« ®un (cid:144) tham sè, gi¸ trÞ tr¶ l¹i (giao diÖn) (cid:144) c¸c m« ®un thuéc cÊp (cid:144) cÊu tróc, thuËt to¸n (cid:144) nhiÖm vô cña c¸c biÕn côc bé (cid:144) t¸c gi¶, ng−êi kiÓm tra, thêi gian

Bộ môn Công nghệ phần mềm – ĐHCN 22

§Æt tªn

NguyễnVănVỵ

§Æ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

(cid:144) dïng DateOfBirth hoÆc date_of_birth (cid:144) kh«ng viÕt dateofbirth

■ Tr¸nh ®Æt tªn qu¸ dμi

(cid:144) kh«ng ®Æt tªn dμi víi c¸c biÕn côc bé

■ Thèng nhÊt c¸ch dïng

(cid:144) 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 23

C©u lÖnh

NguyễnVănVỵ

■ C¸c c©u lÖnh ph¶i m« t¶ cÊu tróc

(cid:144) tôt lÒ, dÔ ®äc, dÔ hiÓu ■ Lμm ®¬n gi¶n c¸c lÖnh

(cid:144) mçi lÖnh trªn mét dßng (cid:144) triÓn khai c¸c biÓu thøc phøc t¹p (cid:144) 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:

(cid:144) c¸c lÖnh if lång nhau (cid:144) ®iÒu kiÖn phñ ®Þnh if not

Bộ môn Công nghệ phần mềm – ĐHCN 24

Hμm vμ biÕn côc bé

NguyễnVănVỵ

■ 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

(cid:144) kh«ng qu¸ 2 trang mμn h×nh (cid:144) 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é

(cid:144) 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 25

Xö lý lçi

NguyễnVănVỵ

■ Cã thÓ ph¸t hiÖn lçi trong khi thùc hiÖn

(cid:144) lçi chia 0 (cid:144) lçi input/output,

■ Xö lý lçi

(cid:144) nhÊt qu¸n trong xö lý: ph©n lo¹i lçi; thèng nhÊt

®Þnh d¹ng th«ng b¸o,

(cid:144) ph©n biÖt output vμ th«ng b¸o lçi

(cid:144) 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 26

Output vμ th«ng b¸o (lçi)

NguyễnVănVỵ

■ 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

(cid:144) stdin (cin): input chuÈn (bμn phÝm) (cid:144) stdout (cout): output chuÈn (mμn h×nh) (cid:144) 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 27

convert.c

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 < normal.txt > uppercase.txt

number of chars: 678

Bộ môn Công nghệ phần mềm – ĐHCN 28

Xö lý lçi trong hμm th− viÖn

NguyễnVănVỵ

■ 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ý

(cid:144) tr¶ tr¹ng th¸i b»ng gi¸ trÞ tr¶ l¹i (cid:144) tr¶ tr¹ng th¸i b»ng tham sè (cid:144) 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 29

Ngo¹i lÖ

NguyễnVănVỵ

(cid:132) Lμ c¸ch thøc xö lý lçi tiÕn tiÕn trong c¸c ng«n ng÷

h−íng ®èi t−îng (cid:144) m«®un xö lý nÐm ra mét ngo¹i lÖ (®èi t−îng chøa

th«ng tin lçi)

(cid:144) m«®un ®iÒu khiÓn b¾t ngo¹i lÖ (nÕu cã) (cid:132) 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

(cid:132) DÔ dïng h¬n, an toμn h¬n

Bộ môn Công nghệ phần mềm – ĐHCN 30

NÐm ngo¹i lÖ

NguyễnVănVỵ

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 31

B¾t ngo¹i lÖ

NguyễnVănVỵ

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 32

Giao diÖn cña m« ®un

NguyễnVănVỵ

■ Thèng nhÊt ®Þnh d¹ng

(cid:144) thø tù truyÒn tham sè (cid:144) strcpy(des, src)

■ KiÓm tra tÝnh hîp lÖ cña d÷ liÖu

(cid:144) 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)

(cid:144) kh«ng truyÒn thõa tham sè (cid:144) 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 33

Phong c¸ch lËp tr×nh tèt

NguyễnVănVỵ

■ 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 34

Kü thuËt lËp tr×nh tr¸nh lçi

NguyễnVănVỵ

Kü thuËt lËp tr×nh tèt dùa trªn c¸c yÕu tè

(cid:132) lËp tr×nh cã cÊu tróc

(cid:144) dïng c¸c lÖnh cã cÊu tróc (cid:144) mo®un hãa (cid:144) h¹n chÕ dïng c¸c cÊu tróc nguy hiÓm

(cid:132) ®ãng gãi/che dÊu th«ng tin

(cid:144) x©y dùng kiÓu d÷ liÖu trõu t−îng (cid:144) 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 35

Tr¸nh c¸c cÊu tróc nguy hiÓm

NguyễnVănVỵ

(cid:132) Sè thùc

(cid:144) c¸c phÐp to¸n ®−îc lμm trßn, kÕt qu¶ kh«ng (cid:144) chÝnh x¸c tuyÖt ®èi (cid:144) so s¸nh (=) hai sè thùc lμ kh«ng kh¶ thi

(cid:132) Con trá

(cid:144) kh¸i niÖm møc thÊp (cid:144) cã kh¶ n¨ng g©y lçi nghiªm träng (cid:144) dÔ nhÇm

double r; int* n = &r;

Bộ môn Công nghệ phần mềm – ĐHCN 36

Tr¸nh c¸c cÊu tróc nguy hiÓm

NguyễnVănVỵ

(cid:132) CÊp ph¸t bé nhí ®éng (cid:144) quªn cÊp ph¸t (cid:144) quªn gi¶i phãng (cid:144) chØ nªn dïng víi ng«n ng÷ h−íng ®èi t−îng

(C++)

(cid:132) §Ö qui

(cid:144) khã hiÓu (cid:144) dÔ nhÇm ®iÒu kiÖn dõng

Bộ môn Công nghệ phần mềm – ĐHCN 37

Bé nhí ®éng víi C++

NguyễnVănVỵ

(cid:131) Tù ®éng hãa cÊp ph¸t bé nhí (cid:131) Tù ®éng hãa gi¶i phãng

class Stack { private:

hμm khëi t¹o ®èi t−îng

int* buf; int pos;

public:

Stack (int size) { buf = new int[size]; } int push(int); int pop(); ~Stack() { delete[] buf; }

}

hμm hñy ®èi t−îng

Bộ môn Công nghệ phần mềm – ĐHCN 38

Bé nhí ®éng víi C++

NguyễnVănVỵ

®èi t−îng s ®−îc khëi t¹o, hμm khëi t¹o ®−îc gäi tù ®éng

int use_stack() {

int m; Stack s(10); ... s.push(m); ... return 0;

}

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ộ môn Công nghệ phần mềm – ĐHCN 39

§Þnh kiÓu d÷ liÖu

NguyễnVănVỵ

(cid:131) NhiÒu lçi lËp tr×nh do g¸n d÷ liÖu sai kiÓu (cid:131) 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

(cid:131) 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 40

Líp/kiÓu d÷ liÖu trõu t−îng

NguyễnVănVỵ

(cid:131) Møc cao h¬n cña ®Þnh kiÓu d÷ liÖu lμ x©y dùng líp ®èi t−îng (cid:131) 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

41

Líp/kiÓu d÷ liÖu trõu t−îng

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

Bộ môn Công nghệ phần mềm – ĐHCN 42

LËp tr×nh phßng thñ (Defensive programming)

NguyễnVănVỵ

(cid:131) 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

(cid:131) Dù ®o¸n kh¶ n¨ng xuÊt hiÖn lçi (cid:131) 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 43

LËp tr×nh phßng thñ (Defensive programming)

NguyễnVănVỵ

(cid:131) LÖnh vμo ra

(cid:144) d÷ liÖu kh«ng hîp lÖ (cid:144) trμn bé ®Öm (kiÓu ký tù) (cid:144) lçi thao t¸c file (sai tªn, ch−a ®−îc më,(cid:31))

(cid:131) C¸c phÐp to¸n (cid:144) lçi chia 0 (cid:144) trμn sè (cid:144) so s¸nh sè thùc (b»ng nhau)

Bộ môn Công nghệ phần mềm – ĐHCN 44

LËp tr×nh phßng thñ (Defensive programming)

NguyễnVănVỵ

(cid:131) Thao t¸c bé nhí

(cid:144) quªn cÊp ph¸t, quªn gi¶i phãng bé nhí (cid:144) thiÕu bé nhí (cid:144) sai ®Þa chØ, trμn bé nhí

Bộ môn Công nghệ phần mềm – ĐHCN 45

LËp tr×nh phßng thñ

NguyễnVănVỵ

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 46

LËp tr×nh thø lçi Fault tolerance programming

NguyễnVănVỵ

(cid:160) Kh«ng thÓ lo¹i trõ hoμn toμn lçi

(cid:160) CÇn cã c¸c hÖ thèng cã ®é tin cËy ®Æc biÖt

(cid:160) Dung thø lçi: chÊp nhËn sù xuÊt hiÖn lçi lËp tr×nh

(cid:160) Ph¸t hiÖn, kh¾c phôc lçi

(cid:160) Khëi nguyªn tõ thø lçi phÇn cøng

(cid:160) 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 47

Nguyªn lý thø lçi

NguyễnVănVỵ

(cid:131) Song song hãa thiÕt bÞ

x¸c suÊt cã lçi α <1

system 1

system 2 ... system N

x¸c suÊt c¶ hÖ thèng ngõng ho¹t ®éng αN

(cid:131) Dïng th«ng tin d− thõa ®Ó kh«i phôc d÷ liÖu

(cid:144) Error Correction Code (cid:31) ECC (cid:144) parity check, check sum

Bộ môn Công nghệ phần mềm – ĐHCN 48

N - version programming

NguyễnVănVỵ

(cid:131) sö dông nhiÒu nhãm lËp tr×nh (cid:131) so s¸nh kÕt qu¶ (cid:131) cïng thuËt to¸n th× cã xu h−íng m¾c cïng lçi

version 1

version 2

comparison

version 3

Bộ môn Công nghệ phần mềm – ĐHCN 49

Khối phục hồi (Recovery block)

NguyễnVănVỵ

(cid:131) sö dông c¸c thuËt to¸n kh¸c nhau (cid:131) kiÓm tra tÝnh hîp lÖ cña kÕt qu¶

KiÓm thö chÊp nhËn

ThuËt to¸n 1

quick sort

ThuËt to¸n 2

ThuËt to¸n 3

simple sort

bubble sort

Bộ môn Công nghệ phần mềm – ĐHCN 50

Thø lçi d÷ liÖu (Data fault tolerance)

NguyễnVănVỵ

(cid:131) Phôc håi lïi

(cid:144) kiÓm tra tÝnh hîp lÖ cña d÷ liÖu mçi khi biÕn ®æi (cid:144) chØ chÊp nhËn c¸c d÷ liÖu hîp lÖ

(cid:131) Phôc håi tiÕn

(cid:144) dïng d÷ liÖu d− thõa (cid:144) kiÓm tra vμ kh«i phôc d÷ liÖu

Bộ môn Công nghệ phần mềm – ĐHCN 51

H−íng hiÖu qu¶ thùc hiÖn

NguyễnVănVỵ

(cid:131) PhÇn mÒm ngμy cμng phøc t¹p, ®a d¹ng

(cid:144) m« pháng (cid:144) øng dông thêi gian thùc (cid:144) phÇn mÒm nhóng (cid:144) trß ch¬i

(cid:131) HiÖu qu¶ thùc hiÖn lu«n cÇn ®−îc xem xÐt

(cid:144) thuËt to¸n hiÖu qu¶ (cid:144) kü thuËt lËp tr×nh hiÖu qu¶ (cid:144) ng«n ng÷ lËp tr×nh hiÖu qu¶

Bộ môn Công nghệ phần mềm – ĐHCN 52

C¶i thiÖn tèc ®é

NguyễnVănVỵ

(cid:131) Tèi −u hãa chu tr×nh

(cid:144) ®−a phÐp to¸n bÊt biÕn ra ngoμi chu tr×nh (cid:144) tÝnh s½n gi¸ trÞ ®−îc sö dông nhiÒu lÇn

(cid:131) H¹n chÕ gäi hμm nhá víi tÇn sè cao

(cid:144) phÝ tæn cho gäi hμm nhá (cid:144) dïng hμm inline, dïng macro

(cid:131) H¹n chÕ truyÒn tham sè trÞ lμ cÊu tróc phøc t¹p

(cid:144) tham sè ®−îc copy lªn stack (cid:144) truyÒn tham sè biÕn (tham chiÕu)

Bộ môn Công nghệ phần mềm – ĐHCN 53

PhÝ tæn cho gäi hμm/thñ tôc

NguyễnVănVỵ

(cid:131) Copy tham sè lªn stack (cid:131) Copy gi¸ trÞ tr¶ l¹i tõ stack (cid:131) ChuyÓn ®iÒu khiÓn ch−¬ng tr×nh

(cid:144) mÊt tÝnh liªn tôc cña dßng lÖnh (cid:144) mÊt tÝnh côc bé cña cache

Bộ môn Công nghệ phần mềm – ĐHCN 54

Macro vμ hμm inline

NguyễnVănVỵ

(cid:144) kh«ng cã kiÓu (cid:144) kh«ng an toμn

#define CUBE(x) (x*x*x)

CUBE(n+1)

inline int cube(int x) {

return x*x*x;

}

Bộ môn Công nghệ phần mềm – ĐHCN 55

TruyÒn tham sè

NguyễnVănVỵ

(cid:131) Tham sè trÞ

(cid:144) copy gi¸ trÞ (bé nhí) cña tham sè lªn stack (cid:144) kh«ng hiÖu qu¶ víi biÕn kiÓu cÊu tróc lín (cid:144) kh«ng an toμn víi c¸c cÊu tróc phøc t¹p

(cid:131) Tham sè biÕn/tham chiÕu

(cid:144) copy ®Þa chØ cña tham sè lªn stack (cid:144) ®Þa chØ cã ®é lín cè ®Þnh (4 bytes) (cid:144) 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 56

C¶i thiÖn tèc ®é (tiÕp)

NguyễnVănVỵ

(cid:131) Tr¸nh dïng m¶ng nhiÒu chiÒu (cid:131) Tr¸nh dïng biÕn con trá (cid:131) Dïng c¸c kiÓu d÷ liÖu ®¬n gi¶n double --> float

(cid:131) Rót gän c¸c biÓu thøc (cid:131) Dïng c¸c phÐp to¸n nhanh

++i; n<<2;

Bộ môn Công nghệ phần mềm – ĐHCN 57

C¶i thiÖn tèc ®é (tr¸nh lÖnh rÏ nh¸nh)

NguyễnVănVỵ

(cid:131) Tr¸nh gäi hμm (ch−¬ng tr×nh con) (cid:131) Tr¸nh vßng lÆp (cid:131) 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 58

Pipeline

NguyễnVănVỵ

F

E W

D

R

lÖnh i

F

D

E W

R

lÖnh i+1

F

E W

D

R

lÖnh i+2

F

D

R

E W

lÖnh i+3

F

D

R

E W

lÖnh i+4

time

Bộ môn Công nghệ phần mềm – ĐHCN 59

HiÖu qu¶ vμo/ra

NguyễnVănVỵ

(cid:160) Tèi thiÓu c¸c yªu cÇu input/output

(cid:144) tèc ®é thiÕt bÞ ngo¹i vi chËm (cid:144) lo¹i bá c¸c inp/out kh«ng cÇn thiÕt

for (i=0; i<10000000; i++) {

... printf("i = %d\n", i);

}

(cid:160) Input/Output theo khèi

(cid:144) tèi thiÓu sè lÇn gäi th− viÖn input/output (cid:144) tËn dông hiÖu qu¶ bé ®Öm input/output

Bộ môn Công nghệ phần mềm – ĐHCN 60

NguyễnVănVỵ

Person a[N]; ... for (i=0; i

fread(&a[i], sizeof(Person), 1, fp); ...

}

fread(a, sizeof(Person), N, fp); for (i=0; i

...

}

Bộ môn Công nghệ phần mềm – ĐHCN 61

Phong c¸ch lËp tr×nh víi C/C++

NguyễnVănVỵ

(cid:131) 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Ï

(cid:144) .c: khai b¸o d÷ liÖu, hμm (cid:144) .h: ®Þnh nghÜa c¸c kiÓu d÷ liÖu dïng chung (cid:131) 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 62

C¸c b−íc x©y dùng phÇn mÒm trªn C/C++

NguyễnVănVỵ

(cid:131) So¹n th¶o (edit) (cid:131) TiÒn biªn dÞch (pre-compile) (cid:131) Biªn dÞch (compile) (cid:131) KÕt nèi (link) (cid:131) Thùc hiÖn (execute)

Bộ môn Công nghệ phần mềm – ĐHCN 63

date.h

NguyễnVănVỵ

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 64

date.h

NguyễnVănVỵ

date.h typedef struct {

int year, mon, day;

} Date; void print_date(Date);

date.c

#include ”date.h” 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

date.h

NguyễnVănVỵ

.h

header

include

.c

.c

source

...

compile

.o

.o

object

link

.exe

Bộ môn Công nghệ phần mềm – ĐHCN 66

date.h

NguyễnVănVỵ

print_date()

date.h

calender.c

tools.c

calender.o

tools.o

print_date()

print_date()

link error

Bộ môn Công nghệ phần mềm – ĐHCN 67

date.h

NguyễnVănVỵ

date.h

tools.c

date.c

print_date()

calender. c

tools.o

date.o

print_date()

calender.o

print_date()

calender.exe

Bộ môn Công nghệ phần mềm – ĐHCN 68

Pre-compile

NguyễnVănVỵ

(cid:131) ChØ thÞ ch−¬ng tr×nh dÞch (tiÒn biªn dÞch) (cid:131) T¹o ra c¸c macro (cid:131) T¹o ra c¸c phiªn b¶n phÇn mÒm kh¸c nhau (cid:131) Qu¶n lÝ c¸c tÖp header

#include #define #ifdef #ifndef #endif

Bộ môn Công nghệ phần mềm – ĐHCN 69

Pre-compile

NguyễnVănVỵ

#define Cube(x) (x*x*x) ... void main() {

... m = Cube(n); ...

}

Bộ môn Công nghệ phần mềm – ĐHCN 70

Pre-compile

NguyễnVănVỵ

T¹o c¸c phiªn b¶n phÇn mÒm kh¸c nhau

#define DEBUG ...

int foo() { #ifdef DEBUG

fprintf(stderr, "foo() called");

#endif ... }

Bộ môn Công nghệ phần mềm – ĐHCN 71

Header & Precompile

NguyễnVănVỵ

Date.h

include

Calender.h

Schedule.h

include

JobManager.c

Bộ môn Công nghệ phần mềm – ĐHCN 72

Header & Precompile

NguyễnVănVỵ

date.h

#ifndef DATE_H #define DATE_H

typedef struct {

int year, mon, day;

} Date;

void print_date(Date);

#endif

Bộ môn Công nghệ phần mềm – ĐHCN 73

Header & Precompile

NguyễnVănVỵ

calender.h

schedule.h

#ifndef CALENDER_H #define CALENDER_H

#ifndef SCHEDULE_H #define SCHEDULE_H

#include ”date.h” ...

#include ”date.h” ...

#endif

#endif

Bộ môn Công nghệ phần mềm – ĐHCN 74

Header & Precompile

NguyễnVănVỵ

JobManager.c

#include ”calender.h” #include ”schedule.h” ... void main() { ... }

Bộ môn Công nghệ phần mềm – ĐHCN 75

C©u hái «n tËp

NguyễnVănVỵ

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 76

C©u hái «n tËp

NguyễnVănVỵ

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 77

C©u hái và thảo luận

NguyễnVănVỵ

Bộ môn Công nghệ phần mềm – ĐHCN 78