Razvoj softvera

od početnika do znalca

Konstruktor (podrazumevajući i parametrizovani)

Konstruktori su metode klasa koje se pozivaju kada se kreira nova instanca te klase. Svi konstruktori imaju isti naziv kao i klasa i svi vrednosni tipovi imaju implicitno deklarisan podrazumevajući konstruktor.
Podrazumevajući konstruktor je metoda bez parametara i povratne vrednosti. Kada u klasi nema deklarisanih parametrizovanih parametara ovaj konstruktor nije potrebno posebno deklarisati, jer će ga kompajler implicitno dodati.

Primer podrazumevajućeg konstruktora:

public class Zaposlen
{
public Zaposlen()
{}
}

Pored podrazumevajućih postoje i parametrizovani konstruktori kao npr.

public class Zaposlen
{
public Id {get;set;}
public Zaposlen(int id)
{
this.Id=id;
}
}

Kada u klasi postoji parametrizovani konstruktor, a korisniku klase ipak hoćemo da dozvolimo instanciranje objekat bez prosleđivanja parametara, moramo deklarisati podrazumevajući konstruktor.
U klasi može postojati neograničen broj parametrizovanih konstruktora koji se moraju razlikovati po tipovima podataka koji se prosleđuju parametrima npr.

public class Zaposlen
{
public Zaposlen(string ime)
{}

public Zaposlen(string maticniBroj) /*<-nije dozvoljeno */
{}
}

Nekad je potrebno obezbediti da se, pored parametrizovanog konstruktora pozove i podrazumevajći kako bi se izvršila inicijalizacija polja na podrazumevajuće vrednosti. Ovo se obezbeđuje pozivom rezervisane reči this na sledeći način:

public class Zaposlen
{
private DateTime _datum_kreiranja;

public Zaposlen()
{
_datum_kreiranja = DateTime.Now();
}
public Zaposlen(string ime):this()
{
/*ovde ide kod za inicijalizaciju imena*/
}
}

Pored korišćenja rezervisane reči this, u praksi ćemo imati i korišćenje reči base.
Reč base se koristi u scenarijima kada je potrebno pozvati konstruktor osnovne klase.
Evo nekoliko primera:

public abstract class Osoba
{

public Osoba(int id)
{
/*inicijalizacija */
}
}

public class Zaposlen : Osoba
{
public Zaposlen(int id) : base(id)
{}
}

Važna napomena jeste da i pored toga što je sintaksa ista korišćenje this i base će proizvesti pozive različitim konstruktorima što će značajno uticati na rad sistema.

Konstruktori mogu biti označeni kao public,  private,  protected,  internal ili protected internal.
Konstruktor može biti deklarisan koristeći ključnu reč static. Statični konstruktori će biti pozvani automatski, pre nego što se bilo kojem statičnom polju pristupi. Takođe, statični konstruktor nije moguće pozvati direktno u kodu.

Višeslojna arhitektura

Kada projektujemo i dizajniramo poslovne informacione sisteme primenjujemo višeslojnu arhitekturu.

U praksi se  može identifikovati nekoliko stilova arhitekture:

  • Klijent/Server : predstavlja razdvajanje sistema u dve aplikacije: klijentska, koja se nalazi kod korisnika i
    baza podataka sa aplikativnom logikom
  • Arthitektura zasnovana na komponentama: sistem čine funkcionalne ili logičke komponente
    koje obezbeđuju interfejs za spoljnu komunikaciju
  • Domenski vođen dizajn: Objektno orjentisan pristup koji je fokusiran na modelovanje sistema kreiranjem
    klasa identifikovanih u poslovnom domenu koji se modelira
  • N-slojeva / 3 sloja:  troslojna arhitektura je jedna od najčešće korišćenih u praksi na
    osnovu dosadašnjeg iskustva. Troslojnu arhitekturu čine: prezentacioni, sloj poslovne logike i sloj podataka.
  • Servisno orjentisana arhitektura (SOA): odnosi se  na aplikacije koje obezbeđuju i koriste funkcionalnosi
    kao servise koristeći ugovore i poruke

