Bihać Developers MeetUp počeo s radom


MeetUp društvena mreža

Prije 15 godina osnivači http://meetup.com društvene mreže imali su na umu nekoliko interesantnih razmišljanja koja su pobudila veliko interesovanje u svijetu. Osnovali su društvenu mrežu MeetUp, koja spaja ljude iz lokalne zajednice sličnih interesa. Naime, osnovna misija MeetUp društvene mreže jeste organizovanje lokalnih grupa i komunikacija kroz Meetup web site radi organiziranja sastanaka, razmjene iskustava, znanja iz određene oblasti i sl. Misija MeetUp društvene mreže predstavlja osnovni postulat svakog demokratskog društva:

MeetUp misija podrazumijeva revitalizaciju lokalne zajednice, pomoć i podrška ljudima cijelog svijeta za samo-organizovanje. MeetUp misija smatra da ljudi mogu mijenjati svoj lični svijet, ili cijeli svijet svojim samo-organiziranjem, koje postaje dovoljno snažno da ima snage da mijenja stvari oko nas. Vođena na ovoj ideji, na društvenoj mreži MeetUp organizovani su milioni ljudi iz raznih područja, društvenih i privrednih oblasti u pomoviranju znanja, u edukaciji, u promoviranju određenih tehnoloških rješenja i sl.

Koliko je ideja zapravo zdrava i snažna pokazuju brojke:

  • svakog mjeseca ovu društvenu mrežu posjeti približno 10 miliona ljudi,
  • broji 9.5 miliona korisnika
  • mjesečno se organizira 280.000 sastanaka
  • aktivnih lokalnih grupa 92.000
  • različitih meetup tema 90.000
  • lokalne grupe iz 45.000 gradova.

MeetUp spaja ljude sa posebnim interesima, koji mogu biti poslovni, edukacijski, socijalni, i bilo koji drugi interesi. MeetUp može okupljati Facebook prijatelje, ali isto tako i prijatelje koji nisu povezani na drugim društvenim mrežama. MeetUp je poseban još i u tome što on predstavlja jedinstvenu zajednicu koja spaja ljude kroz teme i probleme koje ljudi žele da nametnu i diskutuju licem u lice sa članovima. To je jedina društvena zajednica koja fizički spaja ljude.

Šta je Bihać Developers MeetUp grupa

Na ovom tragu grupa nekoliko entuzijasta, kompjuterskih freakova, zaljubljenika u softvare development, iz različitih platformi odlučila je da pokrene Bihać Developers Meetup grupu, čiji je osnovni zadatak razmjena iskustava i promocija razvoja softvera. Ovi ljudi pokušavaju da ljubav prema programiranju pokušaju prenijeti i na druge ljude jer smatraju da je to jedna blagodat koja čovjeka može učiniti prvenstveno sretnim, može mu obezbijediti poslovnu karijeru ili čovjerku biti lijep i interesantan hobi. Poziv “software developer” ili kako ga neki još uvijek zovu “programer” jedan od rijetkih poziva koji se započinje prvo iz znatiželje i ljubavi prema kompjuterima i programiranju, zatim rješavanju matematičkih i sličnih problema, a poslije se pravi karijera. Ono najvažnije, što je u bezbroj primjera i potvrđeno, je da nije nužno da budeš dobar student ili da studiraš kompjutersku nauku da bi bio dobar programer.

Neke od tema o kojima će se pričati na Meetup sastancima su:

  • razvoja softvera na različitim platformama desktop/web/cloud/mobile i različitim OS-ovima,
  • baze podataka, i ORM Framewors
  • cloud computing,
  • umjetna inteligencija, algoritmi mašinskog učenja
  • i druge srodne teme.

Prisustvo na sastancima je slobodno i potpuno besplatno, a svi oni koji žele da saznaju nešto o ovim temama o kojima želimo pričati su dobro došli. MeetUpi će se organizirati na Tehničkom fakultetu u Bihaću, uz podršku Univerziteta i drugih pravnih subjekata iz Bihaća i Unsko-sanskog kantona.

Kako postati član Bihać Developers MeetUp grupe

Bihać Developers prvenstveno cilja na mlade ljude koji tek žele da saznaju nešto oko razvoja softvera – programirnaja, ali i sve populacije od 7 do 77 godina. Prvenstveno se računa na:

  • studente tehničkih usmjerenja, kao i druge studente. ( Op. Neki moji prijatelji koji danas žive od razvoja softvera su završili filozoski odnosno pravni fakultet :))
  • srednjoškolce koji imaju interesa i smisla za programirnaje
  • mlade ljudi koji žele saznati o ovoj branši
  • zaljubljenike, freakove, geekove i ostale manjine,
  • i sve druge

Da bi postao član Bihać Developers MeetUp grupe poterebno je:

  1. Otvoriti račun sa svojim imena na http://meetup.com
  2. Postati član grupe tako što ćete se pridružiti Bihac Developers Meetup  grupi na web stranici: http://meetup.com/bihacdev
  3. sad kada ste postali član, smo je potrebno pratiti objave i najave predavanja i sastanaka te ukoliko imate vremena doći na Tehnički fakultet i prisustvovati sastanku.

Ko organizira sastanke Bihać Developers MeetUp grupe

Bihać Developers Meetup je nastavnak aktivnosti koje je do sada vodila Bihać .NET user grupa, a intencija je da se ova praksa proširi sa drugim temama i platformama. Ideja je podržana kako od Univerziteta u Bihaću i Tehničkog fakulteta, tako i privatnog sektora i softverske kompanije IDK studio i drugih pojedinaca koje možete pogledati na meetup stranici.

Ko sponzorira sastanke Bihać Developers MeetUp

Kako su sastanci i prisustvovanje potpuno besplatni, a Tehnički fakultet i Univerzitet u Bihaću logistički suport i sponzor, to je sada dovoljno da se predavanja i sastanci održavaju. Naravno, sponzori i zainteresirane kompanije koje žele podržati ovakav vid razmjene znanja i promovisanja visokih tehnologija dobro su došle i mogu nam se javiti da sponzorstvo.

