You are on page 1of 26

27

.NET brojni i
vrednosni tipovi
prethodnom poglavlju ste nau~ili kako da koristite Visual C# Express integrisano razvo-
jno okru`enje, odnosno .NET pomo}u CIL i CLR. U o vom poglavlju }emo zavrnuti
rukave i pristupiti pisanju C# koda, konkretno, koda kojim se kreira kalkulator.
Kalkulator je idealan primer za po~etak, po{to vam omogu}ava da se fokusirate na aplikaciju,
a da ne morate da posve}ujete zna~ajnu pa`nju na detalje koji su obi~no povezani sa programi-
ma. U programskom jeziku kakav je C#, sabiranje dva broja je veoma jednostavna operacija. Ono
{to je malo slo`enije je postupak dodavanja operacije sabiranja dva broja u program.
U ovom poglavlju glavna pa`nja je posve}ena postupku pisanja programa kori{}enjem pro-
gramskog jezika C#, odnosno postupku prevo|enja odgovaraju}e ideje u C# program koji mo`e
da izvr{ava ono {to ste zamislili. Nau~i}ete na koji na~in mo`ete da organizujete postupak razvo-
ja programa i implementiranja C# biblioteke klasa, odnosno kako .NET CLR upravlja brojnim
tipovima.
Pode{avanje i organizovanje okru`enja
Prilikom razvoja softvera, svoj rad }ete podeliti u dva glavna zadatka: organizovanje i imple-
mentiranje. Organizovanje projekta podrazumeva identifikovanje elemenata i biblioteka koje je
neophodno da defini{ete, broja ljudi koji }e u~estvovati u razvoju, i sli~no.
Organizovanje razvoja je jedan od najzna~ajnijih zadataka prilikom pisanja koda, a to je
obi~no ne{to {to najvi{e zbunjuje nove programere. Profesionalni programeri se pona{aju tako
da izgleda da svoj posao instinktivno organizuju, ali to samo deluje tako, jer su iste aktivnosti
obavljali veliki broj puta, tako da one postaju automatske.
Kada su programeri vezani za kreiranje programa, od njih se zahteva da kreiraju softver koji
implementira odre|eni skup funkcionalnosti. Funkcionalnosti podrazumevaju izra~unavanje
dnevnih interesnih uplata, automatsko generisanje pisama koja ukazuju na prihvatanje ili odbi-
janja zahteva za pozajmicom, i tako dalje. Funkcionalnost je uvek povezana sa izvr{avanjem
nekog zadatka koji je definisan odre|enim procesom. Mo`emo da ka`emo da je implementacija
funkcionalnosti direktna implementacija odre|enog zadatka.
p og l a v l j e 2
U
POGLAVLJE 2
Prilikom definisanja funkcionalnosti neophodno je da uradite slede}e:
Potpuno razumevanje funkcionalnosti. Ne mo`ete da implementirate ne{to {to ne
razumete u potpunosti. Da biste mogli da pi{ete izvorni kod programa koji
omogu}ava implementiranje odre|ene funkcionalnosti, neophodno je da u potpunos-
ti razumete sve ono {to je vezano za funkcionalnost.
Opisivanje funkcionalnosti kori{}enjem metoda strukturnog projektovanja.
Jednostavno organizovanje misli mo`e da bude dovoljno ukoliko ste jedina osoba
koja radi na razvoju programa; me|utim, veoma ~esto, bi}ete deo tima. Neophodno je
da primenjujete metod strukturnog projektovanja, kako biste vi i ostali ~lanovi va{eg
tima mogli da me|usobno komunicirate u toku razvoja programa.
Jedan od standardnih metoda strukturnog projektovanja je Unified Modeling Language
(UML). UML se primenjuje za organizovanje elemenata u jedinice koje odgovaraju konstrukcija-
ma programskog jezika, kao {to su klase. UML mo`ete da smatrate specifi~nim `argonom pro-
gramera, koji se koristi za opisivanje razli~itih aspekata programskog okru`enja na visokom
nivou apstrakcije. UML vam omogu}ava da steknete predstavu o arhitekturi bez potrebe za pris-
tupanjem izvornom kodu same aplikacije. UML mo`ete smatrati strukturnim slojem, koji se
nalazi iznad programiranja softvera.
Pored UML-a, u svom projektnom timu mo`ete da primenjujete agilno softversko projekto-
vanje, ili neki drugi metod za strukturno projektovanje softvera. Ideja vezana za agilno projekto-
vanje softvera je kori{}enje table i razvoj sopstvenog mehanizma za komuniciranje.
Da li }ete koristiti UML, agilni softverski razvoj ili neki drugi metod strukturnog projektovan-
ja zavisi od vas i ~lanova va{eg tima. Ali, bi}e neophodno da organizujete na~in razmi{ljanja i da
primenite odre|enu strukturnu tehniku komunikacije. Ukoliko to ne uradite, razvoj va{eg soft-
vera }e kasniti, softver }e imati dosta bagova, bi}e preskup ili nekompletan. Ne ka`e se bez razlo-
ga da je dobrom organizacijom bitka skoro dobijena.
U ovom poglavlju primenjuje se pojednostavljena tehnika strukturnog projektovanja, tako da
}ete bar imati predstavu o tome kako u praksi funkcioni{e strukturno projektovanje.
Organizovanje Calculator aplikacije
Pre nego {to po~nete sa primerom u ovom poglavlju, neophodno je da nabavite papir i olovku,
ili mo`ete da koristite tablet PC za pisanje, ukoliko ga imate. Dalje, u centru papira (ili virtuelnog
papira), nacrtajte krug i u njemu napi{ite re~ Calculator. Nakon toga se zaustavite i razmislite o
tome {ta kalkulator zna~i u odnosu na softver koji `elite da kreirate. Napi{ite osnovne ideje na
papiru, u prostoru oko kruga. Na{e ideje su prikazane na slici 2.1.
28
.NET brojni i vrednosni tipovi
29
.NET brojni i vrednosni tipovi POGLAVLJE 2
SLIKA 2.1 Ideje o tome {ta treba da predstavlja Calculator aplikacija
Va{e ideje mogu se neznatno razlikovati od onih koje su prikazane na prethodnoj slici, ali ono
{to je zajedni~ko je {to sve li~i na papazjaniju. Na slici 2.1 prikazano je ono {to predstavlja najve}i
problem sa kojim se susre}u ljudi koji u~estvuju u razvoju softvera, a to je nedostatak fokusiran-
ja i organizacije. To ne zna~i da programeri ne mogu da se fokusiraju ili organizuju, ve} da su
bombardovani razli~itim informacijama, te da je herkulovski zadatak pra}enje, organizovanje i
lociranje svih neophodnih informacija. Ali, da bi softverski projekat bio uspe{an neophodno je
da se odlikuje fokusirano{}u i organizovano{}u. Zbog toga, naredni korak je da fokusirate i orga-
nizujete svoje ideje, {to }e kao rezultat dati ne{to sli~no onom {to je prikazano na slici 2.2.
SLIKA 2.2 Fokusirane i organizovane ideje
Na slici 2.2 ideje su organizovane tako {to su klasifikovane u odgovaraju}e grupe. Po{to je ovo
knjiga o programskoj jeziku, jedine relevantne ideje vezane su za funkcionalnosti izvornog koda.
Uop{teno re~eno, u kategoriji izvornog koda, svaka ideja odgovara odre|enoj funkcionalnosti
koju je neophodno implementirati.
.NET brojni i vrednosni tipovi POGLAVLJE 2
Preciziranje ideja vezanih za Calculator aplikacije
Da biste implementirali odgovaraju}u funkcionalnost, neophodno je da napi{ete izvorni kod
programa, {to podrazumeva kreiranje datoteke i projekta, odnosno primenu odgovaraju}ih
tehnika programiranja. Pre nego {to pristupite implementiranju odre|enih funkcionalnosti,
neophodno je da defini{ete na~in organizovanja izvornog koda. Postoje dva nivoa ogranizovan-
ja izvornog koda:
Organizovanje na nivo datoteka: Na ovom nivou, neophodno je da defini{ete koje }ete
tipove projekata i re{enja kreirati.
Organizovanje na nivou izvornog koda: Na nivou izvornog koda organizujete prostore
naziva, defini{ete nazive klasa i ostalih identifikatora koji se primenjuju u okviru
izvornog koda.
Implementiranje kalkulatora na nivou datoteka po~inje izborom jednog od tri mogu}a tipa
projekata. Kao {to je opisano u Poglavlju 1, imate tri mogu}nosti: Windows aplikacija, konzolna
aplikacija ili biblioteka klasa.
Ukoliko biste kalkulator kreirali kao Windows aplikaciju, ona bi trebalo da izgleda onako kako
je prikazano na slici 2.3.
SLIKA 2.3 Kalkulator implementiran kao Windows aplikacija
Kalkulator implementiran kao Windows aplikacija omogu}ava korisnicima da obavljaju
izra~unavanja pritiskanjem odgovaraju}ih tastera. Da bi sabrao dva broja, korisnik treba da pri-
tisne odgovaraju}e tastere za unos prvog broja, zatim treba da pritisne taster kojim defini{e
`eljenu operaciju, nakon toga treba da unese drugi broj i, kona~no, da pritisne taster na kome je
prikazan znak jednako. Znak jednako je signal aplikaciji da je neophodno da odredi vrednost
prethodnog izraza na osnovu unetih podataka, odnosno da generi{e rezultat. Nakon toga,
neophodno je da se prika`e rezultat u polju za prikazivanje teksta.
Drugi izbor vezan je za implementiranje kalkulatora kao konzolne aplikacije, pri ~emu bi se
brojevi unosili kao tekst, {to je prikazano na slici 2.4.
30
31
.NET brojni i vrednosni tipovi POGLAVLJE 2
SLIKA 2.4 Kalkulator implementiran u obliku konzolne aplikacije
Ukoliko kalkulator implementirate u obliku konzolne aplikacije, korisnici ne moraju da pri-
tiskaju tastere kako bi uneli odgovaraju}e operande; umesto toga, oni treba da pritiskaju odgo-
varaju}e tastere na tastaturi kako bi uneli odgovaraju}u vrednost u odre|enom trenutku, odnos-
no izvr{ili odgovaraju}u operaciju. Tipi~no, Enter taster se koristi kao taster jednako, odnosno za
izra~unavanje odgovaraju}e operacije, ~iji se rezultat prikazuje u komandnom prozoru. Nakon
{to se izvr{i odre|eno izra~unavanje, ponavlja se ciklus izra~unavanja.
Interakcija korisnika sa prethodno opisanim tipovima aplikacija je drasti~no razli~ita, i
podrazumeva kreiranje dva razli~ita programa, iako se implementiraju identi~ne funkcionalnosti.
Fokus nije na kreiranju konkretnog tipa programa, ve} na kreiranju celokupne programske strukture.
Ukoliko biste birali izme|u Windows i konzolne aplikacije za kalkulator, verovatno biste
izabrali Windows aplikaciju, po{to izgleda bolje, a i jednostavnije je kori{}enje takve aplikacije.
Na osnovu onoga {to je prikazano na slici 2.2, jednostavnost nije navedena kao `eljena karakter-
istika aplikacije. Mo`e li tip korisni~kog interfejsa da bude jedna od karakteristika aplikacije?
Naravno da mo`e, ali u kontekstu ovog poglavlja, to nije od interesa.
Vratimo se jedan korak unazad, i razmotrimo apstraktno ono {to je navedeno u prethodnom
odeljku. Vi ste programer, i pla}eni ste za implementiranje kalkulatora za oba tipa korisni~kog
interfejsa. Apstraktno gledano, da li je neophodno da jedne iste funkcionalnosti implementirate
dva puta, ili biste mogli da razmislite o tome da neke delove kalkulatora koristite u obe aplikaci-
je, koje se razlikuju u korisni~kom interfejsu? Najverovatnije }e va{ odgovor biti takav da `elite
da koristite vi{e puta delove koda kalkulatora, kako biste smanjili neophodan rad. Ali, tako|e,
veoma je va`no da vi{e puta koristite delove tako da izbegnete probleme vezane za dodatno
odr`avanje i pro{irivanje programa.
Dakle, kada se radi u razvoju softvera, neophodno je da razmi{ljate o pojedinim elementima
koji ~ine va{ program. Neke elemente mo`ete da koristite vi{e puta, a neke druge elemente ne
mo`ete. Zbog toga, neophodno je da Calculator aplikaciju razmatrate iz dva dela: korisni~ki
interfejs aplikacije i deo koji omogu}ava izvr{avanje izra~unavanja zasnovanih na podacima koje
korisnik unosi pomo}u korisni~kog interfejsa. Sa stanovi{ta organizacije, ili programerskim
jezikom re~eno, sa stanovi{ta arhitekture aplikacije, delovi Calculator aplikacije bi}e organizo-
vani onako kako je prikazano na slici 2.5.
Rezultati izra~unavanja
se prikazuju u obliku
linije teksta.
Izra~unavanja se obavljaju
odgovaranjem na niz pitanja.
.NET brojni i vrednosni tipovi POGLAVLJE 2
SLIKA 2.5 Ure|enje delova Calculator aplikacije
Pojedina~ni delovi aplikacije, prikazani na slici 2.5, nazivaju se komponente. (Neki pojedinci
ove delove nazivaju modulima, ali mi preporu~ujemo da koristite pojam komponente.)
Komponente su ure|ene tako da su funkcionalnosti ni`eg nivoa prikazane u donjem delu slike,
a funkcionalnosti vi{eg nivoa su prikazane u gornjem delu slike.
Svaka komponenta se koristi za izvr{avanje odgovaraju}eg zadatka, a komponente vi{eg nivoa pri-
menjuju one zadatke koji su implementirani na ni`em nivou. Ideja je da svaki nivo bude odgovoran
za odre|enu funkcionalnost, a da ostali nivoi ne dupliraju funkcionalnosti ponavljanjem onoga {to
je ve} prethodno implementirano. Funkcionalnost vi{eg nivoa zavisi od funkcionalnosti ni`eg nivoa,
ali funkcionalnost ni`eg nivoa ne zavisi od funkcionalnost vi{eg nivoa.
Aplikacije su realizovane kori{}enjem top-down ili bottom-up arhitekture. Top-down
metodologija podrazumeva kreiranje komponenti vi{eg nivoa, a zatim implementiranje kompo-
nenti ni`eg nivoa, onda kada je to neophodno. Nasuprot tome, bottom-up metodologija
podrazumeva kreiranje prvo komponenti ni`eg nivoa.
Bottom-up pristup je koristan onda kada jasno znate koje funkcionalnosti treba da implemen-
tirate. Top-down pristup je koristan onda kada imate grubu predstavu o tome koje je funkcional-
nosti neophodno implementirati, ali ne `elite da se previ{e udaljite od cilja same aplikacije. Cilj
ovog poglavlja je kreiranje Calculator biblioteke klasa, koja je prikazana u donjem delu slike 2.5,
pa }emo u ovom poglavlju primenjivati bottom-up pristup.
Implementiranje biblioteke klasa
Kreiranje biblioteke klasa je jedna forma organizovanja datoteka. U narednom koraku kreira}ete
izvorni kod za biblioteku klasa. Izvorni kod se implementira u dva koraka:
Definisanje klase i metoda
Implementiranje metoda
Jedan od najv}ih problema vezanih za u~enje novog programskog jezika je utvr|ivanje {ta pro-
gramskim jezikom mo`ete da uradite, a {ta ne. Ne mo`ete da pi{ete izvorni kod koji nema smis-
32
33
.NET brojni i vrednosni tipovi POGLAVLJE 2
la u odgovaraju}em programskom jeziku. Zbog toga je veoma zna~ajno da dobro poznajete pro-
gramski jezik, po{to }ete na osnovu toga struktuirati svoje ideje.
Kreira}ete dva tipa izvornog koda: izvorni kod koji organizuje i izvorni kod koji izvr{ava
odre|ene operacije. Izvorni kod koji organizuje predstavlja neku vrstu ormana sa fasciklama.
Izvorni kod koji izvr{ava odre|ene operacije predstavlja fasciklu u kojoj se nalazi odgovaraju}i
sadr`aj. Prilikom kreiranja ormana, ne vodite ra~una o sadr`aju pojedina~nih fascikli koje }e se
nalaziti u tom ormanu. Onda kada popunjavate dasciklu, vi ne razmi{ljate o ormanu.
Klase, prostori naziva i metodi su koncepti koji se koriste za organizovanje izvonog koda.
Metod sadr`i izvorni kod, a omogu}ava izvr{avanje akcija kao {to su sabiranje brojeva ili kreiran-
je tekstualnog stringa.
Ono o ~emu morate da vodite ra~una prilikom kreiranja izvornog koda metoda je kori{}enje
drugih delova organizovanog izvornog koda putem referenciranja. Referenciranje prestavlja isto
{to i lepljiva napomena na kojoj se nalazi "Molimo vas da pogledate sadr`aj fascikle B".
Slede}i deo izvornog koda je 100% organizovan, ali se njime ne izvr{ava nijedna operacija.
namespace MyMainTypes {
static class AType {
public static void DoSomething() { }
}
}
namespace MyOtherMainTypes {
static class AnotherType {
public static void DoSomething() { }
}
}
Izvorni kod sadr`i tri nivoa organizacije. Prostor naziva (MyMainTypes i MyOtherMainTypes u
prethodnom primeru) enkapsulira tipove kao {to su klase (AType i AnotherType u prethodnom
primeru). Klase enkapsuliraju metode (DoSomething u prethodnom primeru) ili svojstva. U
okviru prostora naziva, svi tipovi moraju biti jedinstveni. Vi mo`ete da imate dva tipa sa istim
identifikatorom u razli~itim prostorima naziva. U okviru jednog tipa, ne mo`ete da imate iden-
ti~ne indentifikatore sa identi~nim parametrima. (Ovo }e biti mnogo jasnije onda kada budete
nau~ili ne{to vi{e o programskom jeziku C# u toku narednih poglavlja.)
U slede}em primeru prikazana je identi~na organizacija koda sa odgovaraju}im izvornim
kodom (koji je prikazan podebljanim slovima).
namespace MyMainTypes {
static class AType {
public static void DoSomething() { }
}
}
namespace MyOtherMainTypes {
static class AnotherType {
public static void DoSomething() {
MyMainTypes.AType.DoSomething();
}
}
}
.NET brojni i vrednosni tipovi POGLAVLJE 2
U kodu koji je ozna~en podebljanim slovima, postoji referenca na drugi prostor naziva, tip i
metod sa parom zagrada. To se naziva izvr{avanje poziva metoda stati~ke klase i stati~kog meto-
da. U ovom primeru je implementiranje metoda zapravo pozivanje nekog drugog metoda.
Uo~ite na~in na koji je drugi metod referenciran kori{}enjem prostora naziva i identifikatora tipa.
To je na~in na koji se referenciraju svi tipovi i metodi. Identifikator prostora naziva je neophodan
samo onda kada tip (na primer, klasa) nije definisan u trenutno kori{}enom prostoru naziva.
Ukoliko imate previ{e duge prostore naziva, prethodno opisano referenciranje mo`e biti
veoma naporno. Alternativno re{enje je da dodate using naredbu za referenciranje prostora nazi-
va, kao {to je prikazano u slede}em primeru.
using MyMainTypes;
namespace MyOtherMainTypes {
static class AnotherType {
public static void DoSomething() {
AType.DoSomething();
}
}
}
Using naredbom se defini{e da se, ukoliko se u kodu referencira bilo koji tip koji nije lokalno
definisan, analizira prostor naziva (MyMainTypes u prethodnom primeru) kako bi se prona{ao
neophodan tip. Obratite pa`nju na to da kori{}enje dva prostora naziva, koji sadr`e isto nazvane
tipove, prilikom referenciranja tih tipova dovode do gre{ke prilikom prevo|enja, po{to kompa-
jler ne mo`e da utvrdi koji tip se zapravo referencira.
Ovo predstavlja su{tinu pisanja koda, tako da mo`emo da pristupimo pisanju koda kojim se
implementiraju odgovaraju}e funkcionalnosti.
Pisanje Add() metoda
Pristupi}emo pisanju koda za sabiranje dva broja. Da biste imali mogu}nost da pi{ete kod,
neophodno je da kreirate novi Visual C# projekat na slede}i na~in:
1. Pristupite Visual C# okru`enju (ukoliko ste ve} prethodno pristupili Visual C#
okru`enju, izaberite FileClose Solution stavku menija, kako biste zatvorili prethodno
re{enje).
2. Izaberite FileNew Project stavku menija ili Create: Project opciju.
3. Izaberite Class Library tip projekta, dodelite mu naziv Calculator, a zatim pritisnite
taster OK.
4. Datoteku Class1.cs preimenujte u Calculator.cs.
5. Snimite kreirano re{enje.
Sada }emo pristupiti kreiranju Add() metoda. U Calculator.cs datoteku dodajte kod prikazan
podebljanim slovima.
using System;
using System.Collections.Generic;
using System.Text;
namespace Calculator
34
35
.NET brojni i vrednosni tipovi POGLAVLJE 2
{
public class Calculator
{
}
public class Operations
{
public static int Add(int number1, int number2)
{
return number1 + number2;
}
}
}
Na slici 2.6 prikazani su razli~iti delovi Add() metoda, tako da mo`ete da vidite koji deo meto-
da ima koju namenu.
SLIKA 2.6 Detaljan opis operacije sabiranja
U izvornom kodu, parametri se koriste za specificiranje ulaznih podataka. Svaki parametar
predstavlja jedan od brojeva koji }e se koristiti u operaciji sabiranja.
U deklaraciji Add() metoda, povratni parametar je identifikator int, {to predstavlja celobrojni
tip podataka. Metodi i parametri moraju da imaju asociran odgovaraju}i tip podataka, po{to je
C# programski jezik u kome se eksplicitno defini{u tpovi podataka. To zna~i da, prilikom pisan-
ja koda, znate ta~no tipove podataka koje koristite.
Pretpostavimo da vi pi{ete kod i da ste suo~eni sa brojevima 1, 1.0 i "1.0". Za vas, ovi brojevi
su identi~ni. Ali, u kontekstu izvornog koda, to nije tako. 1 je ceo broj, 1.0 je realan broj
dvostruke preciznosti, dok je "1.0" string (niz karaktera). Ukoliko biste `eleli da izvr{ite operaci-
ju sabiranja, oduzimanja, ili na neki drugi na~in `eleli da manipuli{ete podacima, svi podaci bi
morali da budu istog tipa; u suprotnom, mo`e do}i do odgovaraju}ih gre{aka prilikom izvr{avan-
ja programa. Programski jezici sa eksplicitnom definicijom tipova podataka vam poma`u da
.NET brojni i vrednosni tipovi POGLAVLJE 2
izbegnete prethodno opisane probleme. .NET brojni tipovi su detaljno opisani u odeljku
"Razumevanje CLR numeri~kih tipova", kasnije u toku ovog poglavlja.
Na osnovu deklaracije Add() metoda mo`e se zaklju~iti da je neophodno da prosledite dve
celobrojne vrednosti, a da metod na osnovu toga vra}a celobrojnu vrednost. Lista parametara i
povratni tip defini{u specifikaciju metoda. Specifikacija metoda postaje zna~ajna onda kada je
neophodno da u drugim delovima koda pozivate Add() metod. U tim delovima koda neophod-
no je da se koriste isti tipovi, koji su navedeni u deklaraciji metoda.
Na slici 2.7 prikazan je deo koda u kome se poziva Add()metod, a koji predstavlja deo aplikaci-
je koju }emo kreirati u narednom odeljku.
SLIKA 2.7 Add() metod se izvr{ava referenciranjem prostora naziva i klase u kojoj je definisan metod.
Ta~ka se koristi za izdvajanje razli~itih identifikatora.
Prilikom pozivanja metoda neophodno je uraditi slede}e:
Referencirati ispravnu kombinaciju identifikatora prostora naziva, klase i metoda.
Proslediti podatke odgovaraju}eg tipa, definisanog na osnovu specifikacije metoda.
U prethodnom primeru, sabiranje brojeva 1 i 2 kao rezultat daje vrednost 3, tako da promenlji-
va total treba da sadr`i vrednost 3 (znak jednakosti zapravo omogu}ava dodeljivanje vrednosti,
koju vra}a metod promenljivoj sa leve strane znaka jednakosti). Rekli smo "treba da sadr`i vred-
nost", po{to prilikom pisanja koda, nikad ne mo`ete biti stoprocentno sigurni u to. Ponekad }e
kod koji pi{ete biti pogre{an zbog toga {to ste ne{to prevideli, ili zbog toga {to ste zaboravili da
referencirate ne{to.
Pogledajte kod kojim se poziva metod, a zatim upitajte sami sebe koliko ste sigurni da }ete
izvr{avanjem Add() metoda, uz kori{}enje vrednosti 1 i 2, dobiti rezultat 3. Odgovor je da, sa
stanovi{ta onoga ko koristi metod, nikada ne mo`ete sa sigurno{}u da tvrdite da }e total
promenljiva imati vrednost 3. To {to je neka kutija ozna~ena sa "Posu|e", ne zna~i da se posu|e
zaista nalazi u toj kutiji. Sli~no, u izvornom kodu, neophodno je da pogledate na koji na~in je
implementiran Add() metod, kako biste u potpunosti bili sigurni u to koju vrednost }e imati total
promenljiva nakon izvr{avanja ovog metoda.
U toku razvoja softvera, stalno pristupanje implementiranom kodu u cilju provere da li se sve
odvija na predvi|eni na~in nije zgodno re{enje, po{to bi za to bilo neophodno previ{e vremena,
36
37
.NET brojni i vrednosni tipovi POGLAVLJE 2
a sam postupak nije u potpunosti pouzdan. Jedino realno re{enje je da napi{ete kod koji }e
omogu}iti testiranje.
Pisanje koda za testiranje Add() metoda
Kod za testiranje je zapravo kod koji poziva metod, prosle|uju}i mu odgovaraju}e ciljane vred-
nosti parametara, sa ciljem da se dobiju `eljeni rezultati izvr{avanja. Ukoliko se ne dobije `eljeni
rezultat, to zna~i da se javila odgovaraju}a gre{ka u implementaciji metoda. Na slici 2.8 prikazan
je primer koda za testiranje operacije definisane Add() metodom (ovo }emo ne{to kasnije dodati
u sam projekat).
SLIKA 2.8 Testiranje Add() metoda
Kod na osnovu koga se testira metod veoma je sli~an kodu koji ste imali priliku da vidite u
prethodnom odeljku. Razlika se ogleda u tome {to kod za testiranje koristi ciljane promenljive i vred-
nosti, dok prethodno kreirani kod sadr`i proizvoljne promenljive i vrednosti. Jo{ jedan va`an zahtev
koji mora da ispuni kod za tesitranje je provera rezultata koje vra}a metod, na osnovu unetih ciljanih
vrednosti. If naredba se koristi za proveru da li je vrednost promenljive total jednaka 3.
Prilikom pisanja koda za testiranje, na~in na koji se koristi Add() metod mora biti identi~an
na~inu na koji se ovaj metod koristi u konzolnoj ili Windows aplikaciji. U suprotnom, rezultat
testiranja }e biti identi~an rezultatu testiranja zimske gume u sredi{tu pustinje Sahare - zabavno,
ali irelevantno.
Kod za verifikaciju u testu je na odre|eni na~in specifi~an. Da li verifikujete odgovor u toku
proizvodnje? Odgovor je - verovatno. Ukoliko pi{ete verifikacioni kod u scenariju za testiranje, vi
poku{avate da obuhvatite sve mogu}nosti. Ukoliko pi{ete verifikacioni kod u produkcionom sce-
nariju, defini{ete op{ti postupak testiranja. Na primer, mo`ete da utvr|ujete ima li smisla koris-
titi neki tip podataka ili {ta }e se dogoditi ukoliko neki od podataka ne postoji.
Jo{ jedno pitanje, koje je vezano za samo testiranje, je trenutak obavljanja testa. Da li da
kreirate testove pre ili nakon implementiranja Add() metoda? Da biste u potpunosti razumeli
problemantiku, zamislite proizvodnju jedne gume. Da li biste definisali testove za gumu pre ili
.NET brojni i vrednosni tipovi POGLAVLJE 2
nakon zavr{etka proizvodnje gume? Naj~e{}e je odgovor pre, u toku i nakon zavr{etka proizvod-
nje. Ovo je veoma va`na pretpostavka prilikom razvoja softvera. Testovi se kreiraju pre, u toku i
nakon implementacije, na slede}i na~in:
Testove kreirate pre implementiranja Add() metoda da biste imali predstavu o tome
koje prostore naziva, klase i metode }ete definisati. Definicija razli~itih elemenata daje
projektantu ideju o tome na koji na~in }e se elementi koristiti.
Testove kreirate u toku implementacije Add() metoda da biste proverili da li izvorni
kod, koji implementirate, zapravo daje `eljene rezultate.
Testove kreirate nakon implementacije Add() metoda kao kona~nu proveru da ste u
toku implementacije sve uradili onako kako je neophodno i dobili `eljene rezultate.
Dodavanje Test projekta u postoje}e re{enje
Prilikom pisanja rutina za testiranje, neophodno je da organizujete izvorni kod, a to podrazume-
va identifikovanje projekta u koji se dodaju testovi. Kada se radi o Calculator aplikaciji, mogli
biste da postavite rutine za testiranje u Calculator biblioteku klasa. Me|utim, to nije ispravan
pristup, zbog toga {to se biblioteka klasa distribuira, odnosno {to se menja ispravan kontekst u
kome se obavlja testiranje. Zapamtite da rutine testiranja moraju da budu identi~ne sa na~inom
na koji se koristi odogovaraju}i kod koji se testira. Zbog toga je prava lokacija rutina za testiran-
je zapravo aplikacija ~iji se metodi testiraju.
Idealan pristup je kreiranje druge aplikacije, koja predstavlja testove. Na slici 2.5 ilustrovano je
kako Windows i konzolna aplikacija treba da koriste Calculator biblioteku klasa. Na slici 2.9
dodata je konzolna aplikacija za testiranje, koja tako|e koristi prethodno pomenutu biblioteku
klasa.
SLIKA 2.9 Dodavanje konzolne aplikacije za testiranje, aplikacije sa ograni~enom funkcionalno{}u
koristi se za proveru funkcionalnosti Calculator biblioteke klasa
Konzolna aplikacija za testiranje je sli~na konzolnoj aplikaciji, koju ste kreirali u Poglavlju 1, a
ona referencira Calculator biblioteku klasa. Oba projekta treba da budu deo Calculator re{enja.
Sada dodajte TestCalculator projekat u Calculator re{enje. Ne zaboravite da dodate referen-
cu za Calculator biblioteku klasa (desnim tasterom mi{a pritisnite References, a zatim u meniju
izaberite Add ReferenceProjectCalculator stavku). Ne zaboravite da TestCalculatorpostavite
kao inicijalni projekat za potrebe otkrivanja i uklanjanja gre{aka. Na slici 2.10 prikazani su
TestCalculator i Calculator projekti u Solution Explorer prozoru.
38
39
.NET brojni i vrednosni tipovi POGLAVLJE 2
SLIKA 2.10 U Solution Explorer prozoru prikazana je konzolna aplikacija za testiranje i Calculator
biblioteka klasa.
Testiranje jednostavnog sabiranja
U Program.cs datoteku dodajte kod prikazan podebljanim slovima, kako biste u konzolnom pro-
jektu za testiranje proverili sabiranje brojeva 1 i 2:
namespace TestCalculator {
class Program {
public static void TestSimpleAddition() {
int total = Calculator.Operations.Add(1,2);
if (total !=3) {
Console.WriteLine ("Oops 1 and 2 does not equal 3");
}
}
static void Main(string[] args){
TestSimpleAddition();
}
}
}
Pritisnite Ctrl+F5 kombinaciju tastera, kako biste testirali izra~unavanje. Prilikom izvr{avanja
programa, konzolna aplikacija za testiranje poziva TestSimpleAddition() metod za testiranje,
koji poziva i proverava funkcionalnost Calculator biblioteke klasa.
N A P O M E N A :
Metod Main() defini{e po~etak izvr{avanja projekta. Da bi aplikacija mogla da funkcioni{e, neophodo je da
toj aplikaciji dodate kod Main() metoda.
Da biste videli {ta se de{ava onda kada test ne pro|e, promenite Add() metod na slede}i na~in:
public static int Add(int number1, int number2)
{
return number1 * number2;
}
Prilikom ponovnog izvr{avanja programa, javlja se poruka o pojavi gre{ke.
Razvojni ciklus
U prethodnom delu ovog poglavlja, imali ste priliku da koristite tri dela koda:
Kodni segment kojim se implementira Add() metod, a on predstavlja komponentu koja
izvr{ava neophodnu operaciju izra~unavanja.
Kod pomo}u koga se poziva metod, koji mo`e biti Windows ili konzolna aplikacija, a koji se
smatra produkcionim kodom.
Kod koji sadr`i produkcioni kod sa nekim verifikacionim rutinama, koji zapravo predstavlja
kod za testiranje. Kod za testiranje je veoma zna~ajan po{to, ukoliko se promeni
implementacija komponente, vi morate ponovo da izvr{ite samo kod za testiranje, kako biste
se uverili da sve funkcioni{e onako kako vi to `elite.
Pomo}u ova tri dela koda demonstriran je celokupan razvojni ciklus softvera.
Testiranje sabiranja dva veoma velika broja
Kod i projekti su organizovani na `eljeni na~in, ali nam nedostaju odre|eni testovi. Trenutno
dostupan je samo test za sabiranje dva jednostavna broja. Doda}emo jo{ jedan test, u kome }emo
sabirati dva veoma velika broja, kao {to su 2 milijarde i 2 milijarde.
Kod za testiranje operacije sabiranja dva veoma velika broja prikazan je na slici 2.11. Dodajte
ovaj kod u Program.cs datoteku, koja se nalazi u TestCalculator projektu.
.NET brojni i vrednosni tipovi POGLAVLJE 2
40
41
.NET brojni i vrednosni tipovi POGLAVLJE 2
SLIKA 2.11 Testiranje sabiranja dva velika broja
Test kojim se proverava rezultat izvr{avanja operacije sabiranja velikih brojeva je identi~an
testu kojim se proverava rezultat izvr{avanja operacije sabiranja malih brojeva, osim samih bro-
jeva kao argumenata. Poruka o pojavi gre{ke se generi{e malo druga~ije u odnosu na prethodni
primer, jer se primenjuje tehnika nadovezivanja (konkatenacije). U primeru, string se nadovezu-
je sa celim brojem u obliku stringa. Programski jezik C# }e automatski konvertovati ceo broj u
odgovaraju}i string.
^esto }ete pisati testove u kojima je jedina realna razlika u odnosu na kod koji se testira vred-
nost parametara, a ne i njihov tip. Smatrate li da ima velike razlike izme|u sabiranja dva velika
broja (kao {to su dve milijarde i dve milijarde) i sabiranja dva manja broja (kao {to su dva i dva)?
Ne, po{to se za ljude razlika ogleda samo u odre|enom broju nula; da li je rezultat ~etiri mili-
jarde ili ~etiri, to izgleda da nema razlike. Ali, kada se radi o izvr{avanju operacija na ra~unarima,
postoji drasti~na razlika izme|u ~etiri milijarde i ~etiri, {to }ete uskoro imati priliku da vidite.
Pre nego {to izvr{ite odgovaraju}i test, neophodno je da dodate poziv metoda u Main() metod:
static void Main(string[] args)
{
TestSimpleAddition();
TestReallyBigNumbers();
}
Sada mo`ete da izvr{ite test sa veoma velikim brojevima. Dobi}ete slede}i rezultat:
Error found(-294967296) should have been (4869586958695)
Generisani rezultat ukazuje na to da se pojavila gre{ka, odnosno da sabiranjem 2 milijarde i 2
milijarde dobijate kao rezultat vrednost -294967296, {to nema nekog smisla. [ta se dogodilo?
Problem je u tome {to ste prilikom deklarisanja Add() metoda upotrebili brojni tip int.
.NET brojni i vrednosni tipovi POGLAVLJE 2
Problemi sa brojnim tipovima podataka
Ono {to vi smatrate pod brojevima i ono {to ra~unar smatra pod brojevima su dve potpuno
razli~ite stvari. Kao dete, vi ste u~ili da brojite od 1 do 100, {to je za vas tada bio ogroman broj.
Kako ste rasli, nau~uili ste da postoji i broj nula, kao i brojevi manji od nule. Kasnije, nau~ili ste
da postoje razlomci i decimalne vrednosti.
U toku ovog procesa u~enja razli~itih brojeva, vi ste uvek broj 1 i broj 1.5 tretirali na istovetan na~in
- odnosno, to su za vas bili brojevi. Me|utim, za ra~unar ovi brojevi nisu vrednosti istog tipa.
Razlog zbog koga se brojevi druga~ije tretiraju od strane ra~unara vezan je za efikasnost
ra~unara i na~in na koji se brojevi sme{taju unutar ra~unara. Kada se radi o dekadnom pozi-
cionom brojnom sistemu, po~injete brojanje od 0, nastavljate do 9, a zatim je slede}i broj
ozna~en sa 10. Dekadni brojni sistem su inicijalno definisali Vavilonci, ali su oni umesto
dekadnog koristili seksadecimalni sistem (60 jedinstvenih identifikatora, umesto 10 jedinstvenih
identifikatora u dekadnom brojnom sistemu). Ra~unar ima sli~nu {emu brojanja, osim {to se
koristi binarni brojni sistem sa samo dva jedinstvena identifikatora: 1 i 0. Ra~unari koriste samo
dva jedinstvena identifikatora, po{to su njima ozna~ena dva jedinstvena stanja: on i off stanje. U
srcu ra~unara je tranzistor koji ima mogu}nost da razlikuje on i off stanje, odosno ne postoje
razli~ite varijante ova dva stanja.
Na slici 2.12 prikazan je primer kako ra~unar broji do 7 kori{}enjem binarnog brojnog sistema.
SLIKA 2.12 Na koji na~in ra~unar broji do 7.
Teoretski, mogli biste da brojite do smrti. Imate tu mogu}nost, po{to ne postoji nikakvo
ograni~enje u dekadnom brojnom sistemu koji koristimo. Ra~unar poseduje odgovaraju}e
ograni~enje, kao {to je veli~ina memorije sa slobodnim pristupom (randomaccess memory,
RAM), disk ra~unara i sli~no. Specifi~ni numeri~ki tipovi podataka na ra~unaru tako|e sadr`e
odgovaraju}a ograni~enja, vezana za opseg brojava koje mogu da predstavljaju. Na primer, celo-
brojni (int) tip podataka, koji smo koristili u prethodnom primeru, mo`e da prika`e samo
odre|ene brojeve, odnosno mo`e da se koristi samo za predstavljanje celih brojeva.
Razli~iti brojni tipovi podataka su sli~ni mera~ima kilometra`e. Najve}i broj mera~a kilome-
tra`e u automobilima sadr`i ograni~enje od jednog miliona pre|enih milja/kilometara. Zamislite
{ta bi se dogodilo kada biste mera~ima kilometra`e poku{ali da saberete 900,000 i 200,000.
Rezultat bi bio 100,000, a ne 1.1 milion, kako biste o~ekivali. Ovo je upravo problem koji se javl-
ja prilikom sabiranja 2 miliona i 2 miliona u prethodnom primeru.
42
43
.NET brojni i vrednosni tipovi POGLAVLJE 2
Nezgodna karakteristika mera~a kilometra`e je da ne znate kada je dostignuta maksimalna
dozvoljena vrednost. Vi mo`ete da zavr{ite sa automobilom na ~ijem mera~u kilometra`e pi{e
100,000 milja/kilometara, ali se zapravo radi o tome da je automobil pre{ao 1.1 milion
milja/kilometara. Na sre}u, .NET mo`e da detektuje situaciju u kojoj je do{lo do prelaska dozvol-
jenog opsega kod brojnog tipa. U tehni~kom `argonu ova situacija se naziva prekora~enje ili
potkora~enje. Prekora~enje podrazumeva situaciju da mera~ kilometra`e pre|e dozvoljenu
granicu u pozitivnom smeru (900,000 do 1.1 miliona), dok potkora~enje podrazumeva situaci-
ju kada mera~ kilometra`e prekora~i granicu u negativnom smeru (0 do -100,000). Detektovanje
bilo koje od prethodnih situacija je aktivirano kao svojstvo projekta. Primenite slede}e korake za
aktiviranje detekcije prekora~enja/potkora~enja za Calculator biblioteku klasa:
1. Desnim tasterom mi{a pritisnite Calculator projekat u Calculator re{enju, a zatim
selektujte Properties stavku.
2. Pritisnite Build, a zatim pritisnite Advanced.
3. Ozna~ite opciju "Check for arithmetic overflow/underflow", kako biste testirali situaci-
je vezane za prekora~enje/potkora~enje.
4. Pritisnite taster OK, kako biste zavr{ili pode{avanje.
Ponovo startujte konzolnu aplikaciju za testiranje, i dobi}ete informaciju o pojavi izuzetka koji
je vezan za prekora~enje (izaberite da program nastavi sa radom, i nemojte da pristupite otkri-
vanju gre{aka):
Unhandled Exception: System.OverflowException: Arithmetic operation resulted
in an overflow.
Vi mo`ete da otkrijete gde se nalazi gre{ka izvr{avanjem aplikacije u re`imu otklanjanja
gre{aka. Pritisnite taster F5, a zatim }e se na ekranu prikazati ne{to sli~no onome {to je prikazano
na slici 2.13. Da biste prekinuli dalji postupak otklanjanja gre{aka, neophodno je da pritisnete
Shift+F5 kombinaciju tastera.
SLIKA 2.13 U Visual C# Express okru`enju posebno je nagla{ena gre{ka vezana za prekora~enje
dozvoljenog opsega vrednosti.
.NET brojni i vrednosni tipovi POGLAVLJE 2
Situacija vezana za prekora~enje dozvoljenog opsega vrednosti predstavlja problema, ali je
~injenica da .NET mo`e da detektuje ovu gre{ku veoma dobra za vas. Ali, na kraju, ono {to je
nama od interesa je da postoji mogu}nost da saberete 2 milijarde i 2 milijarde.
Kona~no, Bill Gates bi verovatno vi{e `eleo da ima 4 milijarde na svom ra~unu u banci, umesto
da dobije negativnu vrednost ili neku gre{ku, koja bi ukazivala da na ra~unu ne mo`e da ima
svoje 4 milijarde.
Brojni i vrednosni tipovi podataka
Tip podataka je na~in za opisivanje odgovaraju}ih podataka kori{}enjem metaopisa. Na primer, uko-
liko koristite double tip podataka, znate da }ete imati na raspolaganju broj dvostruke preciznosti.
Mnogi tipovi podataka vam stoje na raspolaganju: int, long, short, single, double, string, enum,
struct, i tako dalje. Vi mo`ete ~ak i da defini{ete sopstvene tipove podataka. Tipovi podataka su
su{tina CLR, odnosno programskog okru`enja u kome se primenjuje jako tipiziranje podataka.
Vrednosni i referencni tipovi
CLR podr`ava dva na~ina za predstavljanje podataka: na osnovu vrednosti i na osnovu reference.
Osnovna razlika izme|u vrednosnog i referencnog tipa ogleda se u na~inu na koji je sme{tena
odgovaraju}a informacija asocirana sa tipom. Problem sa vrednosnim i referencnim tipovima se
javlja zbog njihove tehni~ke prirode, i mo`e da bude veoma zbunjuju}e.
Kada CLR izvr{ava aplikaciju, nit izrv{ava Common Language Infrastructure.
(CLI). O niti mo`ete da razmi{ljate onda kada se budete {etali po gradu i kupovali stvari. Vi ste
pojedinac, i mo`ete da kupujete stvari nezavisno od drugih ljudi. U prodavnici se mo`e na}i veli-
ki broj ljudi, koji mogu da se {etaju u prodavnici i kupuju nezavisno od drugih ljudi. Na sli~an
na~in, ra~unar mo`e da izvr{ava ve}i broj niti, u okviru kojih se obavljaju zadaci nezavisno od
onoga {to se izvr{ava u drugim nitima. Ukoliko se {etate u prodavnici, mo`ete da naletite na
druge ljude i uzrokujete da im ispadnu stvari iz ruku. Dok CLR poku{ava da izbegne takve prob-
leme, ukoliko va{ izvorni kod izvr{ava veoma slo`ene operacije, vi mo`ete da uzrokujete da neke
druge niti "ispuste" odre|ena izra~unavanja.
Prilikom izvr{avanja, nit sadr`i lokalni memorijski blok, koji se naziva stek, {to je ekvivalent-
no nov~aniku koji sadr`i ke{ i kreditne kartice. Vi nosite nov~anik sa sobom, odlaze}i u razli~ite
prodavnice, a na sli~an na~in niti koriste stek prilikom izvr{avanja razli~itih metoda. Nakon {to
u|ete u odgovaraju}u prodavnicu, `elite da kupite ne{to, mo`ete da pla}ate na jedan od dva
mogu}a na~ina: kori{}enjem ke{a ili kreditne/debitne kartice. Me|utim, ukoliko koristite kredit-
nu/debitnu karticu, vi ne mo`ete da platite odmah. Tada vam je neophodna ma{ina, koja poziva
server u cilju provere da li va{ komad plastike sadr`i dovoljno novca za neophodnu kupovinu.
Pla}anje ke{om je mnogo br`e od pla}anja kreditnom karticom, po{to nije neophodno da se pris-
tupa udaljenom ra~unaru.
Pretpostavimo sada da vi i va{a supruga `elite ne{to da kupite. Mogli biste da koristite isti ra~un u
banci, ali vi imate posebne kreditne kartice. Ali, ne mo`ete da uradite isto sa ke{om. Ukoliko vi imate
nov~anicu od 10 dolara, va{a supruga ne mo`e da deli tu nov~anicu od 10 dolara sa vama. Va{a
supruga bi trebalo da ima drugu nov~anicu od 10 dolara, a onda biste imali zajedno 20 dolara.
Metodi pla}anja kreiditnom karticom i u ke{u su analogni vrednosnim i referencnim tipovima. Ke{
je analogan vrednosnom tipu, a kreiditna kartica referencnom tipu. Kada CLR izvr{ava kod, kod koji
u jednom metodu poziva neki drugi metod zapravo koristi stek koji sadr`i vrednosti promenljivih
vrednosnog tipa. Vrednosni tipovi se direktno sme{taju na stek, nalik ke{u. Referencni tipovi se
sme{taju u obliku pokaziva~a na memorijske lokacije na steku, kao {to va{a kreditna/debitna kartica
ukazuje na ke{ koji se nalazi na va{em ra~unu u banci. Pokaziva~ kod referencnih tipova ukazuje na
deo memorije, koji se naziva hip. Ovi koncepti su ilustrovani na slici 2.14.
44
45
.NET brojni i vrednosni tipovi POGLAVLJE 2
SLIKA 2.14 Stekovi koji su kreirani, odnosno interakcije sa hipom u toku CLR izvr{avanja
Kada je re~ o vrednosnim tipovima, prilikom dodeljivanja se kopira sadr`aj. Ukoliko modi-
fikujete kopiju, vrednost originala se ne}e menjati. Nasuprot tome, ukoliko menjate vrednost ref-
erencnog tipa, menja se vrednost svih pokaziva~a na taj referencni tip. Ukoliko se vratimo na
primer sa kreditnim karticama i ke{om, ukoliko imate 10 dolara, kao i va{a supruga, i vi potro{ite
8 dolara, tada to ne}e uticati na 10 dolara koje poseduje va{a supruga, {to je identi~no onome {to
se posti`e kori{}enjem modela vrednosnih tipova. Me|utim, ukoliko vi i va{a supruga imate 10
dolara na raspolaganju na kreditnoj kartici, a vi potro{ite 8 dolara, osta}e samo 2 dolara, {to je
ekvivalentno sa onim {to se posti`e kori{}enjem referencnog tipa.
Postoje situacije u kojima }ete koristiti vrednosne tipove, odnosno situacije u kojima }ete koris-
titi referencne tipove, kao {to postoje situacije u kojima pla}ate kori{}enjem ke{a, odnosno
situacije u kojima koristite kreditnu karticu. Obi~no kreditne kartice koristite prilikom pla}anja
skupocenih stvari, po{to ne `elite da nosite sa sobom velike svote novca u ke{u. To se odnosi i na
vrednosne i referencne tipove, u smislu da ne `elite da veliku koli~inu podataka dr`ite na steku.
Ukoliko znate razliku izme|u steka i hipa, automatski znate i razliku izme|u vrednosnog i ref-
erencnog tipa, po{to postoji direktna veza izme|u ovih struktura podataka i tipova podataka.
Vrednosni tipovi se obi~no sme{taju na steku, a sadr`aj referencnih tipova se sme{ta na hip.
CLR brojni tipovi
CLR sadr`i dva glavna tipa brojeva: cele brojeve i razlomljene brojeve. Oba ova tipa brojeva su
tipovi podataka zasnovani na vrednostima, kao {to je opisano u prethodnom odeljku. Metod
Add() je koristio tip int, koji predstavlja celobrojni vrednosni tip. Kao {to ste imali priliku da
vidite, celi brojevi imaju odgovaraju}a ograni~enja, na osnovu prostora za sme{tanje.
.NET brojni i vrednosni tipovi POGLAVLJE 2
Razmotrite slede}i broj:
123456
Ovaj broj sadr`i {st cifara. Ilustracije radi, zamislite da na stranici koju upravo ~itate, mo`ete da
smestite samo {est brojeva. Na osnovu ove informacije, najve}i broj koji mo`ete da napi{etena
stranici je 999,999, dok je najmanji broj jednak 0. Na sli~an na~in, specifi~ni brojni tipovi zahte-
vaju da CLR defini{e odgovaraju}a ograni~enja vezana za broj cifara koje se mogu koristiti za
prikazivanje konkretnog broja. Svaka pozicija je 1 ili 0, odnosno CLR mo`e da predstavlja bro-
jeve u binarnoj notaciji.
Ra~unari mogu da koriste binarnu notaciju, ali ljudi vi{e vole da koriste dekadne cifre, pa za
odre|ivanje najve}eg mogu}eg broja koji mo`e da se predstavi odre|enim tipom podataka, broj
2 podignite na stepen koji defini{e broj binarnih cifara za predstavljanje broja, a zatim oduzmite
1. Kada se radi o int tipu podataka, za predstavljanje broja se koriste 32 binarne cifre. Pre nego
{to izra~unate najve}i mogu}i broj koji mo`e da se predstavi pomo}u int tipa podataka, neophod-
no je da uzmete u razmatranje i negativne brojeve. Gornja granica za int nije zapravo
4,294,967,295 (rezultat operacije 2
32
- 1), po{to int tip podataka se koristi i za predstavljanje neg-
ativnih brojeva. Drugim re~ima, mo`ete da snimite negativan ceo broj, kao {to je -2.
Ra~unar koristi trik u prvoj poziciji za predstavljanje broja, jer je ta pozicija rezervisana za
definisanje znaka broja (plus ili minus). Kada se radi o int tipu, zna~i da se samo 31 pozicija
koristi za predstavljanje broja, najve}i broj koji se mo`e predstaviti je 2,147,483,647, a najmanji
-2,147,483,648. Ukoliko se vratimo na primer sa sabiranjem brojeva, to zna~i da prilikom pred-
stavljanja rezutata sabiranja, 4 milijarde, koja se predstavlja pomo}u 32 binarne pozicije, int tip
podataka ne sadr`i dovoljan broj pozicija za predstavljanje ovog rezultata.
.NET okru`enje sadr`i brojne tipove podataka, koji su predstavljeni u tabeli 2.1, a ovi tipovi
podataka se razlikuju u veli~ini raspolo`ivog prostora za predstavljanje brojeva i na~ina pred-
stavljanja brojeva. Slede}a terminologija se koristi za opisivanje brojnih tipova podataka:
Bit je osnovna jedinica memorije, a 8 bitova predstavlja jedan bajt.
Integer tipom se predstavljaju celi brojevi.
Floating-point tipovi su razlomljeni brojevi.
Ozna~i brojevi su brojevi koji sadr`e jednu binarnu poziciju za predstavljanje znaka
broja (pozitivan ili negativan).
Tabela 2.1 .NET brojni tipovi podataka
Tip Opis
byte Neozna~eni osmobitni ceo broj; najmanja vrednost je 0, a najve}a vrednost je 255.
sbyte Ozna~eni osmobitni ceo broj; najmanja vrednost je -128, a najve}a vrednost je 127.
ushort Neozna~eni {esnaestobitni ceo broj; najmanja vrednost je 0, a najve}a vrednost
je 65535.
short Ozna~eni {esnaestobitni ceo broj; najmanja vrednost je -32768, a najve}a vrednost je
32767.
uint Neozna~eni tridesetdvobitni ceo broj; najmanja vrednost je 0, a najve}a vrednost je
4294967295.
int Ozna~eni tridesetdvobitni ceo broj; najmanja vrednost je -2147483648, a najve}a
vrednost je 2147483647.
ulong Neozna~eni {ezdeset~etvorobitni ceo broj; najmanja vrednost je 0, a najve}a vrednost
je 18446744073709551615.
long Ozna~eni {ezdeset~etvorobitni ceo broj; najmanja vrednost je -9223372036854775808,
a najve}a vrednost je 9223372036854775807.
46
47
.NET brojni i vrednosni tipovi POGLAVLJE 2
Tip Opis
float Tridesetdvobitni relan broj u pokretnom zarezu; najmanja vrednost je 1.5 10 - 45, a
najve}a vrednost je 3.4 10 38, sa precizno{}u od 7 cifara.
double [ezdeset~etvorobitni realan broj u pokretnom zarezu; najmanja vrednost je 5.0 10 -
324, a najve}a vrednost je 1.7 10 308, sa precizno{}u od 15 do 16 cifara.
decimal Specijalni stodvadesetosmobitni tip podataka; najmanja vrednost je 1.0 10 -28, a
najve}a vrednost je 1.0 10 28, sa precizno{}u od najmanje 28 zna~ajnih cifaraa
decimal tip podataka se ~esto koristi za finansijske podatke, po{to ponekad izra~unavanja dovode do vred-
nosti koja je za jedan peni manja od ispravne vrednosti (na primer, 14.9999, umesto 15.00) zbog gre{ke
vezane za zaokru`ivanje.
Po{to postoji veliki broj tipova podataka koje mo`ete da koristite, mo`da se pitate kada koji
tip podataka treba da se koristi. Brz odgovor je da to zavisi od va{ih potreba. Prilikom izvr{avan-
ja nau~nih izra~unavanja, verovatno }e biti neophodno da koristite double ili float tip podataka.
Ukoliko izra~unavate hipoteke, verovatno treba da koristite decimal tip podataka. A ukoliko
izvr{avate izra~unavanja nad skupovima, verovatno biste koristili int ili long tip podataka. Sve
zavisi od toga koliko precizno `elite da bude izra~unavanje, odnosno koliku numeri~ku pre-
ciznost `elite.
Numeri~ka preciznost je veoma zna~ajna tema, i va`nost preciznosti ne smete nikako da
potcenite. Razmotrimo slede}i primer: svaka zemlja obavlja popis stanovni{tva, a nakon
zavr{etka popisa, mogu da se izvuku odre|eni rezultati. Na primer, u Kanadi, 31% ljudi je razve-
deno. Kanada ima populacioni sat koji defini{e da svaki minut i 32 sekunde se rodi po jedno
dete. U trenutku pisanja ove knjige, Kanada je imala 32,789,736 stanovnika. Dakle, u trenutku
pisanja ove knjige 10,164,818 ljudi je bilo razvedeno. Razmislite malo o onome {to ste upravo
pro~itali. Rekli smo da postoji direktna veza izme|u ljudi koji su razvedeni i ukupnog broja
ro|enja u Kanadi (zapravo, 31%). Mo`da }ete biti iznena|eni {to je broj ro|enja i razvoda jed-
nak 10,164,818 - ne 10,164,819 ili 10,164,820 - ljudi }e se razvoditi. Naravno, ovo je malo
cini~no re~eno, sa ciljem da se istakne ~injenica da su brojevi zokru`eni na odre|enu vrednost.
Ne mo`emo da ka`emo da }e se, recimo, 10,164,818 ljudi razvesti, po{to to nije dovoljno pre-
cizno bez odgovaraju}eg brojanja. Mo`da bismo mogli da ka`emo da }e se razvesti, recimo,
10,164,818 plus ili minus 100,000. Na ovaj na~in dobijate opseg od 10,064,818 do 10,264,818,
ili grubo govore}i, 10.2 miliona ljudi. Broj 10.2 miliona je ono {to bi novinar prikazao u
izve{taju, to je ono {to bi se navelo u literaturi, odnosno ono {to bi ve}ina ljudi koristila u kon-
verzaciji. Tako, ukoliko saberemo 10.2 miliona i 1,000, da li }e rezultat biti 10,201,000? Vrednost
10.2 je zaokru`ena vrednost na najbli`i deseti deo miliona, a dodavanje hiljade podrazumeva
dodavanje broja koji je mnogo manji od broja na koji se zaokru`uje. Odgovor je da ne mo`ete
da dodate 1,000 na 10.2 miliona, po{to je 1,000 mnogo manje u odnosu na broj 10.2 miliona.
Ali, vi mo`ete da dodate 1,000 na 10,164,818, kako biste dobili 10,165,818, po{to je najzna~ajni-
ja vrednost ceo broj.
Ako se vratimo na brojne tipove, to zna~i da celobrojni tipovi imaju ta~nost od jednog celog
boja. Dodavanje 1.5 i 1.5 kao celih brojeva daje kao rezultat 2, {to je prikazano na slici 2.15.
.NET brojni i vrednosni tipovi POGLAVLJE 2
SLIKA 2.15 Dodavanje razlomljenih brojeva kori{}enjem int tipa podataka
Ovaj koncept zna~ajnih cifara mo`ete da pro{irite na brojni tip kojim se predstavljaju relani
brojevi u pokretnom zarezu, float, pa mo`ete da razmotrite primer koji je prikazan na slici 2.16.
SLIKA 2.16 Sabiranje razlomljenih brojeva kori{}enjem float tipa podataka
Kao {to je prikazano na slici 2.16, ukoliko `elite da o~uvate preciznost prilikom dodavanja
malog broja velikom broju, neophodno je da koristite double tip podataka. Ali, ~ak i double tip
48
49
.NET brojni i vrednosni tipovi POGLAVLJE 2
podataka ima odgovaraju}a ograni~enja, odnosno preciznost je ograni~ena na 15 do 16 dekad-
nih cifara.
Ukoliko vam ni ovo nije dovoljna preciznost, mo`ete da koristiite decimal tip podataka, ali je
decimal pogodniji za finansijska izra~unavanja. Kada se radi o finansijskim izra~unavanjima,
ima}ete problem prilikom sabiranja velikih i malih brojeva. Zamislite da ste Bill Gates, i da na
ra~unu u banci imate nekoliko milijardi dolara. Kada banka ra~una kamatu, `ele}ete da znate
koliko centi ste zaradili, {to u nekom du`em vremenskom periodu mo`e da bude poprili~na
svota. Zapravo, neki programeri su "krali" novac od banaka sakupljanjem delova centa i njihovim
akumuliranjem.
Po{to smo opisali odre|ene probleme sa kojima se mo`ete susresti prilikom kori{}enja broje-
va u svojim aplikacijama, mo`emo da nastavimo sa kreiranjem kalkulatora.
Zavr{avanje Calculator aplikacije
Originalna deklaracija Add() metoda za kalkulator je funkcionisala, ali je imala odre|ena
ograni~enja vezana za brojeve koji se mogu sabirati. Da biste zavr{ili kalkulator, neophodno je
da deklari{ete Add() metod kori{}enjem drugog tipa podataka, a zatim da dodate preostale
operacije. Za deklarisanje Add() metoda mogli bismo da koristimo jedan od tri tipa:
long: re{ava problem sabiranja dva veoma velika broja, kao {to su 2 milijarde, ali pos-
toji problem da ne mo`ete da saberete dva razlomka, kao {to su 1.5 i 1.5.
double: re{ava problem sabiranja veoma velikih brojeva ili veoma malih brojeva, a
mo`e se primenjivati prilikom sabiranja razlomljenih brojeva. Uop{teno govore}i,
double tip je veoma dobar izbor, ali se mo`e javiti problem zna~ajnih cifara, ukoliko
sabirate veoma veliki i veoma mali broj.
decimal: generalno dobar pristup, i pogodan za sve tipove preciznosti, ali se odlikuje
veoma malom brzinom prilikom sabiranja, oduzimanja ili izvr{avanja nekih drugih
matemati~kih operacija.
Najjednostavniji, op{te prihva}eni tip me|u brojnim tipovima podataka je double, po{to
obezbe|uje dovoljnu preciznost, a relativno je jednostavan. Celokupna implementacija kalkula-
tora je prikazana slede}im kodom:
public class Operations {
public static double Add(double number1, double numer2) {
return number1 + number2;
}
public static double Subtract(double number1, double number2) {
return number1 - number2;
}
public static double Divide(double number1, double number2) {
return number1 / number2;
}
public static double Multiply(double number1, double number2) {
return number1 * number2;
}
}
.NET brojni i vrednosni tipovi POGLAVLJE 2
^etiri operacije prikazane su pomo}u metoda sa razli~itim identifikatorima, ali identi~nim opi-
som funkcije, ~ime je pojednostavljen postupak primene svakog pojedina~nog metoda. Svaka od
operacija mo`e da ima odgovaraju}i skup testova, na osnovu kojih se proverava ispravnost imple-
mentacije. Testovi ovde nisu prikazani, ali su implementirani u prilo`enom izvornom kodu
primera. Preporu~ujemo da pogledate ove testove, kako biste se uverili da razumete svaki pojed-
ina~ni deo koda.
Ono {to je neophodno da zapamtite
U ovom poglavlju ste nau~ili kako se razvija biblioteka klasa, koja se koristi za izvr{avanje
odre|enih izra~unavanja.
Neophodno je da zamaptite slede}e:
Organizovanje va{ih ideja, projekata i funkcionalnosti je od velike koristi prilikom
kreiranja softvera.
Prilikom kreiranja softvera, uvek budite fokusirani na odre|ene rezultate. Veoma jed-
nostavno se mo`e dogoditi da krenete pogre{nim putem prilikom razvoja softvera,
po{to je sam razvoj softvera veoma specifi~an. Uspe{an projektant uvek mora da bude
organizovan i fokusiran.
Softver se projektuje kori{}enjem odgovaraju}e arhitekture, koja mo`e da bude imple-
mentirana kori{}enjem top-down ili bottom-up metoda razvoja.
U okviru arhitekture, pojedina~ni delovi se nazivaju komponente, a komponente se
uklapaju tako da se kreira kompletna aplikacija.
Testove kreirate zato {to ne mo`ete u potpunosti da proverite funkcionalnost kompo-
nente na osnovu identifikatora, parametara ili povratne vrednosti.
Prilikom implementiranja komponenti, vi razvijate testove pre, za vreme i nakon
pisanja izvornog koda odre|ene komponente.
Test je deo izvornog koda, koji se koristi za pozivanje komponente kori{}enjem ta~no
izabranih ulaznih podataka, a rezultati izra~unavanja se proveravaju u odnosu na
o~ekivane rezultate izvr{avanja. Ukoliko se o~ekivani i dobijeni rezultati ne poklapaju,
to zna~i da komponenta ne funkcioni{e na `eljeni na~in.
CLR vam omogu}ava kori{}enje velikog broja razli~itih tipova podataka, a osnovna
razlika je postojanje vrednosnih i referencnih tipova.
CLR sadr`i nekoliko brojnih tipova podataka, ali svi brojni tipovi su zapravo vrednos-
ni tipovi.
Kod brojnih tipova mogu da se jave prekora~enja i potkora~enja. Neophodno je da
aktivirate odgovaraju}e pode{avanje kompajlera, kako biste se uverili da }e CLR na
pravi na~in da detektuje ove situacije.
Prilikom izbora odgovraju}eg tipa podataka, veliki deo odluke isklju~ivo zavisi od toga
koju preciznost prilikom izra~unavanja `elite da postignete.
Za samostalan rad
U ovom odeljku prikazana su pitanja vezana za ono {to ste nau~ili u ovom poglavlju:
1. Prilikom pisanja koda, na koji na~in mo`ete organizovati svoj kod? Na primer, mo`ete
li da koristite odre|ene identifikatore naziva? Mo`ete li da birate {emu kodiranja?
Mo`ete li da koristite odgovaraju}e komentare u kodu?
50
51
.NET brojni i vrednosni tipovi POGLAVLJE 2
2. U programerskoj zajednici postoji rasprava o tome da li organizovanje softvera treba
da uklju~uje formalne strukture ili treba da bude shodno potrebama. Razmislite o
tome na koji na~in bi trebalo da organizujete svoj softver.
3. Uop{teno re~eno, mo`ete li da izvr{ite testiranje komponente koja koristi bazu
podataka, kako biste utvrdili da li ta komponenta funkcioni{e na pravi na~in? Opi{ite
proces navo|enjem odre|enih faza.
4. Uop{teno re~eno, na koji na~in biste ispitivali ispravnost upisivanja podataka u odgo-
varaju}u datoteku? Da biste mogli da na pravi na~in sagledate prirodu samog proble-
ma, neophodno je da utvrdite na koji na~in operativni sistem manipuli{e datotekama.
5. Ukoliko CLR nije obezbedio mehanizam za detektovanje stanja prekora~enja ili
potkora~enja, na koji na~in biste mogli da onemogu}ite pojavu prekora~enja i potko-
ra~enja u svojim aplikacijama?
6. Za Pentium CPU (32 bita), koji tip brojeva bi omogu}io najbr`a izra~unavanja?
7. U primeru u ovom poglavlju, klasa Operations je projektovana tako da izvr{ava arit-
meti~ke operacije kori{}enjem double tipa podataka. Na koji na~in biste mogli da
promenite to, tako da izra~unavanja budu generi~ka?
52

You might also like