Arhitektura softverskog sistema najčešće predstavljaju kombinaciju gore navedenih stilova.

Iako se svi podjednako koriste u praksi,  detaljnije ćemo obraditi troslojnu arhitekturu.
Troslojnu arhitekturu čine tri sloja:

  1. Prezentacioni – ovaj sloj obezbeđuje prikaz podataka krajnjem korisniku koristeći neku od raspoloživih tehnologija za korisnički interfejs. U slučaju da pravite desktop aplikacije to može biti Windows Forms ili WPF dok recimo ako pravite web aplikacije to ASP .NET.
  2. Sloj poslovne logike – ovaj sloj implementira poslovnu logiku aplikacije. Poslovnu logiku čine poslovni procesi i poslovne komponente. Ovde se takođe najčešće implentiraju i poslovna pravila dobijena u procesu analize.
  3. Sloj podataka – većina poslovnih aplikacija koristi relacione baze podataka za skladištenje podataka.

Neke od prednosti ovakve arhitekture su:

  • Skalabilnost ( sposobnost programa da uspešno obradi porast korisnika, npr. u web aplikacijama, skalabilnost bi bila sposobnost aplikacije da uspešno funkcioniše kod povećanog broja poseta. Pored programskih zahteva da se poveća skalabilnost, ne treba zaboraviti  i hardverske komponente koje pokreću sistem jer i one mogu uticati na ovaj kvalitativni atribut)
  • Fleksibilnost ( sposobnost programa da se lako prilagodi novim zahtevima korisnika)
  • Dostupnost ( verovatnoća da sistem ispravno funkcioniše bilo kad, osim kada je u pitanju održavanje )  – ova prednost se ogleda u tome što je arhitektura sistema modularna)
  • Održavanje 

Troslojna arhitektura je pogodna za sledeće scenarije:

    • intranet aplikacije gde su serveri postavljeni unutar privatne mreže
    • internet aplikacija kada je dozvoljeno da poslovna logika bude dostupna na javno pristupačnim web ili aplikativnim serverima

Apstrakcija (interfejsi i apstraktni tipovi)

Šta je interfejs u objektno orjentisanim jezicima ?

Intefejs je apstraktni tip,  koji ne sadrži podatke, već metode koje će klasa implementirati.
Interfejs sadrži isključivo abstraktne članice i one mogu biti događaji, indekseri, metode ili svojstva.
Svaka gore navedena članica implicitno ima public pristup i njega nije moguće menjati.
Interfejs može naslediti više interfejsa, što nije slučaj sa klasama koje mogu naslediti isključivo jednu klasu,
ali mogu implementirati više interfejsa.
Svaka konkretna klasa koja implemetnira interfejs, mora implementirati sve članice, međutim apstraktna
klasa može implementirati neke članice, dok one, koje se ne implementiraju potrebno je postaviti da su
apstraktne.
Ukoliko želimo da implementiramo podrazumevajuće ponašanje, a ipak dozvolimo drugim programerima
da implementiraju drugačije ponašanje postavićemo rezervisanu reč virtual.
Evo primera:

public interface IOsnovniEntitet
{
    int Id {get;set;}
}

public interface IZaposlen : IOsnovniEntitet
{
     void DodeliRadnoMesto (DateTime datumPocetkaRada, RadnoMesto novoRadnoMesto);
}

public Zaposlen : IZaposlen
{
     public void DodeliRadnoMesto (DateTime datumPocetkaRada, RadnoMesto novoRadnoMesto)
     {
         // implementacija dodele radnog mesta
     }
}