Interesuje me kad se održava predavanje

Prvi sastanak Bihać Developers zakazan je 19. (četvrtak) oktobra 2017. godine u 17:00 na Tehnikom fakultetu. Za prvi put smo se odlučili da pričamo općenito o ovoj temi te da prisutnim ispričamo neke od karijara naših ljudi u gradu Bihaću kako su postali Softver Developeri. Već sljedeći sastanak koji planiramo za novembar biće tematski a predavanje pokriti jednu vrlo zanimljivu Web tehnologiju. Ali otom potom..

 

 

Advertisements

Objektno Orjentisano Programiranje- treći dio


Polimorfizam (en. Polymorfism)

Polimorfizam predstavlja najsofisticiraniju osobinu OOP pri kojoj jedan objekat može ispoljavati različite osobine. Naime, pored standarnih funkcja koje se mogu definisati u klasi, OOP koncept dozvoljava da se definišu virtuelne metode. Virtuelne metode se implementiraju na potpuno isti način kao i regularne samo što u svojoj deklaraciji imaju prefiks virtual. Kada se metoda deklariše kao virtualna, polimorfizam dolazi do izražaja samo u slučaju kada se definišu klase koje su izvedene iz bazne klase.
U izvedenim klasama virtuelne metode se mogu “preklopiti” (en. override) tako da imaju potpuno drugačiju implementaciju od one koja se nalazi i baznoj klasi. Na taj način jedan objekat tipa bazne klase može imati dvije različite osobine pri pozivu jedne te iste metode u zavisnosti od toga na koji način je objekat instanciran. Polimorfizam predstavlja jedan od najvažnijih i najznačajnijih fenomena OOP i treba ga koristiti kad god za to postoji potreba.
Virtualne metode se u izvedenim klasama mogu ali i ne moraju deklarisati sa ključnom riječju virtual. Međutim, kod nekih programskih jezika poput C# potrebno je dodati ključnu riječ overide. Virtuelne metode osim u ključnoj riječi za programera nemaju posebnih implementacijskih zahtjeva. Osim što u slučaju kada programiramo sa C++, moramo voditi računa da polimorfizam radi samo u slučaju pointera na objekte. Dakle u koliko instanciramo objekat na stack memoriji ne pokreće se virtuelni mehanizam i nemamo polimorfizam. Razlog zašto polimorfizam radi samo ako su u pitanju pointeri i heap memorija je jednostavan u koliko se poznaje priroda nastanka C++ jezika. Kako je C++ jezik izrastao iz C jezika, koji ima statičnu veličinu za svaki formirani objekat na staku, otud dolazi razlog da se virtualne metode nemogu mijenjati na tako statički definisanom objektu. Međutim u koliko se objekat klase instancira na heap dinamičkoj memoriji, tabela sa virtuelnim metodama se povezuje se i vrši prepoznavanje metoda poziva u vrijeme izvršavanja.
Kako rade virtualne metode može se objasniti na slijedeći način: Prilikom kompajliranja formira se tabela u koju se smještaju virtulne metode iz bazne i svih izvedenih klasa. Prilikom poziva interpreter pretražuje virtualnu tabelu sa listom virtuelnih metoda te poziva onu virtuelnu metodu iz one klase iz koje je objekat instanciran.
Kada govorimo o instanciranju objekata u slučaju bazne i izvedene klase možemo imati sljedeće slučajeve:
1. Objekat tipa bazne klase instanciran sa baznom klasom.
2. Objekat tipa bazne klase instanciran da izvedenom klasom.
3. Objekat tipa izvedene klase instanciran sa izvedenom klasom.
Kada objekat pozove virtuelnu metodu možemo dobiti slijedeće slučajeve shodno gore instanciranim varijantama objekta:
1. Izvršava svirtualna metoda iz bazne klase.
2. Izvršava se metoda iz izvedene klase.
3. Izvrsava se metoda iz izvedene klase.
U drugom slučaju imamo pojavu polimorfizma, dok se u prvom i trećem slučaju radi o standardnom pozivu metode. Sljedeći listing prikazuje naš primjer poziva metode Status iz bazne klase Osoba i izvedene klase Student.

//glavna ulazna funkcija
int main()
{  

	Osoba* os1 = new Osoba();
	Osoba* os2 = new Student();
	Student* os4 = new Student();  

	cout << "Osoba.Status(Osoba) vraća: " << os1->Status().c_str() << endl;
	cout << "Osoba.Status(Student) vraća: " << os2->Status().c_str() << endl;
	cout << "Student.Status(Student) vraća: " << os4->Status().c_str() << endl;  

	system("Pause");
	return 0;
}

Vidimo da u drugom slučaju kada imamo bazni tip Osoba koja je instancirana preko izvedenog tipa Student, pojavu polimorfizma. Istu situaciju bi imali u koliko bi pokrenuli C# verziju napisanog programa. Izlaz ovog programa dat je na narednoj slici:

Osoba.Status(Osoba) vraća: Osoba
 Osoba.Status(Student) vraća: Student
 Osoba.Status(Student) vraća: Student
 -------------------------------------------
 Press any key to continue...

Objektno Orjentisano Programiranje- drugi dio


Strukture Klase

