U ovoj lekciji obrađivaćemo:

  • Raspon promenjivih
  • Životni vek promenjivih
  • Preporuke za kodiranje u skladu sa ovim karakteristikama


Raspon promenjive

Neka je dat sledeći primer koda:

a = 0;
b = 0;
c = 0;
a = b + c;

 

U ovom slučaju, dve linije koda postoje između prvog referenciranja na “a” i drugog, pa se kaže da je raspon (eng. span) promenjive a dva. Jedna linija dolazi između dva referenciranja na “b”, pa “b” tako ima raspon od jedan, dok C ima raspon od nula.

Pogledajmo još jednog primer koda:

a = 0;
b = 0;
c = 0;
b = a + 1;
b = b / c;

 

U ovom slučaju, postoji jedna linija izmedju prvog referenciranja na “b” i drugog, pa je raspon jedan. Nema linija između drugog referenciranja na “b” i trećeg, pa je raspon nula.

Srednji raspon se izračunava prema proseku pojedinačnih raspona. U prethodnom primeru za “b”, (1+0)/2 iznosi u proseku raspon od 0.5. Kada se čuvaju reference na promenjive bliže zajedno, omogućava se osobama koje čitaju kod da se fokusiraju na jednu sekciju u jednom trenutku. Ako su reference udaljene, čitalac se primorava da skače po programu. Tako je glavna prednost držanja referenci zajedno poboljšanje čitljivosti programa.

Životni vek promenjive

Koncept koji je vezan za raspon promenjive je životni vek promenjive, tj. ukupan broj iskaza tokom kojih je promenjiva “živa”. Životni vek promenjive počinje od prvog iskaza u kojem je referencirana i završava u posljednjem iskazu u kojoj je referencirana.

Za razliku od raspona, na životni vek ne utiče koliko puta je promenjiva korišćena između prvog i poslednjeg puta kada je referencirana. Ako je varijabla prvi put referencirana u liniji 1 i posljednji put u liniji 21, ima životni vek od 21 iskaza. Ako su ova dva reda jedina u kojima se koristi, ima u proseku raspon od 19 iskaza. Ako je promenjiva korišćena u svakom redu od linije 1 do linije 21, onda ima u proseku raspon od 0 iskaza, ali i dalje ima životni vek od 21 iskaza. Sledeća slika ilustruje raspon i životni vek.

Slika 1. Ilustracija raspona i životnog veka promenjive

Dug životni vek znači da promenjiva živi tokom opsega od mnogo iskaza. Kratak životni vek znači da promenjiva živi samo kroz nekoliko iskaza. Raspon referiše na to koliko su bliske zajedno reference na promenjive.

Cilj je imati promenjivu "živu" što je moguće manje vremena. Kao i sa rasponom, osnovna prednost održavanja ovog malog broja je smanjenje opsega ranjivosti. Smanjuje se verovatnoća od nekorektnog ili nehotičnog menjanja promenjive. Druga prednost držanja malog životnog veka je što se pruža precizna slika koda. Ako je npr. promenjivoj dodeljena vrednost u liniji 5 i nije korišćena više do linije 55, upravo taj prostor između podrazumeva da je promenjiva korišćena između linija 5 i 55. Ako je promenjivoj dodeljena vrednost u liniji 54 i korišćena u liniji 55, jasno je da nema drugog korišćenja promenjive, pa je moguće koncentrisati se na manju sekciju koda kada se posmatra ta promenjiva.

Kratak životni vek čini kod čitljivijim i preglednijim. Što je manji broj linija koda koje čitalac treba da pamti odjednom, to je kod lakši za razumevanje.

Takođe, što je kraće životno vreme, to manje koda treba držati na jednom ekranu, kada je potrebno videti sve reference promenjive tokom postupka editovanja i debagovanja (eng. debugging).

Konačno, kraći životni tok je koristan kada je potrebno podeliti veliku rutinu u nekoliko manjih. Ako se pojavljivanja promenjive drže veoma blizu, to je lakše razbiti povezane sekcije koda u zasebne rutine.

Merenje životnog veka promenjive

Primer 1. Promenjive sa dugim životnim vekom

1   // initialize all variables
2   recordIndex = 0;
3   total = 0;
4   done = false;   
     ...