public interface IOsnovnoSredstvo : IOsnovniEntitet
{
    void ZaduziSredstvo (DateTime datumZaduzenja, IZaposlen zaposlenZaduzio);
    void RazduziSredstvo (DateTime datumRazduzenja);
    void OtpisiSredstvo (int sredstvoId);
}

public abstract OsnovnoSredstvo : IOsnovnoSredstvo
{
     public void ZaduziSredstvo (DateTime datumZaduzenja, IZaposlen zaposlenZaduzio)
     {
        // podrazumevana implementacija
     }

     public void RazduziSredstvo (DateTime datumRazduzenja)
     {}

     public abstract void OtpisiSredstvo(int sredstvoId);
}

public class Laptop : OsnovnoSredstvo
{
    public void OtpisiSredstvo(int sredstvoId)
    {
       // implementacija za otpis sredstva specificno za Laptop
    }
}

public class Vozilo : OsnovnoSredstvo
{
    public void OtpisiSredstvo(int sredstvoId)
    {
      // implementacija za otpis sredstva specificno za Vozilo
    }
}

U gore datom primeru vidimo da Vozilo i Laptop mogu implementirati specifičnosti ponašanja (tj. metoda).
Kod apstraktnih klasa situacija je nešto drugačija. Apstraktna klasa najčešće se koristi u scenarijima kada postoji podrazumevano ponašanje koje implementiramo, dok se izvedenoj klasi omogućava implementacija pojedinih metoda

Primer:


public abstract class DataExport
{
    protected abstract void IzvrsiExport(string sadrzaj);

    protected virtual bool OtvoriFajl(string nazivFajl)
    {
       // otvoriti fajl
    }

    protected virtual void ZatvoriFajl(string nazivFajla)
    {
       // zatvoriti fajl.
    }

    public bool Exportuj(string nazivFajl, string sadrzaj)
    {
         bool fajl_uspesno_otvoren = OtvoriFajl(nazivFajl);
         if (fajl_uspesno_otvoren)
         {
           IzvrsiExport(sadrzaj);
         }
         ZatvoriFajl(nazivFajla);

    }
}

public class ExcelExport : DataExport
{
    protected override void IzvrsiExport(string nazivFajla)
    {
      Console.WriteLine("Excel export");
    }
}

public class XmlExport : DataExport
{
    protected override void IzvrsiExport(string nazivFajla)
    {
       Console.WriteLine("Eksport u XML fajl");
    }
}

U prethodnom primeru mogli smo da vidimo kako metodu IzvrsiExport implementiraju
konkretne klase ExcelExport i XmlExport i na taj način omogućavaju drugačije
ponašanje sistema.
Ono što bih želeo da naglasim jeste da apstraktna klasa ne može imati instancu,
tj. sledeće nije dozvoljeno:

   OsnovnoSredstvo s = new OsnovnoSredstvo()

međutim sledeća linija koda jeste dozvoljena jer Vozilo nasleđuje OsnovnoSredstvo koje implementira IOsnovnoSredstvo:

  IOsnovnoSredstvo osnovno_sredstvo = new Vozilo();

Predlozi u imenovanju interfejsa i apstraktnih klasa:

  1. naziv interfejsa počinje sa I npr, IOsnovnoSredstvo
  2. kada se jednom definiše interfejs, potpis metoda ne treba menjati
  3. ako je ipak potrebna promena interfejsa na bilo koji način, predlog je da se kreira novi interfejs
  4. apstraktne klase treba koristiti u scenarijima kada se očekuje verzionisanje jer je dodavanje
    nove funkcionalnosti olakšano činjenicom da je moguće dodati metodu u izvedenoj klasi
    a da pri tome nije potrebno menjati klijentski kod (tj. klase koje su već izvedene iz osnovne)

 

 

Poslovna aplikacija – odakle početi ?

Koja je polazna osnova koju treba da znamo pre nego što krenemo sa implementacijom poslovne aplikacije ?

