You are on page 1of 14

1|Phong cch lp trnh C++

PHONG CCH LP TRNH C++


Bn ang hc lp trnh, vy bn ngh v mt chng trnh my tnh nh th no?

Mt chng trnh my tnh c th xem nh mt tc phm, bi v n c c bi bn (c th by gi, m cng c th l 10 nm sau!), v bi nhng lp trnh vin khc sau bn ( pht trin, sa cha, cp nht ...). Chnh v l , mt chng trnh my tnh nn p ng c 3 yu cu sau: ng, d c v d hiu. Mc ch ca style l lm cho chng trnh tr nn d c i vi ngi vit v nhng ngi khc, mt style tt l mt phn thit yu ca vic lp trnh tt. Vit mt chng trnh chy ng l cha bi chng trnh khng ch cho my tnh c m cn cc lp trnh vin khc c. Hn na, mt chng trnh c style tt lun c nhiu kh nng chy ng hn mt chng trnh c style ti.

Ti liu ny cung cp cho bn: 1. Mt tp hp cc chun trnh by chng trnh thng dng. 2. Mt thi quen t bn c mt phong cch lp trnh tng i chuyn nghip. Tuy nhin, ti liu ny khng c tham vng cp n ton b cc kha cnh ca mt phong cch lp trnh. N ch ni n nhng g cn thit cho bn, mt sinh vin, khi cha tm c mt phong cch ph hp to c nhng thi quen tt ngay t u.

T chc chng trnh 1. Mun ha chng trnh ca bn Chng trnh ca bn nn c tch thnh nhiu mun, mi mun thc hin mt cng vic v cng c lp vi nhau cng tt. iu ny s gip bn d bo dng chng trnh hn v khi c chng trnh, bn khng phi c nhiu, nh nhiu cc on lnh nm ri rc hiu c iu g ang c thc hin. Khi mun chuyn thng tin cho cc chng trnh con, bn nn s dng cc tham s. Trnh s dng cc bin ton cc v lm nh vy bn s trit tiu tnh c lp gia cc chng trnh con v rt kh khn khi kim sot gi tr ca chng khi chng trnh thi hnh. (Ch , bn nn phn bit gia bin ton cc v hng s ton cc) 2. nh ngha v ci t ca cc lp phi c chia thnh nhiu file ta c th d dng ti s dng. nh ngha cc lp c lu trong cc file header vi m rng *.h. Ci t ca cc thnh vin ca lp lu trong file ngun vi m rng *.cpp. Thng thng mi lp c mt cp file *.H v *.CPP, nhng c th gp cc lp c lin quan vo mt cp file.Cui mi file *.H l ch th #include n file *.CPP.Cui mi file *.CPP l cc "chng trnh chnh" dng test file CPP km theo cc #define thch hp cho vic test. Chng trnh chnh c lu trong mt file ngun ring v include cc file header ca cc lp c dng n.

2|Phong cch lp trnh C++

3. Mi file header ca lp nn s dng cc nh hng #ifndef, #define, v #endif m bo mi file header ch c include 1 ln. K hiu c #define nn l tn ca file header vit ton bng ch hoa vi mt du gch di ( _ ) thay cho du chm. V d: //counter.h #ifndef COUNTER_H #define COUNTER_H class Counter {

//... }; // end Counter #include "counter.cpp" #endif // COUNTER_H

Chun ti liu

1. S dng // cho cc ch thch. Ch dng /* */ tm thi v hiu ha cc on chng trnh test v debug. 2. Mi file ngun, c .CPP v .H, u phi bt u bng mt khi ch thch ngi c c th kt ni cc file nu chng b tch ra. Mu nh sau: //--------------------------------------------------------------------// Name: H tn // Class: Lp // Project: m t/tn d n (mt dng, ging nhau ti mi file) // Purpose: Mc ch s dng ca m chng trnh hoc cc khai bo trong file ny //--------------------------------------------------------------------Mi lp, hm, phng thc phi c mt khi ch thch m t ngn gn lp, hm, phng thc lm g; i vi hm/phng thc: lit k tt c cc tham s, nu r ngha ca tham s; v m t iu kin trc v sau ca hm/phng thc .Chn cc tn c ngha s n gin ha cc ch thch. Lu , ti liu v phng thc t ti nh ngha lp (*.H) ta c th sao chp ti liu vo file *.CPP nhng khng bt buc.