Kako se može vidjeti iz prethodno prkazanih listina, strukturu klase čini nekoliko dijelova:
– kontruktori i destruktori
– tipovi,
– metode.
Svaka klasa posjeduje specijalne metode koje se pozivaju prilikom instanciranja i prije samog uništavanja objekta. U principu najmanje jedan konstruktor i desktruktor može postojati u klasi, odnosno moguće je definisati više od jednog konstruktora, dok jedan destruktor može postojati u klasi. Osnovna osobina konstruktora i destruktora jeste naziv koji mora biti isti kao naziv pripadajuće klase. Kod destruktora ispred naziva se nalazi specijalan simbol tilda. Konstruktor kao metoda nema mogućnost vraćanja vrijednosti, dok može prihvatati argumente kao i svaka druga metoda. Konstruktor koji ne prihvata niti jedan argument zovemo defoltni konstruktor. Konstruktore razlikujemo ne po nazivu (jer svi imaju isti naziv) već po njihovim argumentima. Npr. ukoliko imamo klasu Osoba, koja posjeduje dva konstruktora: Osoba() i Osoba(string ime, string datum). Drugi konstruktor se razlikuje od prvog po argumentima ime i datum. Klasa može imati samo jednog desktruktora, koji se poziva kada se objakat unuštava iz memorije. Tom priliko delociraju se članovi klase koje smo instancirali u heap memoriji ili neki drugi memorijski resursi. Na donjem listingu vidimo kako se deklarišu konstruktori odnosno desktruktor.
Svaka klasa može definisati proizvoljan broj svojih članova. Članovi klase mogu biti osnovni tipovi poput int, char, i dr, kao i svaki drugi izvedeni tip poput time_t odnosno svaka druga klasa. Svaki tip koji je definisan unutar određene klase postaje članom te klase. Kako smo ranije naglasili ono što klasu razlikuje od osnovnih tipova jeste mogućnost deklaracije metoda unutar same klase. Metode koje se deklarišu unutar klase zovemo metode članice, ili kratko članice klase. Metode članice deklarišu se na isti način kao i kod proceduralnog programiranja. Dijelovi metode članice jeste: nivo pristupa, tip vraćanja rezultata, naziv članice, argumenti koje metoda članica prihvata. Kod C++ u tijelu klase samo deklarišemo metodu članicu dok se njena implementacija nalazi izvan klase, s tim što ispred naziva metode nevedemo naziv klase, a zatim naziv metode (vidi donji listing).
Kod C# unutar klase istovremeno deklarišemo i implementiramo klasu. Primjeri deklaracije i definicije klase vidimo na litnigu 8.1, 8.2 i 8.3.
8.1.3 Enkapsulacija koda (en. Encapsulation)
Prvi i osnovni koncept OOP jeste enkapsulacija, koja podrazumijeva implementaciju ponašanja objekta unutar samog tipa. Ovo znači da globalne metode koje se definišu kod proceduralnog programiranja više ne koriste za implementaciju, već da se implementacija isključivo radi preko metoda članica klase. Pored toga što se implementacija enkapsulira u sami tip, uvodi se i kontrola pristupa ovako enkapsulirane implementacije na način da je objekte lakše kontrolisati i zabraniti neovlašten pristup. Gledano sa strane kontrole pristupa članovima klase postoje osnovna tri stepena pristupa koji posjeduju svaki OO jezik:
1. public – javni pristup članu klase. Svaki član koji je dekorisan sa public može biti korištem sa svakog nivoa pristupa tokom programiranja.
2. protected- zaštićeni pristup. Osim članova klase u kojoj je definisan, ovom članu može prostupiti samo još članovi izvedene klase.
3. private – zaštićeni pristup. Ovako označenom članu klase mogu pristupiti samo članovi iste klase.
Specifično za određene programske jezike (c++, c# ili java) postoje još neki nivoi pristupa, poput internal koji dopušta pristup svim članovima istog prostora imena. Međutim ovdje ćemo se zadržati isključivo na osnovna tri pristupna nivoa jer su podržani u svakom OOP jeziku.
Možemo kazati da enkapsulacija vrši preslagivanje koda u metode članice klase koje se označavaju raličitim nivoima pristupa, što kod čini sigurnijim, lakše razumljivijim i lakšim za održavanje. Instanca klase odnosno objekat pristupa samo javno označenim metodama članica. Kako je ranije naglašeno ovakav pristup omogućava lakše organizovanje tima programera u razvijanju istog projekta. Svaki član tog tima lahko može koristiti sve objekte koji su drugi članovi tima razvili, poznavajući samo načine komunikacije sa objektima, bez poznavanja njihove implementacije.
Pokušajmo fenomen enkapsulacije odnosno OOP koncepta objasniti preko realnog primjera. Pretpostavimo jedan fakultet na univerzitetu koji ima nekoliko smjerova. Na fakultetu rade profesori, asistenti i ostali zaposlenici. Oni su svi u službi obrazovanja studenata. Student nakon završetka srednje škole upisuje fakultet. Na samom početku student u studentsku službu predaje osnovne podatke o rođenju, državljanstvu, općem ispjehu u srednjoj školi. Zaposlenica u studentskoj službi otvara novi karton studenta u koji će upisivati sve relevantne informacije o studentovom uspjehu na fakultetu. Kada se otvori novi karton studenta, počinje njegov studentski život ali ne i studiranje. Da bi student imao validan status studenta potrebno je da upiše semestar. U koliko je samo upisao fakultet upisuje prvi semestar. Zatim student pohađa nastavu i polaže kolokvije, pismene ispite, a na kraju za svaki predmet polaže usmeni ispit kojim zaključuje pohađanje predmeta i dobija konačnu ocjenu. Nakon polaganja određenog broja predmeta, student završava semestar i upisuje naredni, i sve tako do kraja studija. Na kraju studija radi diplomski rad kao završni rad. Tokom studiranja student može imati i druge aktivnosti na fakultetu npr. može biti član neke studentske organizacije ili pak neke neformalne grupe za promicanje znanja u nauci ili sportu. Može biti član nekog sportskog tima sa fakulteta i sl. Sve u svemu student kroz studiranje ima pregršt prepreka a i mogućnosti da sa fakulteta izađe kao osposobljena osoba i budući zaposlenik neke kompanije ili državne ustanove. Na osnovu ovog kratkog opisa jednog procesa postavlja se zadatak da modeliramo ovaj proces i napišemo program.
Na samom početku analize ovog procesa možemo identifikovati nekoliko entiteta: fakultet, zaposlenici, profesori, asistenti, smijerovi, predmeti, semestri, student, i drugi manje značajni entiteti. Naravno u ovom primjeru nećemo modelirati sve identifikovane entitete, niti ćemo u detalje opisivati osobine i ponašanje entiteta. Kao primjer uzet ćemo entitet “student” i napisati program koji će opisati neke od njegovih osobina.
Entitet student ima ime prezime, datum rođenja, i ostale detalje koji nisu isključivo vezani samo za studenta, oni mogu biti vezani i za nastavnika kao i za ostale zaposlenike na fakultetu. Stoga kao zajednička osobina svih definisat ćemo klasu Osoba koja će posjedovatri zajedničke osobine studenta, zaposlenika, profesora i asistenata. Primjer ovako definisanog tipa možemo vidjeti na listinzima 1 i 2 za C++, a u listingu 3 za C# programski jezik. U pomenutim listinzima vidimo kako su podaci strukturirani u samom tipu. Svaka osoba posjeduje ime i prezima, datum i mjeto rođenja, bilo da se radi o studentu, profesoru ili nekom drugom entitetu.
Da bi uvidjeli razlike u implementaciji između OOP i proceduralnog programiranja, napisat ćemo kako bi izgledao ovaj program kad bi koristili proceduralno programiranje. U tom smislu definisali bi strukturu Osoba u koju bi stavili osnovne podatke studenta, a pored strukture u glavnom programu bi napisali nekoliko procedura koje bi nam koristile za promjenu statusa studenta, polaganje ispita, upisa godine i druge operacije. Ovo znači da bi glavni program kontrolisao i mijenjao status studenta zajedno sa svim drugim entitetima koje smo pobrojali na početku analize. U C++ gore rečeno mogli bi implementirati na sljedeći način:

struct Osoba
{
    string  imePrezime;
    time_t  datumRodjenja;
    string  mjestoRodjenja;
};  

Osoba osoba;  

void InitOsobe(string ime, string datum)
{
	osoba.imePrezime = ime;  

	//konverzija string u datum
	struct tm tm = { 0 };
	strptime(datum.c_str(), "%d/%m/%Y", &tm);
	osoba.datumRodjenja = mktime(&tm);
}  

string Status()
{
	return "Osoba";
}

Uspoređivanjem OOP implementacije sa implementacijom prikazanom na listingu 8.4, možemo uočiti nekoliko značajnih razlika, prvenstveno načinom definisanja određenih dijelova koda, sigurnosti implementacije, mogućnosti pojavljivanja logičke i kompajlerske greške i drugim aspektima. Kada se porede ove dvije implementacije moguće je zapaziti nekoliko vrlo važnih značajki:
1. Kod OOP koncepta glavni program ne posjeduje implementaciju oko mijenjanja ponašanja objekta tipa Osoba u odnosu na proceduralnu implementaciju,
2. Kod OOP glavni program i svaki drugi modul ne može pristupiti implementaciji sve dok objekat tipa Osoba nije instanciran,
3. Samo instanca Osobe može pristupiti i promijeniti njegovo stanje.
4. Pristup članovima klase:ime, datum i mjesto rođenja, … postižemo kontrolisanim načinom.
Sve navedeno označava prvu karakteristiku OOP koncepta koju zovemo enkapsulacija ili enkapsuliranje implementacije u samu klasu. Vanjski objekti pristupaju metodama klase samo preko njegove instance, dok nekim dijelovima prstup je zabranjen. Proceduralna implementacija koju smo prikazali u Listingu 4 predstavlja sasvim otvorenu implementaciju te svaki dio implementacije može biti mijenjan. S druge strane metode koje smo implementirali se mogu pristupiti u svakoj situaciji bez obzira da li imamo instancu osobe ili ne.

Nasljeđivanje (en. Inheritance)

Dva su načina definisnja nove klase u OOP. Prvi način je da deklarišemo novu klasu definišući njen naziv, a zatim ostale dijelove, odnosno impelmentiramo metode članice. Drugim načinom klasu definišemo tako što ćemo iskoristiti već postojeću klasu i naslijediti svu njenu implementaciju. Drugim načinom uveliko iskorištavamo postojeću implementaciju koju smo već napisali, ili koju je već neko drugi napiso, a zatim dodajemo novu implementaciju koja je potrebna. U procesu nasljeđivanja nova klasa koja se formira zovemo izvedena klasa, dok se baznom klasom zove klasa iz koje smo naslijedili postojeću implementaciju.
Iz same definicije nasljeđivanja vidimo da je ono usmjereno na ponovno korištenje već postojećih implementacija, što je bio jedan od osnovnih problema modularno-proceduralnog programiranja. Sa ovim fenomenom OOP sada možemo izvoditi nove tipove podataka koji imaju već implementiranu osnovnu logiku. Nasljeđivanje najbolje objašnjavamo na primjerima. Ukoliko se vratimo na naš primjer, uočavamo da entiteti student, profesori, asistenti i zaposelnici imaju dosta zajedničnih atributa poput imena, datuma i mjest arođenja i sl. U tom kontekstu možemo iskoristiti baznu klasu Osoba u kojoj su određene zajedničke osobine svih osoba na fakultetu i formirati specijalnu klasu Student koja će reprezentirati isključivo osobine vezane za studente fakulteta. Implementacija ovako zamišljene klase prikazuje donji listing.

class Student : public Osoba
{
//konstruktori klase
public:
	Student();
	Student(string ime, string datum);
	~Student();  

//clanovi klase /atributi
private:
	bool aktivan;
	int semestar;  

	//javne metode clanica
public:
	float ProsjekOcjena();  

	//javne metode clanice
public:
	virtual string Status();
};

Pri definisanju nove klase nasljeđivanjem postoje određena pravila koja je potrebno imati na umu. U principu pri definisanju izvedene klase cijelokupna implementacija bazne klase se nasljeđuje osim konstruktora i privatno označenih članova. Zato je ovo dobro imati na imu tokom implementacije da se određeni članovi klase označe korektnim pristupnim novoom. U slučaju proceduralne implementacije uočavamo da ovaj fenome se ne može implementirati na ovakav način, pa bi u slučaju entiteta Student morali definisati drugi potpuno novu strukturu u koju bi stavili sve članove strukture Osoba, i dodali done članove.

Objektno Orjentisano Programiranje- prvi dio


Objektno orijentisano programiranje (OOP) predstavlja način programiranja pri čemu se definišu objekti koji poprimaju osobine objekata iz realnog svijeta. Nastao na ovom konceptu, OOP s jedne strane proširuje funkcionalnosti osnovnih i izvedenih tipova na način da implementaciju enkapsulira (ugrađuje) u sami tip, dok s druge strane uvodi nove osobine tipova poput nasljeđivanja i polimorfizma koji daju nove funkcionalnosti i način implementacije. Sve tri paradigme OOP (enkapsulacija, nasljeđivanje i polimorfizam) čine objektno orjentisano programiranje efikasnije, lakše za kolaboraciju i održavanje te u većem dijelu rješava probleme proceduralnog programiranja.

Klase

Tipovi podataka u čistom OO jeziku poput C# označavaju se klasama, koje se mogu podijeliti na osnovne i izvedene tipove. Programski jezik poput C++, osnovne tipove ne tretira kao klase, dok klasama označava samo izvedene odnosno apstraktne tipove. Osnovne tipove poput integer, double, float, bool, char u čisto OOP jeziku zovemo klasama jer u sebi enkapsuliraju metode koje nam omogućuju rad nad samim tipovima, na isti način kako to radimo i sa izvedenim tipovima. Izvedeni tipovi su svi tipovi koji su definisani od strane programera.
U čistom objektno orijentisanom programskom jeziku ne postoji mogućnost izvršavanja koda koji nije dio neke klase, odnosno koji nije definisan unutar određene metode kao članice klase. S druge strane ovo implicira da se u objektno orijentisanom programiranju može izvršiti samo onaj kod koji je definisan unutar određene klase, odnosno instanciranjem objekta i poziva neke metode članice. Ovom činjenicom se shvata naziv objektno orijentisano programiranje, kao programirnje objekata.
Naravno, programski jezici nužno ne poštuju ovu strogu činjenicu, a pored toga imaju mogućnost izvršavanja koda izvan objekata klase. Kako je ranije naglađeno programski jezik koji ima ovakvu dualnu osobinu jeste C++. C++ programski jezik je objektno orijentisani jezik koji podržava sve osobine OO koncepta, dok istovremeno predstavlja klasični proceduralno orjentisani jezik. Zbog te činjenice danas C++ jezik predstavlja najrasprostranjeniji i najviše korišten programski jezik. Pogodan je kako za programiranje sistemskih komponenti operativnih sistema i drivera za uređaje, tako i za projekte zasnovane na poslovnoj logici. Deklaracija klase u C++ sa pripadajućim članovima možemo predstaviti u obliku prijera tipa Osoba.

class Osoba
{
    //konstruktori/destruktor klase
public:
    Osoba();
    ~Osoba();  

//clanovi klase /atributi
private:
	string  imePrezime;
	time_t  datumRodjenja;
	string  mjestoRodjenja;  

	//javne metode clanica
public:
	void Init (string ime, string datum);  

	//javne virtualne metode clanice
public:
	virtual string Status();
};

Prethodni listing predstavlja deklaraciju klase Osoba. Implementacija klase u smislu implementacije konstruktora, destruktora i metoda Init i Status nalazi se izvan tijela klase, a često u posebnoj cpp datoteci. Primjer implementacije klase Osoba vidimo na sljedećem listingu.

//defoltni konstruktor
Osoba::Osoba()
{
    imePrezime = "n/a";
}  

//destruktor klase
Osoba::~Osoba()
{
}  

//virtuelna metoda koja vraca status osobe
string Osoba::Status()
{
	return "Osoba";
}  

//postavljanje imena i datuma rodjenja osobe
void Osoba::Init(string ime, string datum)
{
	imePrezime = ime;  

	//konverzija string u datum
	struct tm tm = {0};
	strptime(datum.c_str(), "%d/%m/%Y", &tm);
	datumRodjenja = mktime(&tm);
}

Prethodni listing čini implementacija kontsruktora koji se poziva prilikom formiranja objekta Osoba, dok se implementacija dstruktora nalazi odmah iza. Metoda Init postavlja ime i datum rođenja za osobu, dok metoda Status vraća string sa nazivom vrste osobe.
C# i Java predstavljaju najpopularnije OO programske jezike pored C++, u kojima sve počinje sa objektima, i nije dozvoljeno definisanje metode izvan klasa. Specijalna metoda koja označava ulaznu ili početnu tačku zove se main metoda. Ovu metodu je dovoljno definisati u bilo kojoj klasi, a kompajler će je prepoznati kao početnu metodu i označiti je kao ulaznu tačku programa. Primjer listing 1 i 2 u C# izgledaju na slijedeći način:

public class Osoba
{
	//konstruktori/destruktor klase
	public Osoba()
	{
		imePrezime = "n/a";
}  

~Osoba()
	{  

	}  

	//clanovi klase /atributi
	private string      imePrezime;
	private DateTime    datumRodjenja;
	private string      mjestoRodjenja;  

	//javne metode
	public void Init(string ime, string datum)
	{
		imePrezime = ime;
		DateTime dat;
		if(DateTime.TryParse(datum, out dat))
			datumRodjenja= dat;
	}  

	//javne virtualne metode clanice
	public virtual string Status()
	{
		return "Osoba";
	}
};

Iz prethodnih listinga možemo vidjeti određenu razliku u deklarisanju i implementaciji klase i njenih članova. U C++ vidimo da je deklaracija i implementacija metoda članica klase razdvojena. Za razliku od C++ u C# deklaracija i implementacija klase u C# se ne razdvajaju, tako da se svaka metoda članica deklariše i implementira na jednom mjestu.

Prvi OOP programski jezik i kako su nastali objekti u programiranju


Kada su softverske kompanije zaključile da sa postojećim tehnikama ne mogu na optimalan način razvijati i unapređivati svoja rješenja, i kada su shvatili da će projekti kasniti i neće zadovoljavati sve viši standard koje su kupci zahtijevali, počelo se razmišljati oko takve tehnike programiranja koja bi u mnogome olakšala razvoj novih i održavanje postojećih rješenja. Uvidjelo se da postojeći programski jezici moraju pretrpjeti promjene u koliko se želi da izvorni kôd bude lakši za razumijevanje, jednostavniji za izmjene nakon isporuke, sigurniji za upravljanje podacima korisnika, a prije svega žečjelo se postići veća efektivnost softverskih timova koji su redundantnim poslovima umanjivali svoju efikasnosti, što je dovodilo u pitanje u većini slučajeva likvidnost kompanija.

Desetak godina ranije, tačnije sredinom šezdesetih godina prošlog stoljeća NASA je ekperimentirala sa objektno orijentisanim osobinama programskog jezika SIMULA [11]. Ove aktivnosti ostale su u okviru istraživanja i nisu dobile potreban publicitet, da bi nešto kasnije bio objavljen prvi objektno orijentisani programski jezik nazvan Smalltalk. Smalltalk je objavljen 1970. godine od strane kompanije Xerox PARC, a što se smatra prvim objektno orijentisanim programskim jezikom. Smaltallk bio je djelo grupe inženjera koji su radili u Learning Research Group (LRG), a među poznatim licima koji se vežu za Smalltalk su: Alan Kay, Dan Ingalls, Adele Goldberg i drugi. Prva verzija ovog jezika bila je Smalltalk-71 urađena 1971 godine. Odmah nakon ove verzije uslijedile su modifikacije jezika, koje su između ostalog pronađene i u programskom jeziku SIMULA. Nakon više godina unapređenja ovog programskog jezika konačno je uslijedila i prva javno dostupna verzija prvog objektno orijentisanog jezika 1980. godine, dok je 1983 objavljen je prvi priručnik za korištenje ovog jezika [12].

beyond_java_i_2_tt7

S druge strane 1979. godine mladi inžinjer iz Bell (sada AT&T) Laboratorija, Bjarne Stroustrup, počeo je eksperimentirati sa dodacima za C programski jezik. Njegova namjera je bila da pronađe bolji alat za implementaciju velikih projekata, koji su u tom periodu imali velike probleme u samom održavanju i kompleksnosti rješenja. U tom vremenu, prosječan projekat sastojao se od 10.000 linija kôda (LOC). Da se zadovolje zahtjevi velikih projekata i tima programera Bjarne nastoji u C programski jezik unijeti osobine objektno orjentisanog programiranja viđene kroz Simula i Smalltalk. Nekoliko godina rada na dodacima Bjarne 1983. godine objavljuje novi programski jezik nazvan prvo C sa klasama a kasnije C++, a koji je bio nadogradnja C programskog jezika. Kako ga je njegov tvorac zamislio, C++ u sebi sadržava klase kao osnovne tipove objektno orjentisanog programskog jezika.

I pored toga što je Simula, a zatim nešto kasnije Smalltalk prvi objektno orjentisani programski jezici, ipak OOP koncept se nije masovno proširio sve dok programski jezici poput C++, Pascal i Delphi nisu evoluirali u OOP jezike. Masovna upotreba OOP koncepta veže se za drugu polovinu 80-tih godina prošlog vijeka. I danas možemo kazati da su ovi jezici najrasprostranjeniji i najviše u upotrebi. Osim toga značajan datum u evoluciji programskih jezika u OOP jezike jeste i 1995. godina kada se pojavljuje Java programski jezik. Nekoliko godina kasnije, odnosno 2001. godine [13] Microsoft obznanjuje svoj .NET Framework i novi programski jezik C# koji po svojoj strukturi spada u grupu OO programskih jezika.

Danas mnogo godina kasnije možemo kazati da su C++, Java i C# najrasprostranjeniji objektno orijentisani programski jezici u kojim se piše skoro 90% svih današnjih velikih softverskih projekata.

Reference

[11]  R. W. Sebesta, Concepts of Programming Languages, New York: Addison-Wesley, 2012.
[12]  A. Goldberg, Smalltalk-80 THe Interactive Programming Environment, London: Addison-Wesley, 1983.

[13] http://www.microsoft.com

Moj prvi program


Izvršavanje napisanog programa predstavlja vrlo jednostavan proces pri kojem program od korisnika zahtjeva ulazne podatke, a korisnik od programa očekuje da vrati rezultat odnosno da prikaže izlazne varijable kao traženi rezultat. Ovaj jednostavan proces izvršavanja programa nimalo nije sličan procesu njegovog nastajanja odnosno pisanja. Često program koji pišemo predstavlja dug, zamoran i frustrirajući proces implementacije, testiranja, debugiranja i korekcije. Između svake pobrojane stavke možete staviti litre popijene kafe ili čaja. Jednom kada naš program radi ispravno, svodi se na proces koji smo na početku opisali. Pisanje programa u bilo kojem programskom jeziku za mnoge a posebno developere predstavlja poseban izazov. Prije svega program predstavlja zapis određene količine znanja o nekom problemu. Ono je pohranjeno u elektronskom obliku kojeg možemo koristiti kad god želimo bez bojazni da će ono biti zaboravljeno.

Na primjer kada posmatramo program Kalkulator vidimo da on predstavlja skup određenog znanja iz područja algebre odnosno množenja, dijeljenja, logaritmiranja, trigonometrijskih i drugih transcedentnih funkcija. To je znanje trajno zapisano u digitalni oblik i kad god želimo da ga iskoristimo pokrenut ćemo program i obaviti određenu matematičku operaciju. Iz razloga što napisani program predstavlja akumuliranu količinu znanja, ono prije svega predstavlja neku posebnu vrstu ljudskog stvaranja, koju većinom koriste ljudi koji u opće nemaju to znanje. Kod primjera Kalkulator kojeg smo naveli, većina ljudi poznaje sabiranje, oduzimanje množenje, medjutim algebarske operacije mogu biti jako komplikovane za čovjeka ako koristimo velike brojeve, ili pak trigonometrijske ili logaritmaske funkcije manje poznatih uglova i brojeva.
U kontekstu korištenja programa jedan od najboljih primjera je igranje video igara. Opće je poznato da programiranje video igara predstvlja jedan od najkompleksnijih poslova softverskih inženjera. Da bi bili sposobni programirati video igrice ili razvijati engine za razvoj video igara potrebno je pored znanja razvoja softvera imati znanje iz matemtike posebno vektora, analitičke i diferencijalne geometrije i drugih područja matematike i sličnih nauka. Korisnici takvih kompleksnih softverskih proizvoda su uglavnom djeca od nekoliko godina do odraslih. Većina njih ni neposjeduje osnovne vještine razvoja softvera jer im to nije ni potrebno niti se u budućnosti žele s tim baviti. Upravo zbog ove činjenice programi predstavljaju poseban proizvod kod kojeg njegovi kreatori (developeri, razvojni inžinjeri, softverski arhitekti) imaju poseban odnos.

U ovom poglavlju biće prikazana tri jednostavna listinga u tri različita programska jezika, FORTRAN, C++ i C#. Intencija knjige je da općenito približi problematiku programiranja bez obzira kojim jezikom programer piše. Kroz cijeli tekst prikazat će se osnovne osobine svakog programskog jezika, i navesti ključne riječi koje su sasvim dovoljne da se čitalac upozna sa osobinama programskih jezika, te da u svakom od njih može pisati programe. Intencija ove knjige je da rješenje problema bude neovisno od programskog jezika, jer algoritam koji rješava problem predstavlja najvažniji korak u pisanju programa. Kada znamo algoritam rješenja problema, pisanje programa predstavlja samo jednu of faza pisanja programa. Dakle pri rješavanju problema akcenat će biti na algoritmu, dok će implementacija algoritma u specifičnom programskom jeziku biti u drugom planu. Nekada će program biti napisan u pseudo kodu, koji je lahak za razumijeti i prepisati u neki od postojećih programskih jezika. Kada implementacija određenog algoritma bude zahtijevala dodatna obrazloženja ona će biti navedena za svaki programski jezik ponaosob.
Naš prvi program neće imati nikakvih ulaznih podataka, a kad se pokrene kao rezultat prikazat će rečenicu “Moj prvi napisani program”. Napišimo zadatak za pri program.

Zadatak 1: Napisati program koji na konzolu (izlazna jedinica) ispisuje “Moj prvi napisani program”.

U FORTRAN jeziku jedno od rješenja zadatka 1 može biti:

! glavna ulazna funkcija  
program PrviProgram  
  
  implicit none  
  integer re_i  
 
  write(*,*) "Moj prvi napisani program!"  
  
  re_i = system("pause")  
  end

Listing 2.1 Rješenje zadatka 1 u FORTRAN jeziku

Kod FORTRAN jezika za ispis na konzolu koristi se ključnu riječ write koja je sastavni dio programskog jezika. Kod pisanja programa u FORTRAN jeziku potrebno da program započinje ključnom riječju program a zatim nazivom programa (Listing 2.1), dok završava ključnom riječju end, odnosno end program PrviProgram. Svaki program u ovom jeziku mora zadovoljavati ove uvjete. FORTRAN za razliku od C++ i C# nije osjetljiv na velika i mala slova, tako da svaka ključna riječ može se pisati malim ili velikim slovima ili miješanjem velikih i malih slova. Tako da ključna riječ program može biti napisana i PROGRAM ili pRoGrAm.
U C++ jeziku jedno od rješenja zadatka može biti:

#include <iostream>  
using namespace std;  
//glavna ulazna funkcija   
int main()  
{  
    cout << "Moj prvi napisani program!" <<endl;  
  
    system("Pause");  
    return 0;  
}

Listing 2.1 Rješenje zadatka 1 u C++ jeziku

Svaki program napisan u C++ mora imati započinjati sa ključnom riječju include s kojom naš program povezujemo sa eksternim bibliotekama koje su potrebne za pisanje programa. U naš zadatak povezali smo biblioteku iostream koja služi da bi koristili metode za ispis i čitanje sa konzole, odnosno da bi koristili klasu cout za ispis na konzolu. Uviđamo da C++ ne posjeduje ključnu riječ sličnu FORTRAN jeziku za ispis na konzolu, write. Pored uključivanja određenih biblioteka, svaki C++ program kao početnu tački odnosno metodu ima metodu koja se zove main. Ova metoda ima nekoliko varijanti u smislu da prihvata različit broj argumenata. Tako da main metoda ima slijedeće varijante:

int main( );
int main( int argc, const char** argv );

U slučaju kada main metoda prihvata argumenta, tada pri pokretanju programa je moguće postaviti vrijednosti za date argumente.
U C# jeziku jedno od rješenja zadatka 1 moze biti:

using System;  
  
namespace KnjigaCSharp  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
           Console.WriteLine("Moj prvi napisani program!") 
  
        }  
    }  
}