Pre nego što krenemo u implementaciju poslovne aplikacije susrešćemo se sa nekoliko izbora koje treba da uradimo i to:

    1. izbor tehnologije u kojoj ćete implementirati grafički interfejs (windows forms, wpf, asp .net web forms, asp .net mvc)
    2. izbor ili kreiranje postojećeg okvira za poslovne aplikacije (npr. Enterprise Library,  Sprint .NET, itd…)
    3. izbor frameworka data access sloja (Entity Framework, NHibernate )
    4. izbor baze podataka (Microsoft SQL Server, MySQL, Oracle itd …)

Za mene je jedan od izazovnijih koraka bilo kreiranje aplikativnog frameworka.
Wikipedia definiše aplikativni framework kao skup biblioteka koje je moguće ponovo koristiti. Skup biblioteka, koje sami pišemo
zapravo nam olakšavaju rad i održavanje sistema, jer razvojni tim može da se posveti poslovnoj logici.
Framework uglavnom čine neke generalne celine, koje se često koriste u sistemu od strani članova tima npr:

  1. Logovanje grešaka
  2. Rešavanje neobrađenih izuzetaka
  3. Lokalizacija podataka
  4. Model – čine ga osnovne klase domenskog model

Pored izbora frameworka, nastojimo i da definišemo strukturu projekta.
Struktura direktorijuma  i predlog  programerskih alata

Osnovna ideja jeste davanje osnova kako kreirati struktuiratu direktorijuma kao i koje alate u početku možete
koristiti za razvoj.

Predlog strukture direktorijuma:

Projekat
|-src
|   |-Framework
|   |-Modules
|-docs
|-msbuild
|-sbin
|-templates
|-res