3. C th ch thch cc on code bn trong hm, tuy nhin ch nn ch thch hiu. Qu nhiu ch thch v ch thch tha lm code trng ri. Tt c cc ch thch phi c li u dng cng on code quanh n.

Tn:

3|Phong cch lp trnh C++

S dng cc tn c ngha.Tn giu tnh m t cho cc bin ton cc v tn ngn gn cho cc bin cc b.Tn
c ngha s gip chng trnh d vit v d debug hn. Nu bn phi dng tn khng c ngha cho mt ci g th c th bn cha hon ton hiu bi ton mnh ang gii. Hy c hiu r trc khi tip tc lp trnh. Theo thngl, cc tn i v j c dnh cho cc ch s, p v q dnh cho cc con tr, s v t dnh cho cc xu.Ngi ta dng cc tn bt u hoc kt thc bi ch p cho cc bin con tr (chng hn nodep, intp, intpp, doublep), cc tn bt u bng ch hoa cho bin ton cc (chng hn Globals) v tt c ch ci hoa cho cc hng s (chng hn CONSTANTS). Khuyn co s dng tn ting Anh kiu camel (xem bn di) Cc namespace trong C++ gp phn lm r ngha ca cc tn m khng cn s dng cc tn di.

t tn mt cch nht qun


Cc bin c lin quan phi c t cc tn c lin quan, ng thi phi lm ni bt c s khc nhau ca chng. Cc tn trong lp sau y va qu di va khng h nht qun: class UserQueue { int noOfItemsInQ, frontOfTheQueue, queueCapacity; public int noOfUsersInQueue() {...} };

Th nht, cng mt ni dung l queue nhng c biu din bi ba du hiu: Q, Queue v queue. Th hai, cc bin v cc hm thnh phn ca lp UserQueue ch c th c s dng bi cc i tng ca lp ny, do vy vit queue.queueCapacity hay queue.noOfUsersInQueue() r rng l tha. Chng ta c th vit li lp ny vi cc tn mi nh sau: class UserQueue { int nitems, front, capacity; public int nusers() {...} } Khng ch bn thn on m nh ngha lp d hiu hn, m nhng on m s dng lp UserQueue cng d hiu hn: queue.capacity++; n = queue.nusers(); Lp UserQueue vn c th ci tin thm, bi nitems v nusers thc cht l cng biu din mt khi nim v do ch cn s dng mt trong hai tn m thi.

4|Phong cch lp trnh C++

Tn ca cc project, form, v component sinh bi mi trng lp trnh: cc project v form phi c tn hp l, khng
nguyn l Form1. Cc component phi c t tn c ngha, ngoi tr cc component nh Label, Group Box, etc., nu chng khng c mt trong code. Cc component nn c t hu t l kiu i tng: Ex: widthScale, nameText, leftScrollbar, mainForm, myLabel, printerDialog ...