Listing 2.3 Rješenje zadatka 1 u C# jeziku

U koliko posmatamo C# verziju vidimo da smo koristili standardnu metodu WriteLine klase Console koja čini sastavni dio .NET frameworka koji predstvlja okolinu ili okvir u kojem radi C#. Izvan .NET Frameworka C# ne može da radi. Pri pisanju programa u C# potrebno je slično kao u C++, koristiti biblioteke iz .NET Frameworka, definisati prostor imena (en. namespace) i definisati klasu koja sadrži najmanje jednu metodu koja se zove main. Ralog zašto je u C# potrebno sve ovo deklarisati prije same implementacije main metoda jeste što C# predstavlja čisti objektno orijentisani programski jezik kod kojeg sve počinje sa klasama odnosno instancama klasa koje zovemo objekti.

Alati za programiranje II dio


IDE Integrated Development Environment

Danas programi se pišu u posebnim programima za editovanje izvornog koda. Ovi programi sadrže mnoštvo pomoćnih alata koje programerima pomažu tokom pisanja programa. Svi ovi programi integrirani su u jednu aplikaciju koju zovemo Integrated Development Environment, IDE, odnosno integrirana razvojna okolina.
Editor koda predstavlja osnovni alat a jedna od osnovnih mogućnosti editora jeste da ključne riječi, komentare, brojeve, stringove i druge dijelove koda prikazuje različitim bojama i različitim fontom. Ovaj alat zove syntax highlighting ili u prevodu označavanje sintakse.
Pored editovanja koda, druga najvažnija mogućost ovih programa je debugiranje ili mogućnost prolaska kroz linije koda u toku izvršavanja programa. Ovakav alat koji služi za pronalaženje grešaka u programu za vrijeme njegovog izvršavanja kratko zovemo debugger. Na ovaj način programeri imaju mogućnost da ispitaju kod kada program radi. Ovo je jedan od najvažnijih alata koje danas programeri imaju na raspolaganju, i prosto je nemoguće zamisliti razvoj nekog većeg projekta bez debuggera.
Pored editora koda i debuggera treći po važnosti alat za programiranje jeste tzv „Code Compleation“ programi, koji pomažu u odabiru naziva biblioteka i metoda tokom pisanja koda. Naime, kada programer započne da piše neku ključnu riječ ili naziv neke metode, program mu preko plivajućeg prozora nudi nazive metoda koje su dostupne. Različiti programi imaju različite nazive za ovaj alat, ali se generalno može nazvati „Code Compleation“. U Microsoftovom Visual Studio ovaj alat se zove Intellisense. Na slici 2.5 možemo vidjeti Intellisense u akciji.