26  while ( recordIndex < recordCount ) {
27  ...
28     recordIndex = recordIndex + 1;         <-- 1       
     ...
64  while ( !done ) {      
...69     if ( total > projectedTotal ) {       <-- 2
70        done = true;                        <-- 3 

 

Oznake u ovom primeru su:

(1) Poslednje pojavljivanje recordIndex.
(2) Poslednje pojavljivanje total.
(3) Poslednje pojavljivanje done.

Životni vek promenjivih u ovom primeru su:

(1) recordIndex ( line 28 - line 2 + 1 ) = 27
(2) total ( line 69 - line 3 + 1 ) = 67
(3) done ( line 70 - line 4 + 1 ) = 67

Prosečno životno vreme u ovom slučaju je ( 27+67+67 ) / 3, što iznosi približno 54.

U nastavku je ovaj primer napisan tako da su promenjive grupisanije.

Primer 2. Promenjive sa dobrim, kratkim životnim vekom

...
25  recordIndex = 0;                 <-- 1
26  while ( recordIndex < recordCount ) {
27  ...
28     recordIndex = recordIndex + 1;      
     ...
62  total = 0;                                <-- 2
63  done = false;                             <-- 2
64  while ( !done ) {      
      ...
69     if ( total > projectedTotal ) {
70        done = true;  

 

Oznake u ovom primeru su:

(1) Inicijalizacija recordIndex je sada pomerena na dole
(2) Inicijalizacija od total i done je takođe spuštena

Životni vek promenjivih u ovom primeru su:

(1) recordIndex ( line 28 - line 25 + 1 ) = 4
(2)total ( line 69 - line 62 + 1 ) = 8
(3) done ( line 70 - line 63 + 1 ) = 8

Prosečno životno vreme u ovom slučaju je ( 4+8+8 ) / 3, što iznosi približno 7.

Drugi primer izgleda bolje, jer se inicijalizacija promenjivih izvodi bliže mestu gde će biti korišćene. Izmerena razlika između prosečnih vremena je izrazita, 54 prema 7, što daje odličnu kvantitativnu prednost za drugi primer koda.

Preporuke za minimiziranje opsega 

Na osnovu navedenog moguće je dati sledeće preporuke za minimiziranje opsega:

  1. Inicijalizovati promenjive koje se koriste u petljama, neposredno pre petlje, radije nego na početku rutine koja sadrži tu petlju. Na ovoj način, prilikom modifikovanja petlje, lakše će se zapamtiti i uraditi izmena na inicijalizaciji petlje.
  2. Ne dodeljivati vrednosti promenjivoj pre nego se ta vrednost neposredno koristi. Često je frustrirajuće pokušavati pronaći gde se promenjivoj dodeljuje vrednost.
  3. Grupisanje srodnih iskaza, koje je detaljnije opisano u nastavku lekcije.

Grupisanje srodnih iskaza

U nastavku je dat primer zajedničkog referenciranja promenjivih tako da budu lakše za lociranje. Prvo je dat primer zbunjujućeg korišćenja dva skupa varijabli:

void SummarizeData(...) {  
...   GetOldData( oldData, &numOldData );                          
GetNewData( newData, &numNewData );            
totalOldData = Sum( oldData, numOldData );     
totalNewData = Sum( newData, numNewData );     
PrintOldDataSummary( oldData, totalOldData, numOldData );  
PrintNewDataSummary( newData, totalNewData, numNewData );  
SaveOldDataSummary( totalOldData, numOldData );  
SaveNewDataSummary( totalNewData, numNewData );             
 ...
}



U ovom primeru je potrebno pratiti podatke o oldData, newData, numOldData, numNewData, totalOldData, i  totalNewData, svih u jednom trenutku.

Sledeći primer pokazuje kako da se smanji taj broj na tri elementa unutar svakog bloka koda.

void SummarizeData( ... ) {  
GetOldData( oldData, &numOldData );                       <-- 1  
totalOldData = Sum( oldData, numOldData );  |  
PrintOldDataSummary( oldData, totalOldData, numOldData );  
SaveOldDataSummary( totalOldData, numOldData );           <-- 1  
...  
GetNewData( newData, &numNewData );                       <-- 2  
totalNewData = Sum( newData, numNewData );  |  
PrintNewDataSummary( newData, totalNewData, numNewData );  
SaveNewDataSummary( totalNewData, numNewData );           <-- 2  
...
}  

 

Oznake:

(1) Iskazi koji koriste oldData
(2) Iskazi koji koriste newData 

 

Kada se kod razbije, dva bloka su kraća od originalnog i sadrže pojedinačno manje promenjivih, što je lakše za razumevanje.      

Reference:

  1. Bentley, Programming Pearls, second ed., Addison-Wesley, 2000,
  2. W. Kernighan and R. Pike, The Practice of Programming, Addison-Wesley, 1999,
  3. McConnell, Code Complete: A Practical  Handbook of Software Construction, Microsoft Press, second ed., 2004.
Dodaj komentar Sviđa mi se - (0) Ne sviđa mi se - (0)    

  • Raspon i životni vek promenjive 1
  • Raspon i životni vek promenjive 2
  • Raspon i životni vek promenjive 3