Tn bin v tn hm:
o Thng phi l cc t hoc cm t. Ngoi l duy nht: con m vng for() i khi c th ch cn dng tn l 1 ch ci chng hn i o khng vit tt tr cc t vit tt thng dng chng hn HTML, khi coi t vit tt nh t thng thng (tn s c dng convertToHtml thay v convertToHTML) o t tn cho cc namespace nn bng ch in thng ton b: Ex: mynamespace, com.company.application.ui o Tn bin l mt danh t bt u bng mt k t in thng, cc t tip theo c bt u bng mt k t in hoa: Ex: line, audioSystem o t cc tn ng cho hm: Tn hm nn l mt ng t theo sau bi mt danh t. V d: now = date.getTime(); Cc hm tr v gi tr boolean nn c t tn th hin gi tr m n tr v. V d: isOctal( c ) th tt hn l: checkOctal( c ); v cch t tn th nht cho bit ngay rng hm tr v gi tr true nu c l mt s octal v tr v false trong trng hp ngc li. o Tn hm th hin chc nng Cc tin t thng c s dng: get/set, add/remove, create/destroy, start/stop, insert/delete, increment/decrement, old/new, begin/end, first/last, up/down, min/max, next/previous, old/new, open/close, show/hide, suspend/resume ... Ex: +set/get c t trong cc phng thc truy cp trc tip n thuc tnh: getName(), setSalary(int) +find c th c s dng trong cc phng thc tm kim: vertex.findNearestVertex(); matrix.findSmallestElement(); node.findShortestPath(Node destinationNode); +Tp hp nhiu i tng nn c t tn c t tn s nhiu: vector<Point> points; int[] values; +Nhng bin ch s lng i tng nn c tin t n: nPoints, nLines

Tn class (v struct):
Dng ch hoa tt c cc ch ci u mi t, cn li l cc ch ci thng. V d: GameBoard, Game.

nh dng

Li u dng cc on code, mi mc dng 3 hoc 4 k t, tt nht l dng tab.

5|Phong cch lp trnh C++

o Phi thng nht, lun dng 3 hoc lun dng 4 k t o Ch khng c dng ln ln gia k t tab v space li u dng, (cc mi trng son tho c th quy c khc nhau v di ca tab).

Mi dng ch cha nhiu nht 1 lnh v khng di qu 79 k t. Mt lnh c th


c chia thnh nhiu dng, khi cc phn sau phi c li u dng hp l. V d : cout << "The cost for 1 loaf of bread" << endl << "is $1.89" << endl;

C th cn thng hng nng cao hightlight. VD:


int songuyen double sothuc char kytu char ten[] bool gt[] = 100; = = = = 3.14 ; 'a' ; { "tam", "lan", "hiep", "bao", "yen", "tuan", "hoa" }; { 0 ,0 ,0 ,1 ,0 ,1 ,0 };

Cc khi vi cp ngoc {} phi c trnh by 1 trong 2 cch sau:


if (!done) { doSomething(); moreToDo(); } else { // } if (!done) { doSomething(); moreToDo(); } else { // } Nu trong khi ch c 1 lnh th c th b ngoc (tt hn l khng nn) nhng vn li u dng:

for( n++; n < 100; n++ ) field[ n ] = 0;

6|Phong cch lp trnh C++

*i = 0; return n;

Nn c khong trng gia t kha v du (, nhng khng nn c khong trng gia tn hm v du (.


V d:

// no space between 'strcmp' and '(', // but space between 'if' and '(' if ( strcmp( input_value, "done" ) == 0 ) return 0; Ngoi ra nn c khong gia du ngoc ca hm v i s nh trn. Nn c 1 space trc v sau mi ton t i s hc hoc lgic, chng hn +, <<, v ||. Nn dng 1 space sau du phy, nhng trc du phy hoc chm phy khng nn c du cch.Ngoi l: khng chn khong trng vo gia ton hng v ton t ++ v -

Chn dng trng gia cc on khc nhau trong chng trnh.

Thit k

Mt s vn thng gp m sinh vin cn ch :

Khng d liu ca lp dng public. Hn ch ti a vic dng bin ton cc. Nguyn tc quyn u tin ti thiu: ch cho hm quyn truy nhp thc hin nhim v ca mnh, khng cho
nhiu quyn hn. const c s dng cho mt bin khi hm khng cn thay i bin c tham chiu n . Nu hm khng c sa gi tr ca mt tham s, ch truyn tham s vo l gi tr i vi cc kiu n gin, mng phi c truyn di dng "const []", v cc kiu struct/class nn truyn dng "const &" hoc "const *".

Khng d liu trong lp m n khng thc s thuc v lp . Chng hn, nu mt hm cn mt bin lu mt


kt qu tm thi, khng khai bo mt bin thuc lp m hy khai bo mt bin a phng ca hm .

Cc hm hoc phng thc ca lp khng nn to output tr khi l nhim v ca phng thc . V d, mt


phng thc print c th s ghi thng tin ra cout, nhng mt thao tc thm hoc bt ci g t mt danh sch th khng.

Mi phng thc/hm (k c hm main()) ch cha ti a 30 dng k c tnh t ngoc m hm { ti ngoc kt


thc hm }.

7|Phong cch lp trnh C++

CODE 1.Vit code theo chun ISO d compiler c bt buc hay khng.

Hn ch #include ngoi chun, VD: conio.h Nn int main()v return 0;thay v void main() Khai bo using std:: ngay c khi IDE khng bt buc. (dng using namespace std; khng tt lm)
2. Cc hng s khng nn vit trc tip vo chng trnh. Thay v th, ngi ta thng s dng lnh #define hay const t cho nhng hng s ny nhng tn c ngha. iu ny s gip lp trnh vin d kim sot nhng chng trnh ln v gi tr ca hng s khi cn thay i th ch phi thay i mt ln duy nht gi tr nh ngha ( #define hay const). V d: popChange = (0.1758 - 0.1257) * population; nn c vit l: const double BIRTH_RATE = 0.1758, DEATH_RATE = 0.1257; hoc: #define BIRTH_RATE 0.1758 #define DEATH_RATE 0.1257

//... popChange = (BIRTHRATE - DEATH_RATE) * population; Ghi ch: bn khng nn dng #define thng xuyn nh ngha cc hng s, bi v trong qu trnh debug, bn s khng th xem c gi tr ca mt hng s nh ngha bng #define. Khi lm vic vi cc k t, hy s dng cc hng k t thay v cc s nguyn. V d kim tra xem c c phi mt ch ci hoa hay khng, c th dng on m sau: if( c >= 65 && c <= 90 ) ... Nhng on m ny hon ton ph thuc vo b m biu din k t ang c s dng. Cch tt hn l vit nh sau: if( c >= A && c <= Z ) ...

3.Lun vit new v delete thnh tng cp. 4. Khi khai bo con tr, du con tr nn c t lin vi tn, nhm trnh trng hp sau:

char* p, q, r; // q, r khng l con tr

8|Phong cch lp trnh C++

Trong trng hp ny nn vit l:

char *p, *q, *r; (lut ny cng c dng khi khai bo tham chiu vi du &)

5. Nn s dng cc du ( ) khi mun trnh cc li v u tin ton t. V d: // No! int i = a >= b && c < d && e <= g + h; // Better int j = (a >= b) && (c < d) && (e <= (g + h)); Bng sau trong sch C Programming Language ch ra th t u tin cc ton t trong C. Hng trn cng c mc u tin cao nht. Ton t ([-. ! -- ++ { * & (type-cast) sizeof + - (1 ngi) * /% + << >> < <= > >= == != & ^ | && || ?: = += -= *= /= %= &= ^= |= <<= >>= , Dch T tri qua phi T phi qua tri T tri qua phi T tri qua phi T tri qua phi T tri qua phi T tri qua phi T tri qua phi T tri qua phi T tri qua phi T tri qua phi T tri qua phi T tri qua phi T phi qua tri T tri qua phi

Dng bng ny, c th thy rng char *a[10]; l mt mng 10 con tr k t. Bn cng thy rng ti sao li cn du ngoc khi dng (*p).i. Sau khi thc hnh, bn s nh bng ny.

9|Phong cch lp trnh C++

6.Tch cc biu thc phc tp thnh cc biu thc n gin hn Biu thc sau y rt ngn gn nhng li cha qu nhiu php ton: *x += ( *xp = ( 2*k < ( n m ) ? c[ k + 1 ] : d[ k ] ) );

Chng ta nn vit li nh sau: if( 2*k < n m ) *xp = c[ k + 1 ]; else *xp = d[ k ]; *x += *xp;

7.Vit cc lnh d hiu, khng vit cc lnh khn ngoan

Cc lp trnh vin thng thch vit cc lnh cng ngn gn cng tt. Tuy nhin iu ny thng gy phin toi cho ngi khc. Hy xem biu thc sau y lm g: subkey = subkey >> ( bitoff ( ( bitoff >> 3 ) << 3 ) );

Biu thc trong cng ( bitoff >> 3 ) dch phi bitoff 3 bit. Kt qu thu c li c dch tri 3 bit. Bi vy 3 bit cui cng ca bitoff c thay th bi cc s 0. Kt qu ny li c tr i bi gi tr ban u ca bitoff, kt qu ca php tr chnh l 3 bit cui cng trong gi tr ban u ca bitoff. Ba bit ny c dng dch subkey sang phi. Bi vy, biu thc ni trn tng ng vi biu thc sau y: subkeu = subkey >> ( bitoff & 07 );

R rng cch vit th hai d hiu hn nhiu. Mt v d khc v cch vit biu thc ngn gn nhng lm phc tp ha vn : child = ( ! LC && ! RC ) ? 0 : ( ! LC ? RC : LC );

Cch vit di y di hn, nhng d hiu hn nhiu: if( LC == 0 && RC == 0 ) child = 0; else if( LC == 0 ) child = RC; else child = LC;

10 | P h o n g c c h l p t r n h C + +

Ton t ? : ch thch hp cho nhng biu thc ngn kiu nh sau y: max = ( a > b ) ? a : b; hoc: printf( The list has %d item%s\n, n, n == 1 ? : s );

Hy nh rng mc tiu ca chng ta l vit nhng on m d hiu, ch khng phi cc on m ngn gn. 8.Cn thn vi du = = v == l 2 ton t gy nhn ln nht trn C, nhng bn c th trnh gp n bng thi quen vit r-value (biu thc bn phi php gn) sang bn tri php so snh: if ( a == 42 ) { ... }// Cch vit thng thng. if ( 42 == a ) { ... }// Nn vit th ny. V y l s khc bit, khi bn nhm ... if ( a = 42 ) { ... }// Chy bnh thng, kh tm ra li if ( 42 = a ) { ... }// Bo li ngay ch ny

9. Cc idiom Cng ging nh ngn ng t nhin, ngn ng lp trnh cng c cc idiom (thnh ng !?), l cc cch vit code chnh tc cho cc trng hp thng dng, tm hiu idiom l cc chun khng bt buc nhng c a s ngi dng tun theo. S dng cc idiom gip gim bt kh nng mc li ng thi lm chng trnh d c hn v nht l c v chuyn nghip hn Sau y l mt s idiom ph bin: 1.Cc idiom cho mng duyt qua n phn t ca mt mng v khi to chng, c cc cch vit sau y: i = 0; while ( i <= n 1 ) array[ i++ ] = 1.0; hoc for( i = 0; i < n; ) array[ i++ ] = 1.0; hoc for( i = n; -i >= 0; ) array[ i ] = 1.0; Tt c nhng cch vit trn u ng, tuy nhin idiom cho trng hp ny l: for( i = 0; i < n; ++i ) array[ i ] = 1.0;

11 | P h o n g c c h l p t r n h C + +

Mt lu nh l s khc bit gia i++ v ++i: i++ ly gi tr ca i trc ri tng n ln. ++i tng gi tr ca i ri ly gi tr mi. Do i vi cc con m vng lp (for(),while()) nn dng ++i tng tc . Idiom ca vng lp duyt qua cc phn t ca mt danh sch (list) l for( p = list; p != NULL; p = p->next ) ... i vi container: vector<string>::iterator it; for(it = v.begin(); it != v.end(); ++it) std::cout << *it; i vi cc vng lp v hn, idiom l: for ( ; ; ) hoc while( 1 ) Khi to danh sch: struct info { char *name; char *job; char *address; }; info *array[] = { { "name1", "job1", "add1" }, { "name1", "job1", "add1" }, { "name1", "job1", "add1" }, //... }; Hm tm kim tuyn tnh: template <class T> int find (T obj,T* array,int size,int from = 0) { for(int i = from; i<size; ++i) if(array[i] == T) return i; return size; } Sao chp mng: Gi s 2 mng double *a,*b; thay v: for(int i=0; i<n; ++i) b[i]=a[i]; ta c th dng: //#include<string.h>

12 | P h o n g c c h l p t r n h C + +

memcpy(b,a,n*sizeof(double)); Cp pht ng cho mng 2 chiu: int **pp = new type*[n]; int *p = new type[n*m]; for (int i = 0; i < n; ++i) pp[i] = p + i * m; //... //use array here delete[] p; delete[] pp;

2.Idiom cho lnh if Tip theo l mt idiom dnh cho cu lnh if. Hy xem on m long ngong sau y lm g

if ( argc==3 ) if ( ( fin = fopen(argv[l] , r ) ) != NULL ) if ( ( fout = fopen( argv[2], w ) ) != NULL ) { while ( ( c = getc( fin ) ) != EOF ) putc( c, fout ); fclose( fin ); fclose( fout ); } else printf ( Cant open output file %s\n, argv[2] ) ; else printf( Cant open input file %s\n, argv[l] ) ; else printf ( Usage: cp input file outputfile\n ) ; Vit li on m ny theo ng idiom nh sau:

if ( argc != 3 ) printf ( Usage: cp input file outputfile\n ) ; else if ( ( fin = fopen( argv[l] , r ) ) == NULL ) printf( Cant open input file %s\n, argv[l] ); else if ( ( fout = fopen( argv[2], w ) ) == NULL ) { printf ( Cant open output file %s\n, argv[2] ) ; fclose( fin ) ; } else

13 | P h o n g c c h l p t r n h C + +

{ while ( ( c = getc( fin ) ) != EOF) putc( c, fout ); fclose( fin ) ; fclose( fout ) ; }

Nguyn tc khi vit cc lnh if() l t cc php ton kim tra iu kin cng gn cc hnh ng tng ng cng tt.

3.Idiom cho switch() case: Xt v d: switch (c) { case '-': sign = -1; case '+': c = getchar(); case '.': break; case '0': case 'o': default: if (!isdigit(c)) return 0; } cch vit sau tuy di nhng d c hn:

switch (c) { case '-': sign = -1; case '+': c = getchar(); break; case '.': break; default: case '0': case 'o': if (!isdigit(c)) return 0; break; }

4.S 0 trong chng trnh S 0 thng xuyn xut hin trong cc chng trnh vi nhiu ngha khc nhau. Trnh dch s t ng chuyn s 0 thnh kiu thch hp. Tuy nhin nn vit ra mt cch tng minh bn cht ca s 0 m chng ta ang ni n. C th, hy s dng ( void* )0 hoc NULL biu din con tr null trong C, s dng \0 cho k t null cui mi xu v s dng 0.0 cho cc s float hoc double c gi tr khng. ng vit on m nh sau p = 0; name[ i ] = 0;

14 | P h o n g c c h l p t r n h C + +

x = 0; Hy vit: p = NULL; name[ i ] = '\ 0'; x = 0.0; S 0 nn dnh cho cc s nguyn c gi tr bng khng. Tuy nhin trong C++, 0 (thay v NULL) li c s dng rng ri cho cc con tr null, iu ny khng c khuyn khch.

Mi s vi phm u c cho php nu n gip cho ti u on m ca bn.


Mc ch chnh ca cc quy tc ny l lm cho m ngun d c hiu hn, d dng sa li v bo tr, nng cht lng chung ca m ngun. Tuy nhin, n s khng th p dng ng vi mi trng hp c th, v cc lp trnh vin phi s dng mm do cc quy c ny.

You might also like