knjig_ubuntu_terminal 05

Slika 2.5 Intellisense iskačući prozor u Visual Studio 2013

Microsoft Visual Studio

Danas sa sigurnošću možemo tvrditi da je Visual Studio kompanije Microsoft najpoznatiji, najsofisticiraniji IDE za pisanje programa. Ovaj IDE podržava nekoliko programskih jezika: C++, F#, C#, VB, JavaScript, Typescript, Python. A moguće je programirati za nekoliko platformi poput Windows Desktop, Windows Stope App, Windows Phone, Web Sites, Android i iOS. Sadrži bezbroj alata za olakšavanje pisanja koda, pregršt debuggerskih alata, alata za analizi koda, testiranje aplikacija, kontrola performansi i mnoge druge alate. Možemo slobodno kazati da je Microsoft najdalje otišao u razvoju alata za programiranje.

knjig_ubuntu_terminal 06

Slika 2.6 Visual Studio 2013 Ultimate Startni prozor
Moguće ga je skinuti i u besplatnoj verziji u tzv Express ili Community verziji koju ćemo koristiti tokom demonstarcije prijemjera u C++ i C#. Instalacija ovog alata je vrlo jednostavna dovoljno je pokrenutu web Installer datoteku koja se može skinuti sa http://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx, te u nekoliko klikova instalirati ovaj IDE.
Verzija Visual Studia koja će se koristiti ovdje, a koja se može skinuti besplatno sa pomenute stranice ima naziv: Visual Studio 2013 for Windows Desktop.

