Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

Merni sistemi u industriji

Kratak vodič za struktuirano programiranje


Copyright: Boris Antić, FTN, 2009

Svrha ovog vodiča je da da smernice i preporuke za kvalitetno pisanje koda u


struktuiranim programskim jezicima. Pridržavanje ovim pravilima ne utiče na kvalitet
izvršnog koda već samo na kvalitet izvornog zapisa.

Veoma često, programe razvijaju timovi inženjera i programera i izvorni kod se često
prerađuje i menja od strane različitih ljudi. Takođe, dešava se da jednom napisan kod
mora nakon veoma dugog vremena od njegovog nastanka da se izmeni. Kvalitetno
napisan kod olakšava snalaženje u ovakvim situacijama i obezbđuje značajnu uštedu
vremena.

Ciljevi uvođenja standrada u pisanje izvornog koda su:

• povećanje čitljivosti;
• sprečavanje i lakše uočavanje semantičkih grešaka u programu;
• olakšavanje debagovanja;
• povećanje produktivnosti programera koji rade u timovima.

1. Dodeljivanje imena

Dodeljivanje imena je najlošije standardizovana oblast strukturiranih programskih jezika.


Ovde će biti date specifikacije za Delphi, mada neke od napomena važe i za većinu
drugih programskih paketa.

Jedan od ključnih faktora za razumevanje koda je upotreba smislenih naziva promeljivih,


konstanti, procedura i sl. Upotrebom razumljivih imena nastaje samo-dokumentujući kod,
tj. kod koji je razumljiv sam po sebi bez potrebe za pisanjem dodatnih komentara.

Primer:

Por1: Real; // porez na dohodak (primer loše dodeljenog imena)


Por2: Real; // porez na promet (primer loše dodljeneog imena)

PorezNaDohodak: Real; //komentari nisu potrebni zahvaljujuci


PorezNaPromet: Real; //razumljivosti naziva promenljivih

Za dodeljivanje imena promenljivima, procedurama i drugim elementima programa treba


koristiti pune nazive. Treba izbegavati skraćenice. Npr. treba koristiti razumljiva imena
poput «NazivFirme», «AdresaFirme» ili «SrednjeSlovo» umesto «Nfirme», «aFirme» ili
«Ss». Izbegavajte upotrebu donje crte «_» za razdvajanje reči unutar naziva kao npr.

1
«Naziv_Firme» jer ovaj karakter nepotrebno povećava dužinu imena, a ne doprinosi
boljoj čitljivosti.

Treba izbegavati imena duža od 15 karaktera jer ona smanjuju čitljivost. Npr. umesto
«PostaviDuzinuTesktaLabele» bolje je koristiti kraći naziv «PostaviDuzinu» koji je
dovoljno jasan.

Treba izbegavati imena koja su veoma slična ili se razlikuju samo u jednom karakteru.
Npr. treba izbegavati nazive kao što su «Proizvod» (promenljiva), «Proizvodi»
(promenljiva) i «Proizvedi» (procedura, naredba) u okviru jednog istog programa kako bi
se sprečila mogućnost njihovog brkanja.

Ako naziv predstavlja složenicu sastavljenu od više reči, tada se svaka reč u složenici
piše velikim slovom radi poboljšanja čitljivosti. Npr. «SetBrushColor» je mnogo čitljivije
od «setbrushcolor». U zavisnosti od konkretnog jezika u kome se programira, postoje
različite konvencije o tome da li početno slovo naziva treba biti veliko ili malo. Prema
konvenciji usvojenoj u Delphi-u sva početna slova naziva promeljivih, tipova, klasa,
objekata, propertija, procedura, funkcija, metoda i događaja pišu se velikim slovom (npr.
«MojBroj», «Real», «Form1», «TPanel», «Font.Name», «SetLength», «OnMouseClick»
itd.), dok se konstatne i sve službene reči pišu malim početnim slovom (npr. «mtError»,
«clRed», «begin», «end», «for» «string»1 i sl.).

1.1. Dodeljivanje imena promenljivama

Svrha dodeljivanja smislenih imena promenljivama jeste omogućavanje njihovog