Predlog alata koji se mogu koristiti:

  1. ReSharper – alat čije korišćenje  povećava brzinu u radu koristeći određene skraćenice.
    (predlog: ovaj alat mogu koristiti i početnici u programiranju, jer će im olakšati pisanje LINQ upita, okidača događaja i sl.
    ono što sam hteo da napomenem jeste da je svaki kôd za koji ReSharper uradi refaktoring
  2. VSCommands 2010 – dodatak za Visual Studio 2010 dostupan kroz Tools->Extension manager
  3. Ident Guides   – dodatak za Visual Studio 2010 dostupan kroz Tools->Extension manager
  4. Search Work Items for TFS 2010 – dodatak za Visual Studio 2010 dostupan kroz Tools->Extension manager
    (dodatak je potreban u slučaju da koristite Team Foundation Server u svom timu)
  5. Ditto – multi clipboard alat koji omogućava da kopirate više elemenata u clipboar i koristeći skraćenicu
    kasnije zalepite gde vam odgovara bez šetanja kroz kod (alat se inače može koristiti ne samo u programiranju već i u drugim editorima)
  6. SVN – source kontrola koja omogućava praćenje izmene na vasem izvornom kodu
    ( umesto da kreirate foldere novi, najnoviji, novi123 i sl. ovaj alat će vam omogućiti da pratite izmene na vašem izvorno kodu i da uvek možete
    da se vratite na prethodnu verziju )
  7. DevExpress kontrole
Korisni linkovi

Mislim da je ovo dobra polazna osnova za sopstveni razvoj aplikacije.

Data binding (osnove)

Data binding predstavlja proces koji uspostavlja vezu između korisničkog interfejsa aplikacije (npr. forme, web stranice…) i poslovne logike (najčešće nekog poslovnog entiteta, kao npr. klasa Zaposlen, Vozilo itd …).
U praksi, kod Windows formi postoje dva tipa povezivanja: prosti i kompleksni.
Prosto povezivanje je sposobnost kontrole da se poveže sa vrednosti u tabeli, tj. sa jednostavnim tipom.
Primer  kontrola koji se povezuju sa jednom vrednšću je TextBox ili Label.
Kompleksno
 povezivanje se odnosi na povezivanje više podataka, npr ListBox, ComboBox, DataGridView.

Šta rešava i zašto se koristi Data binding ?

Kad pravimo windows aplikacije, one najčešće sadrže forme koje korisnici koriste za unos podataka koji se kasnije snimaju
u neki izvor podataka (izvor može biti baza podataka, XML fajl, text fajl itd…)
Ako npr. imamo formu za unos imena, prezimena i telefona Zaposlenog, da bismo podatke sa forme preneli u objekat Zaposlen
koristili bismo sledeći kôd:

za upisivanje podataka iz forme u objekat

Zaposlen novi_zaposlen = new Zaposlen();
_zaposlen. ImeIPrezime = imeIPrezimeTextBox.Text;
_zaposlen.Telefon = telefonTextBox.Text;

za prikaz podataka na formi iz objekta

Zaposlen novi_zaposlen = new Zaposlen();
imeIPrezimeTextBox.Text = _zaposlen. ImeIPrezime;
telefonTextBox.Text = _zaposlen.Telefon;

ovakav pristup otežava održavanje sistema jer svako dodavanje novog polja (npr. Adresa) nameće pisanje
naredbi za upisivanje podataka u objekat i čitanje iz njega i upis na formi.

Data binding u mnogome olakšava ovaj pristup korišćenjem dizajnera Visual Studio-a.
Najpre je neophodno da kreiramo klasu Zaposlen  sa potrebnim svojstvima koje ćemo povezati sa formom.
Inače, povezivanje u našem slučajuće se svesti na povezivanje svojstva ImeIPrezime iz klase Zaposleno sa
svojstvom jednostavnom kontrolom TextBox

Nakon toga potrebno je da kompajliramo izvorni kôd kako bi nam klasa bila dostupna za
povezivanje sa formom u VS dizajneru.
Za povezivanje koristimo svojstvo Text kontrole TextEdit  i odgovorajuće svojstvo objekta tj.
Zaposlen.ImeIPrezime

Povezivanje svojstva Text


Prilikom povezivanja potrebno je izabrati i Object.

Izbor izvora podataka za data binding

Nakon izbora Object izaberemo tip podatka sa kojim želimo da poveženo izabrano svojstvo

Nakon ovoga, izaberemo svojstvo ImeIPrezime i isto ponovimo za ostala svojstva i polja koja želimo da povežemo.

Ovako izvršeno povezivanje je dosta lakše za buduće održavanje sistema.

Konkretnu implementaciju ostavio sam čitaocu radi vežbe.

Sledeći članak će se odnositi na neke generalne odrednice kreiranja aplikacije u koorporativnom okruženju.

Windows Forms (osnove)

Ciljevi:

  1. Upoznavanje sa grafičkim dizajnerom u Visual Studio-u 2010
  2. Korišćenje Button, Label, TextBox i ListBox kontrola
  3. Obrada događaja (event-a) kontrole

Kao što sam obećao u prethodnom članku ovde ćemo koristeći Windows Forms simulirati zapošljavanje kandidata u
preduzeće.
Najpre ćemo kreirati novu Windows Forms Application koristeći opciju File->New project i izborom istoimenog šablona.
U Name upišite UcimProgramiranje.Zaposlenja. Nakon što ste kreirali projekat Visual Studio će otvoriti dizajner
sa nazivom Form1.cs

Izgled forma nakon dodavanja novog projekta

Ukoliko sa leve strane ne vidite karticu Toolbox možete je prikazati izborom opcije View->Toolbox.
Ovo je bitan korak jer ćemo, prevlačeći kontrole dizajnirati naš izgled forme kao što je dato
na sledećoj slici

Izgled forme

Kada prevučete Label-u na formu ona dobija podrazumevajući naziv npr. Label1.
Ovaj natpis menjamo tako što promenimo vrednost svojstva Text u kartici Properties.
U slučaju da kartica Properties nije vidljiva možete je prikazati izborom opcije View->Properties Window.
Kada smo dizajnirali formu, potrebno je da dodamo funkcionalnosti.
Najpre ćemo obraditi događaj dugmeta Button_Click. Ovaj događaj se okida kada
korisnik klikne na naše dugme i njega ćemo obraditi tako što dva puta kliknete na dugme Zaposli
nakon čega će Visual Studio da generiše megodu button1_ButtonClick (događaje ćemo obraditi detaljnije u posebnom
članku). U ovoj metodi pišemo naš kod za dodavanje imena i prezima zaposlenog u kontrolu zaposlenListBox (imena kontrole
menjate promenom svojstva Name u kartici Properties dok je izabrana kontrola čija svojstva menjate).
Ono što korisnik upiše kao tekst u kontrolu EditBox nama je dostupno iz svojstva Text te kontrole.
Da bismo dodali ovaj podatak u kontorlu i ListBox koristićemo svojstvo Items i metodu Add na sledeći način:

[csharp]

string imeIPrezime = imeIPrezimeKandidataTextBox.Text;
zaposleniListBox.Items.Add(imeIPrezime);

[/csharp]

Nakon što kompajlirate izvorni kod (koristeći opciju Start debugging) i pokrenete aplikaciju
možete upisati ime (ili neki tekst) u TextBox polje i kliknuti na dugme Zaposli. Ako ste dobro povezali
to ime treba da se pojavi u ListBox kontroli.
Ovo je bio jednostavan primer korišćenja kontrola i dizajniranja forme.
U sledećem članku ćemo detaljnije obraditi povezivanju kontrole sa izvorom podataka (Binding).

Tipovi podataka (osnove)

 

Cilj:

  • šta su prosti tipovi i čemu služe
  • šta su kompleksni tipovi
  • razlika između prostih i kompleksnih tipova

C# je strogo tipiziran jezik, što će reći da za sve promenljlive i metode koje se koriste treba uzeti
u obzir njihov tip.
Najčešće korišćeni prosti tipovi u c#-u su:

  • bool
  • int
  • double
  • float
  • string
  • decimal
  • char
  • long

Iako ne predstavlja konačnu list, svakako ćemo ih najčešće koristiti.
U sledećem članku ćemo napraviti windows aplikaciju koja će simulirati zapošljavanje zaposlenog u preduzeću
koristeći Windows Forms.

Vidljivost polja (osnove)

Cilj:

  • Pregled osnovnih vidljivosti polja
Značenje termina vidljivost smo objasnili u prethodnom članku u ovom članku idemo korak dalje i
pojasnićemo koje vidljivosti postoje za polja.
Polja mogu imati sledeće vidljivosti:
private:  najčešće korišćena vidljivost i ograničava pristup polju na nivou klase
protected: polje je vidljivo u klasi u kojoj je deklarisano kao i u izvedenoj klasi. 
internalatribut je dostupno u istom sklopu (Assembly-ju)
protected internal: ima isti nivo pristupa u kombinaciji protected i internal, što znači da ovom polju
je moguće pristupiti u okviru istog sklopa, klase u kojoj je deklarisan kao i iz izvedene klase.
public: polje je vidljivo u svim klasama
  Predlozi za deklaraciju polja:
  • ustanovite svoj način imenovanja polja u klasi (npr. _broj_telefona, brojTelefona i sl.) i budite dosledni
  • neka vam naziv polja određuje ulogu koju to polje ima u klasi (npr. _indeks_vidljivosti ili _trenutni_indeks umesto broj ili indeks)
  • kada pravite polja uvek krenite od private vidljivosti i ako zaista ima potrebe promenite u protected
  • polja ne treba proglašavati za public već koristite svojstva (property) za tu svrhu (u nekim scenarijima i metoda je dobar izbor)

Upoznavanje sa klasom

Cilj:

  • Šta je klasa ?
  • Kad pravim klasu ?
  • Šta su polja i čemu služe ?
  • Šta je vidljivost klase ?

U prethodnim člancima (1, 2 ) imali smo prilike da kreiramo klasu. U prethodnom članku imali smo
zadatak da modeliramo sistem koji simulira zapošljavanje zaposlenog u preduzeće i zaključili
kako će nam trebati dve klase Zaposlen  i Preduzece.
 Sad ćemo ih i kreirati :
Zaposlen

[csharp]
namespace UcimProgramiranje.Zaposlenje.Model
{
public class Zaposlen
{
public string ImeIPrezime { get; set; }
public int Godiste { get; set; }
public string MaticniBroj { get; set; }
}
}
[/csharp]

Preduzece

[csharp]

namespace UcimProgramiranje.Zaposlenje.Model
{
public class Preduzece
{
public string Naziv { get; set; }
public string Pib { get; set; }
public string SifraDelatnosti { get; set; }
}
}
[/csharp]

Šta je klasa i kad je pravimo ?

Klasa predstavlja kompleksan tip podatka.
Mi ćemo kreirati klase kada želimo da neki model iz realnog (automobil, zaposlen, avion su samo neki primeri)
preslikamo u softverski svet.  Klasa zapravo definiše podatke i ponašanje tipa kada se koristi u programu.
Svaka klasa ima podrazumevani konstruktor. Konstruktor je metoda koja ima
isti naziv kao i sama klasa i nema povratnu vrednost.

primer:

[csharp highlight=“3″]

public class Zaposlen
{
public Zaposlen(){}
}

[/csharp]

Pored podrazumevanog, imamo i parametrizovani konstruktor, tj. konstruktor koji prihvata parametre. 

Da bismo klasu koristili u našem programu  mi zapravo kreiramo konkretnu instancu tj. objekat te klase na sledeći način:

[csharp]
Zaposlen zap = new Zaposlen();
[/csharp]

Šta su polja i čemu služe ?

Poljima opisujemo stanja koja želimo da sačuvamo u toku izvršavanja programa.
Generalni predlog jeste da se polja uvek deklarišu private ili protected i da sve podatke
koje klasa treba da učini dostupnim drugim programerima to uradi preko metoda ili svojstava.

Poja definšemo uvek u okviru klase koristeći sledeći šablon:

vidljivost TipPodatka naziv polja;

npr:

[csharp]

private int _godiste;
private string _ime;

[/csharp]

Vidljivost polja ćemo obraditi u narednim člancima, za sada ćemo uglavnom koristiti private vidljivost.

Deklaracija klase i vidljivost

Opšti šablon za deklaraciju klase je:

vidljivost class Naziv-Klase
{

ostali elementi (polja, metode, svojstva itd…)

}

npr.

[csharp]
public class Zaposlen
{
}
[/csharp]

Vidljivost: 

 Kad koristimo termin vidljivost, mislimo na to da li i kad drugi programer može da koristi našu klasu.
Da bismo bolje razjasnili ovaj pojam, koristićemo našu klasu Zaposlen, koja je deklarisana kao public.
Koristeći ovu rezervisanu reč, omogućili smo da našu klasu može da se koristi bilo koji programer i kažemo
da je klasa javno vidljiva.
Pored ove imamo i sledeće najčešće korišćene vidljivosti:

private: klasa koja je vidljiva samo programeru koji je deklariše u klasi kojoj je deklariše.
internal: klasa je vidljiva unutar sklopa (eng. Assembly).

Pored ovih, postoje još neke koje ćemo u narednim člancima koristiti.

Struktura C# fajla

Cilj: Upoznavanje sa strukturom C# fajla i deklaracija klase, promenljive i metode.

Da bismo se bolje upoznali sa strukturom C# fajla, krenućemo od predpostavke da treba da napravimo model koji simulira zapošljavanje zaposlenog u preduzeću.
Za ovaj primer najpre ćemo identifikovati 2 klase koje treba da napravimo (a-ha.. kako sad znam da treba da napravim dve klase ?  Odgovor na ovo pitanje odložićemo
za kasnije i za sada je dovoljno da prihvatimo činjenicu da su nam zaista one potrebne 😉   ).
Klase koje ćemo napraviti su Zaposlen Preduzece. Na sledećoj slici dat je izgled fajla sa vizuelnim opisom šta koja sekcija predstavlja.

Struktura C# fajla

Objašnjenje svake sekcije:

   using sekcija: 

Sadrži namespace-ove tipova koje koristimo a nisu u našem namespace-u.

   namespace:  

Rezevisana reč namespace koja predstavlja ,grubo rečeno, način logičke organizacije tipova u našem programu.
Kažem logička, jer jedan namespace se može naći u više različitih fajlova koji nisu deo istog sklopa (eng. Assembly).
Pored ove ulooge, sprečavaju koliziju između naziva tipova tj. ako u našem programu imamo naziv klase File može doći do toga
da program ne zna koju klasu treba da koristi, našu ili iz .NET framework-a
Takođe, nije .NET framework jedini sa kojim nazivi naših tipova mogu doći u konflikt već i tipovi drugih proizvođača.
Primera radi ako dizajniramo informacioni sistem za celokupno poslovanje preduzeća, imaćemo nekoliko celina koje ćemo organizovati na sledeći način:

[csharp]
Contoso.Windows.HumanResources
Contoso.Windows.Finance
[/csharp]

deklaracija promenljivih (polja): 

Ovde bih skrenuo pažnju da se pre svega radi o deklaraciji polja, (izbegavam namerno reč atributa) koja sadrže stanja objekta
koja želimo da imamo u toku izvršavanja programa.U našem zadatom primeru,
_ime predstavlja konkretno ime nekog zaposlenog, isto tako ćemo dodati i _prezime, _godiste, _maticniBroj.

donja crta ispred naziva promenljive nije obavezna već je stvar konvencije.
Svaka kompanije (odnosno tim) ima svoj vodič za imenovanje klasa, interfejsa, promenljivih itd.
Ja praktikujem ovako imenovanje. U svakom slučaju, dobro je,
ako ste početnik da imate bar neki sistem po kojem imenujete promenjlive.

property (svojstva):

Služe za „sakrivanje“ stanja našeg objekta. Kad sam ja ovo prvi put čuo, pitao sam se … šta se bre skriva kad sve vidim 🙂
Ovo skrivanje se pre svega odnosi na to, da programer, koji koristi našu klasu ne može da pristupi direktno našem polju unutar klase
(naravno podrazumevam da je polje nema public ispred sebe (vidljivost ćemo objasniti u sledećem članku).
U C#-u postoji 2 načina da napišete property.

  • Prvi je dat u našem primeru i podrazumeva korišćenje deklarisanog polja u klasi (u našem primeru polje _ime).
  • Drugi način je korišćenje automastkog svojstva (eng. Auto property) gde nije potrebno deklarisati polje.
    U našem primeru to bi izgledalo ovako:

[csharp] public string Ime {get; set; }[/csharp]

metode ( ili operacije):

Metodama opisujemo ponašanje tj. one određuju šta sa našim objektom možemo da radimo.
U našem primeru napravili smo metodu Stampaj koja bi zapravo trebala da štampa
recimo podatke u nekom konzolnom prozoru, štampaču ili bilo gde drugde.

Svaku od ovih celina detaljnije ćemo proći u narednim člancima i ovo je bio isključivo
informativni. U narednom članku idemo i sa konkretnim kreiranjem naših klasa
Zaposlen  Preduzece  i modeliranju našeg sistema.

  važno:  C# je programski jezik koji je case-sensitive tj. razlikuje velika i mala slova.
tako npr. _ime i _Ime su dve različite deklaracije i on će ih tretirati kao dve promenljive.