knjig_ubuntu_terminal 07

Slika 2.7 Web Site za Visual Studio 2013 Express for Windows Desktop
Klikom na link Download, pokreće se proces preuzimanja i instalacije programa. Instrukcije o instalaciji i preuzimanje nalazi se na datoj web stranici.

Code::Blocks Open Source IDE za C++ i FORTAN

Drugi program koji će se koristiti za demontraciju pisanja programa u FORTRANu jeste Code::Blocks. Ovaj program predstavlja open source projekat koji je dostupan kako na Windows tako i Linux baziranim OS. Zvanična web stranica ovog IDE je http://www.codeblocks.org. Preuzimanje programa za Windows OS se nalazi na adresi: http://www.codeblocks.org/downloads/26#windows.
Prilikom instalacije ujedno se instalira i C++ kompajler, te nakon završetka procesa instaliranja moguće je odmah pisati i pokretati C++ programe.
Međutim, u koliko želimo programirati u FORTRAN programskom jeziku, moguće je preuzeti prilagođenu verziju Code::Blocksa za FORTRAN sa adrese: http://sourceforge.net/projects/cbfortran. Ova verzija IDE dolazi bez FORTRAN kompajlera koji se može instalirati sa http://sourceforge.net/projects/mingw-w64/ lokacije. Prije samog korištenja pisanja programa potrebno je podesiti putanje za kompajler. Putanje za kompajler podešavamo preko menia Settings->Compilers.

knjig_ubuntu_terminal 08

Slika 2.8 Podešavanje putanje kompajlera za FORTRAN
Code::Blocks posjeduje i debugger za fortran pa ga je dobro podesiti na samom početku instalacije. Slijedeći dijalog prikazuje putanju i podešavanje debuggera.

knjig_ubuntu_terminal 09

Putanje koje se podešavaju, dobijaju se sa lokacije na kojoj je instaliran MinGW. Preporučena lokacija za instalaciju MinGW je C:\MinGW. Nakon uspješno podešenog kompajlera IDE je spreman za pisanje programa.

knjig_ubuntu_terminal 10

Slika 2.9 Code::Blocks verzija prilagođena za FORTRAN