razlikovanja od drugih tipova podataka. Osnovno pravilo je da se izbegavaju generička
imena poput «Broj» ili «Slovo» jer je njihova namena nejasna.

Za razliku od većine drugih struktuiranih programskih jezika, Delphi preporučuje da se


nazivi promenljivih pišu velikim početnim slovom. Java, C, C++, PHP i neki drugi jezici
koriste mala pocetna slova za nazive svih promenljivih i svih funkcija.

Za nizove je poželjno koristiti imena u množini. Npr. «RezultatiMerenja» umesto


«RezultatMerenja», odnosno «Rezultati[0]» umesto «Rezultat[0]»

Izuzeci od gornjih pravila su nazivi promeljivih koje se koriste u petljama. Ovi nazivi
treba da budu što kraći jer se koriste često, a smisao im je apstraktan, pa ne utiču na
razumljivost koda. Primeri su «I», «J», i «K» koji se često koriste kao celobrojni brojači u
«for» petljama.

Svaku promenljivu treba deklarisati u zasebnoj liniji koda, umesto korišćenja grupne
deklaracije promenljivih odvojenih zarezima. Grupne deklaracije otežavaju pronalaženje
deklaracionog bloka i komplikuju prepravke programa. Koliko je npr. truda potrebno

1
Iako je string ujedno i tip podatka, u Delphi-ju se on pre svega posmatra kao službena (rezervisana) reč.
Zbog čega je ovo urađeno morate pitati ljude iz Borlanda. Službene reči se u Delphi editoru prepoznaju po
tome što su zacrnjene (bold).

2
uložiti da bi se u sledećem primeru iskomentarisala deklaracija promeljive «Z» u
poređenju sa situacijom da je u istom kodu potrebno iskomentarisati deklaraciju
promenljive «K»?

var X, Y, Z, W, Q: Real;
var I: Integer;
var J: Integer;
var K: Integer;
var L: Integer;

Ako naziv i svrha promenljive nisu jasni, dodajte linijski komentar (//) na kraju reda iza
deklaracije promenljive koji će objasniti za šta se promenljiva koristi i zbog čega. Kad
kog to ima smisla i kad god je moguće postavite početne vrednosti promenljivih u istom
redu gde su i deklarisane2.

var I: Integer = 0;

1.2. Dodeljivanje imena konstantama

Za razliku od drugih programskih jezika koji preporučuju da se imena konstanti pišu


isključivo velikim slovima uz upotrebu donje crte (ALL_UPPER_CASE), Delphi
preporučuje da se imena konstanti pišu kombinacijom malih i velikih slova bez upotrebe
donje crte, s tim da je početno slovo konstante uvek malo.

Svrha konstanti je izbeganje upotrebe magičnih borjeva. Magični brojevi su bilo koji
konkretni brojevi osim 0 i 1, kao npr. 27 ili $F5A (heksadecimalno) koji imaju neko
«podrazumevano» značenje. Umesto toga, razmotrite definisianje konstante koja će broju
dati neki smisao.

Primer:

Brush.Color := $00FFFF00; //Oh, ne! Koriste se magični brojevi!?

const clYellow = $00FFFF00;


Brush.Color := clYellow; //Da! Ovo je jasno samo po sebi

1.3. Imena funkcija (procedura, metoda i događaja)

Uvek se potrudite da smislite razumljiv i smislen naziv koji sažeto opisuje svrhu funkcije.
Za imena funkcija, procedura, metoda i događaja koristite mešana mala i velika slova
počevši svaku novu reč u složenicama sa velikim slovom, kao i kod promenljivih.

Prva reč u nazivu funkcije treba da bude glagol (npr. «Saberi»). Ako se naziv funkcije ne
može osmisliti tako da u sebi sadrži glagol, tada uvođenje funkcije verovatno nije ni bilo
potrebno. Ukoliko sam glagol nije dovoljan (npr. «Postavi» !?) glagolu treba dodati
objekat (imenicu) kao npr. «PostaviPocetnuVrednost» koja će bolje objasniti smisao
2
Delphi dozvoljava postavljanje početnih vrednosti samo globalnim promenljivama. Lokalne promenjlive
deklarisane unutar procedura ne mogu imati dodljene početne vrednosti.

3
funkcije. Ne treba izbegavati ni ubacivanje predloga kada je to neophodno radi bolje
razumljivosti kao npr. «PostaviNaNulu» i «PostaviNulu» semantički nemaju isto
značenje.

Ako se koriste engleski izrazi za nazive funkcija, tada u ovim nazivima preovladavaju
reči «Get» i «Set»3. «Get» funkcije vraćaju vrednost nekog parametra, dok «Set» funkcije
postavljaju neki parametra na zadatu vrednost. Tako npr. funkcija «GetTime» vraća
aktuelno vreme dok funkcija «SetTime» postavlja sistemsko vreme na željenu vrednost
(koja se prosleđuje kao parametar funkcije).

Ako funkcija vraća istinitosnu (Boolean) vrednost koja može biti «True» ili «False»,
naziv funkcije treba da počinje sa odgovarajućim identifikatorom (npr. «JesteKraj» ili
«IsDone»). Izbegavajte odrične reči u nazivima logičkih funkcija jer je nihova
interpretacija dvosmislena. Npr. funkcija sa nazivom «NijeKraj» može vratiti vrednost
«False» sa značenjem «Ne, nije kraj» ili «True» sa značenjem «Da, nije kraj» koji većini
ljudi znače isto.

Funkcije koje ne vraćaju vrednost u Delphi-ju se pišu bez praznih zagrada. Npr. «Exit», a
ne «Exit()».

2. Komentari

Komentari obezbeđuju dopunske informacije koje znatno utiču na razumljivost napisanog


koda. Komentare treba koristiti kako bi se obezbedio sažet opis nekog dela koda i kako bi
se onome ko pokušava da razume kod obezbedila dodatna objašnjenja onih stvari koje
nisu trivijalno dostupne iz samog koda. Posebno je poželjno komentarisati originalne i
neuobičajene kombinacije naredbi. Izbegavajte komentare koji su nepotrebno ponavljanje
očiglednih informacija.

Postoje tri neizostavna tipa komentara koji se upotrebljavaju u profesionalno napisanom


softveru:

1. Komentar u zaglavlju programa koji identifikuje autora i namenu programa,


daje informacije o autorkim pravima, verziji programa, poslednjim izmenama i sl.

//**************************************************************
// Naziv: Program za nakupljanje poena iz MSuI
//
// Opis: Ovaj program ne radi ama bas nista ali mi omogucava da
// nakupim neke poene i tako (mozda) polozim ispit iz MSuI
//
// Autor: Pera Petrovic
// Indeks: E10000
// Datum kreiranja: 20. februar 2009.
//
// Datum poslednje izmene: 31. maj 2009.
//

3
Get – daj i Set - postavi

4
// Napomene: Kunem se da sam ovaj kod napisao bas ja i da ga
// nisam ukrao sa Interneta niti prepisao od kolega.
// Ovom prilikom zelim da se zahvalim mami i tati koji su
// mi omogucili skolovanje i odrekli se svog dugo
// planiranog letovanja na Maldivima kako bih ja mogao
// dobiti diplomu i raditi (daj, Boze) dobro placen posao.
//**************************************************************

2. Samostalan linijski komentar koji objašnjava šta deo koda koji sledi treba da
obavi. Odvajanje blokova koda praznim linijama i dodavanje komentara na
početak svakog bloka omogućava brzu identifikaciju i razumevanje delova koda u
kojima se odvijaju specifične akcije.

// Racunanje srednje vrednosti 100 rezultata merenja


Suma := 0;
for I := 0 to 100 do
Suma := IzmereneVrednosti[I];
SrednjaVrednost := Suma / 100;

3. Linijski komentar u produžetku linije sa kodom koji objašnjava šta ta linija


koda radi. Ovo su komentari koje treba izbegavati, kao što se jasno vidi iz donjeg
primera. Izuzetak od ovog pravila su programi koji predstavlja edukativne
primere ili neke ekstremne situacije koje primenjuju globalne i sistemske
prmenljive i funkcije

SS = S1 + S2 + S3; //sabiranje tri broja (!?)


A = SS / 3; //racunanje srednje vrednosti (!?)

Suma := S1 + S2 + S3;
SrednjaVrednost := Suma / 3;
if Komanda = CmdPUT then PostaviTekst; //ovde bi bas dobro
//dosao komentar (!!)

Uvek dodajte komentare u toku pisanja odgovarajućih koda (ili čak neposredno pre toga)
umesto da čekate dok ne završite ceo programa. Tako će komentari biti aktuelni, tačni i
sažeti, te će doprineti razumevanju koda, umesto da samo služe za popunjavanje
praznina.

Kao što u svemu treba imati meru, tako treba izbegavati i preterano komentarisanje koda.
Učestali komentari ukazuju na loše napisan, nespretan i amaterski kod. Kad kod dođete u
iskušenje da dodate neki komentar, dobro razmislite o tome da li možete prepraviti kod
tako da on sam po sebi postane razumljiviji.

Vitičaste zagrade «{» i «}» mogu se koristiti za komentarisanje većeg dela koda prilikom
razvoja i testiranja aplikacije kako bi se proverilo kako program funkcioniše ako se taj
deo koda izostavi. Slično se mogu koristiti linijski komentari «//»za izostavljanje jedne
linije koda i njeno lako naknadno vraćanje. Finalne verzije programa ne bi trebalo da
sadrže nijednu komentarisu liniju koda. Kada se testiranje završi sve komentare čija je
namena bila debagovanje treba ukoniti iz koda.

5
3. Formatiranje

Formatiranje se odnosi na upotrebu uvlačenja, poravnanja i razmaka u smislu povećanja


čitljivosti i preglednosti koda.

Verovatno najvažniji faktor za pravljenje čitljivog koda je konzistentnost. Postoji mnogo


rasprave oko toga da li treba koristiti 2, 3 ili 4 razmaka (space) za uvlačenje blokova
koda, da li je bolje korisiti mala ili velika slova na početku naziva, da li je bolje iskazne
zagrade poravnavati sa naredbom ili ih uvlačiti itd. Svi napori uloćeni u objašnjavanje da
je baš taj i taj standard «savršen» zbog toga i toga, su potpuna besmislica jer je ključ
dobre čitljivosti programa u tome da usvojite bilo koje pravilo koje vama najviše
odgovara, ali da ga se potom dosledno držite do kraja. Tada će vaš kod biti razumljiv
svakome bez obzira na njegovo lično estetsko mišljenje.

U realnom svetu, organizacije i preduzeća usvajaju veoma različite standarde za svoje


programe. Ipak svima im je zajedničko da je smisao ove lokalne standardizacije
povećanje produktivnosti programera time što će se smanjiti broj varijanti i trijivajlnih
odluka koje se moraju doneti prilikom timskog rada. Pridržavajući se dobro definisaih
lokalnih standarda za formatiranje koda, programeri ne moraju lupati glavu nebitnim
detaljima i mogu posvetiti svoje vreme i energiju rešavanju stvarnih, teških problema koji
se odnose na funkcionisanje programa.

3.1. Uvlačenje

Koristite 2, 3 ili 4 razmaka za uvlačenje koje treba da označi ugnežđivanje blokova koda,
prema sopstvenom ukusu. Najčešće se u praksi u svetu koriste 3 razmaka (triple space)4.
Delphi je, naravno, izuzetak od ovog pravila i propisuje 2 razmaka za uvlačenje redova
po svakom nivou.

NE KORISTITE TABULATOR ZA UVLAČENJE REDOVA. Tabulator (Tab karakter)


se veoma različito interpretira na različitim platformama i u različitim programima i dok
vaš kod sa Tab karakterima može izgledati savršeno na vašem računaru, na nečijem
drugom rezultati mogu biti iznenađujuće loši. Razmaci se uvek konzistnento prikazuju na
svim računarima i u svim programima. S obzirom da je svaki *.pas fajl zapravo ASCII
dokument u kome font nije definisan, može se i ovde desiti da dođe do sitnijih odstupanja
(10 x i = iiiiiiiiii u poređenju sa 10 x w = wwwwwwwwww) zbog različite metrike
pojedinih karaktera unutar istog fonta (probajte da svoj Unit1.pas fajl otvorite u
Windows-ovom NotePad-u), ali je to daleko manji problem od tabulatora. Zbog toga
Delphi za svoj editor koristi Courier New font koji ima istu metriku za svaki karakter
(10 x i = iiiiiiiiii u poređenju sa 10 x w = wwwwwwwwww). Osim toga Delphi
editor zamenjuje Tab karakter sa odgovarajućim brojem space karaktera. Ovo je posebno
povoljno kada se u opciji Tools | Editor Options... podesi upotreba «pametnog
tabulatora». Ova opcija zamenjuje tab karakter sa space karakterima vodeći računa o
početku svake reči iz linija koje su iznad tekuće.

4
C++, Java, JavaScript, PHP, CSS, PERL

6
U narednom primeru prikazano je kako se uvlačenje koristi za «ugnežđivanje» koda.

procedure Form1.OnClick(Sender: TObject);


var I: Integer;
begin
for I := 1 to 100 do
begin
if I > UslovZePrekid then Break;
if I = 3 then //Hmmm! Magicni brojevi...
begin
MojaPromenljiva := MojaPromenljiva + 3;
MojaPromenljiva := MojaPromenljiva * Pojacanje;
end
else
begin
MojaPromenljiva := MojaPromenljiva - 3;
MojaPromenljiva := MojaPromenljiva / Slabljenje;
end;
if I = 7 then Continue; //Opet neki nerazumljiv magicni broj
end;
end;

.. – dva razmaka predstavljaju prvi nivo ugnežđenja (telo procedure)


.... – četiri razmaka označvaju drugi nivo ugnežđenja (for petlja)
...... – šest razmaka ukazuju na treći nivo ugnežđenja (if – else)
itd.

7
Uporedite gornji primer sa sledećom strukturom i pokušajte da neđete grešku koja se
(namerno/slučajno ?) potkrala:

procedure Form1.OnClick(Sender: TObject);


var I: Integer;
begin
for I := 1 to 100 do
begin
if I > UslovZePrekid then Break;
if I = 3 then
begin
MojaPromenljiva := MojaPromenljiva + 3;
MojaPromenljiva := MojaPromenljiva * Pojacanje;
end;
else
begin
MojaPromenljiva := MojaPromenljiva - 3;
MojaPromenljiva := MojaPromenljiva / Slabljenje;
if I = 7 then Continue;
end;
end;

3.2. Razmaci

Koristite prazne redove kako biste popravili čitljivost svog koda i podelili ga u logične
celine. Praznim linijma se najčešće odvajaju grupe naredbi posvećene obavljanju
određenog zadatka. Poželjno je da svaki segment (pasus, blok) dobijen ubacivanjem
prazne linije počne komentarom.

Pogledajte dva donja primera i zaključite sami koji od njih je jasniji.

Primer 1:

//Trazi od korisnika unos kamate


SimpleIO.Prompt('Unesite kamatu (u procentima): ');
Kamata:=SimpleIO.ReadLine;
if Kamata<0 then Exit;
//Izracunaj i ispisi proviziju sa tacnoscu od jedne pare
Provizija:=Glavnica*Kamata/100;
Provizija:=Round(Provizija*100)/100;
System.Out.PrintLn('Provizija: '+Provizija);

Primer 2:

//Trazi od korisnika unos kamate


SimpleIO.Prompt('Unesite kamatu (u procentima): ');
Kamata := SimpleIO.ReadLine;
if Kamata < 0 then Exit;

//Izracunaj i ispisi proviziju zaokruzenu na jednu paru


Provizija := Glavnica * Kamata / 100;
Provizija := Round(Provizija * 100) / 100;
System.Out.PrintLn('Provizija: ' + Provizija);

8
Na čitljivost koda u velikoj meri utiče i upotreba razmaka između opreratora i nakon
znakova interpunkcije. Po jedan razmak treba koristiti:

• sa svake strane binarnih operatora i operatora dodeljivanja bez obzira na prisustvo


zagrada
X * (A + B) / 100
I := 0
if N <= 1 then
while Uslov1 and Uslov2 do

umesto
X*(A+B)/100
I:=0
if N<=1 then
while (Uslov1)and(Uslov2) do

• nakon zareza u listi argumenata


Sum(A1, 3, A4, 7)
RеzultatiMerenja[0, J]
Skup := [1, 5..7, 9]

umesto
Sum(A1,3,A4,7)
RеzultatiMerenja[0,J]
Skup := [1,5..7,9]

• nakon tačka-zareza na kraju deklaracije ili pre naredne naredbe


I := 0; J := 0; K := 0;
procedure Sredi(S: string; I: Integer);

umesto
I:=0;J:=0;K:=0;
procedure Sredi(S:string;I:Integer);

• nakon dvotačke koja označava deklaraciju tipa promenljive ili funkcije


var I: Integer;
function Cos(Alfa: Real): Real;

umesto
var I:Integer;
function Cos(Alfa:Real):Real;

Razmak NE TREBA NIKADA koristiti za odvajanje:

• prvog kraktera iza zagrade i poslednjeg karaktera pre zagrade


X * (A + B) / 100
RеzultatiMerenja[0, J]
Skup := [1, 5..7, 9]

9
dok je nepravilno

X * ( A + B ) / 100
RеzultatiMerenja[ 0, J ]
Skup := [ 1, 5..7, 9 ]

• odvajanje naziva funkcije odnosno niza sa zagradom liste argumenata


Sum(A1, 3, A4, 7)
RеzultatiMerenja[0, J]
procedure Sredi(S: string; I: Integer);

dok je nepravilno

Sum (A1, 3, A4, 7)


RеzultatiMerenja [0, J]
procedure Sredi (S: string; I: Integer);

• ispred dvotačke koja označava deklaraciju tipa promenljive ili funkcije


var I: Integer;
function Cos(Alfa: Real): Real;

dok je nepravilno

var I : Integer;
function Cos(Alfa : Real) : Real;

• između karaktera u višesimbolskim operatorima


I <> 0
J := K

dok je nepravilno
I < > 0
J : = K

3.3. Iskazne zagrade

Iskaznim zagradama smatraju se parovi službenih reči koji okviruju delove teksta.
Iskazne zagrade u Delphi-ju čine sledeći parovi službenih reči:

• begin – end
• repeat – until
• case – end
• try – except – end
• try – finally – end
• record – end

10
Iskazne zagrade se uvek pišu u posebnom redu. Reči koje pripadaju istom prau iskaznih
zagrada moraju biti jednako uvučeni. Sve iskazne zagrade su službene reči i u Delphi
editoru su boldovane (zacrnjene).

3.4. Dužina linije

Izbegavajte linije duže od 80 karaktera. Lije koje su duže od 80 karaktera prelomiće se na


nepredvidiv način prilikom štampanja ili prikaza koda u drugim editorima. Time se gubi
efekat uvlačenja linija i kod postaje teži i nerazumljviji za čitanje. Ako linija koda ima
više 80 karaktera (npr. kao posledica višestrukog uvlačenja linije) prelomite je sami
prema jednom od sledećih opštih pravila:

• prelomite liniju NAKON zareza;


• prelomite linije PRE opreatora;
• poravnajte novu liniju sa početkom izraza u istom nivou sa prethodnom linijom.

NekaProcedura(DugacakArgument1, DugacakArgument2, DugacakArgument 3,


DugacakArgument4, DugacakArgument5);

DugackoIme1 := DugackoIme2 * (DugackoIme3 + DugackoIme4 - DugackoIme5)


+ 4 * DugackoIme6;

Delphi editor ima indikator u vidu vertikalne sive linije koji označava granicu između 80.
i 81. karaktera. Kod programa će se smatrati ispravnim bez obzira na to sa li je neka
njegova linija prešla 80 karaktera ili ne. Stoga ovaj indikator ima kozmetičku funkciju u
smislu poboljšanja izgleda koda ukoliko on bude štampan na štampaču ili prikazivan u
nekom drugom editoru.

11
Reference

Kompletan standard za pisanje koda u Delphi-ju možete naći na

http://www.econos.de/delphi/cs.html

Takođe, preporučujem da pogledate link:

http://en.wikipedia.org/wiki/Coding_standard

kao i brojne linkove koje možete dobiti na Google-u pretraživanjem pojma «Coding
standards» za druge programske jezike.

12

You might also like