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...
Advertisements

Uvod u R jezik i mašinsko učenje- youtube lekcije


Do sada urađeno 7 kratkih lekcija u kojima sam pokusao objasniti osnove programskog jezika R i kako koristiti funkcije za statističku i analitičku obradu podataka. Kratkih uradaka biće još, ovo je samo početak. U narednom tekstu možete vidjeti sve do sada objavljene lekcije.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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.

C# Implementation of the Finite Element method


I have just published the source code for Finite element method at GitHub. You can find it at https://github.com/bhrnjica/bhmke.

The project is at very beginign stage, and contains very few samples and implementation.

Currently you can solve simple plane load problem, and calculate node displacement.

The more code will be added soon.

The project will be Cross OS and Cross Platform, and will be complatible with .NET Core.

 

Šta je bilo prvo, kompjuter ili program, ko je prvi programer koji je živio na zemlji?


Blog post objavljen uz najavu MSNetwork 4 konferencije. msnetwork5

MS NetWork konferencija predstavlja najbolji i najmasovniji IT događaj u našoj zemlji, sa najvećom koncentracijom IT stručnjaka na jednom mjestu. Iz godine u godinu postaje sve bolja i bolja, a siguran sam da će se u tom pravcu nastaviti i po četvrti put. Ono po čemu ova konferencija ostaje zapamćena jeste po ljudima koje sretneš, idejama koje razmjenjuješ, i diskusijama koje vodiš. I sve to se dešava vrlo neformalno i opušteno pa diskusije nekad odu u vrlo čudnom, ali svakako zanimljivom smjeru.

Prije par dana razmišljao sam o tome šta je bilo prvo, kompjuter ili program? Vjerojatno su neki već čuli ovu priču. Kako se može napraviti program, a da kompjuter ne postoji? To je svakako jedno je od logičkih pitanja ovdje. Ali, ko je bio prvi programer?

Ovdje ćemo pokušati odgovoriti na pitanje iz naslova, a diskusija će biti vjerojatno predmet nekih kružoka na konferenciji. Činjenica da smo generacija koja živi u doba personalnih kompjutera, interneta i pametnih telefona, čini nas privilegovanom generacijom. Današnji stepen razvoja tehnologije, koja je prisutna u svakodnevnom životu, rezultat je evolucije ljudskog bića, a prije svega istrajnog rada i odricanja stotina nadarenih ljudi tokom hiljada godina ove civilizacije. Samo možemo pretpostaviti koliko je genijalnih ljudi živjelo na zemlji koji su doprinijeli današnjem naučnom stepenu, a koji su pali u historijski zaborav zbog nepostojanja zapisa o njima ili zbog činjenice da su skončali život zato što se nekom lokalnom vladaru nisu svidjela njihova promišljanja. Bilo kako bilo, danas se historija tumači na osnovu ostavštine pisanih i stvaralačkih djela koja svjedoče o permanentnoj genijalnosti ljudskog roda. Kao što je poznato, zanimanja softverskog inženjera, programera ili IT inženjera, prvenstveno se percipiraju kao muški posao, iako imamo mnogo primjera gdje su žene razvile sjajne karijere u IT industriji, no ogromnu većinu ipak čini muška populacija.

Nakon ovakvog faktičkog stanja danas, ne možemo ni pomisliti da je prvi programer bila žena, i to kakva žena. Priča o prvoj programerki dosta dugo je bila daleko od javnosti, jer to tada uopće nije bilo važno. Međutim, kada je kompjuterska nauka počela da postaje nešto oko čega se vrti veliki novac, i kada su počeli da se razvijaju programski jezici visokog nivoa, tek tada su ljudi počeli kopati po starim arhivama i tražiti ko je to bio prvi programer u historiji čovječanstva, i šta je prvo nastalo, kompjuter ili program.

Mnogo prije prvih programskih jezika, nije bilo popularno praviti razliku između hardvera i softvera, pa na primjer kad se kaže „isprogramirati“ bilo je slično kao kad se kaže „zalemiti“ ili „zavariti“ Možete zamisliti kako bi ljudi prije 100 ili više godina pomislili kad bi kazali da ste našli bug u programu. Historija kaže da je prvi uređaj koji se mogao isprogramirati konstruisao Charless Babbage, dok se za prvog programera tog istog uređaja smatra kćerka engleskog poete i lorda, Augusta Ada King Lovelance (1815-1852.). Ova mlada žena bila je privržena prirodnim naukama, prvenstveno matematici, a otac ju je iz milja zvao „Princeza paralelograma“. Danas kad bi nekoj ljepšoj polovini dao kompliment da je kao paralelogram, vjerojatno bi dobio „petaka iza ušiju“.

babbage

Babbageov dizajn mehaničkog kompjutera služio je za izračunavanje polinomskih funkcija, a mogao se instruirati da izvršava zapisani program. Program zapisan na karticama sekvencijalno bi izvršavao mehanički kompjuter. Zanimljivo da se ova mašina za računanje sastojala od mlina (eng. mill) i skladišta (eng. storage), koji po funkciji koji su obavljali odgovaraju današnjim procesorima i memoriji. Ovakva mašina trebala je posebno educirane ljude koji bi izrađivali programe, a tu dolazimo do Ade i njene uloge u svemu ovom.

babbageengine

Babbageova mašina koja se mogle programirati.

Kako navode izvori u periodu 1842-43, Ada je radila na prevodu Babbagovih predavanja oko najnovijeg mehaničkog kompjutera tzv. analitičke mašine, koju je Babbage dizajnirao poslije neuspjeha sa prvom mašinom iz 1822. godine. Kako je Ada bila upoznata s njegovim radom na prvoj mašini, napravila je posebnu sekciju u kojoj je elaborirala razlike u dizajnu. U tu svrhu napravila je primjer programa koji računa Bernulijeve brojeve. Njena implementacija računanja Bernulijevog niza racionalnih brojeva smatra se prvom implementacijom kompjuterskog programa, a Ada kao prvi programer, odnosno programerka.

Augusta Ada King Lovelance (1815-1852.)

Augusta Ada King Lovelance (1815-1852.)

Ada se 1842. godine našla u službi prevodioca Babbagovih predavanja, koje je držao na Univerzitetu u Torinu. Naime, ova predavanja posredno su bila prevedena na francuski jezik i objavljena u Ženevskoj biblioteci, kada je Ada bila zamoljena da ova predavanja prevede na engleski jezik. Tokom prevođenja Ada je davala određene komentare i pojašnjenja na prevod, a njena posebna Sekcija G sadržavala je program napisan za računanje Bernulijevih brojeva.

Slučajno ili ne, prevod Babbagovih predavanja koje je Ada prevela čekali su više od 100 godina da ponovo vide svjetlo dana i da postanu historija. Naime, 1953. godine nacrti Babbagove analitičke mašine postali su i formalno najstariji zapisi koji govore o prvom modelu kompjutera, a Adini zapisi kao prvi napisani kompjuterski program. Na žalost, Charless Babbage nikad nije završio svoj mašinski kompjuter. Mnogo godina kasnije, tačnije 2008. godine, Babbagov prvi kompjuter ipak je konstruisan i nalazi se u Computer Museum History u Kaliforniji.

Konačno, dolazimo do odgovora, šta je prvo nastalo kompjuter ili program? Vjerojatno ste se pitali kako se može napraviti program za kompjuter koji ne postoji. Ipak, tako se i desilo, Ada napravila program za kompjuter koji nikad nije bio napravljen, a prvi programer u stvari je bio žena. Krajem sedamdesetih i početkom osamdesetih godina prošlog stoljeća, u čast prvog programera nastao je programski jezik nazvan ADA. Historija se poigrala sa prvim programiranim kompjuterom i prvim programom, na način da kompjuter nije bio napravljen, a program testiran. Radujem se nastavku diskusije na konferenciji!

PS: pictures are taken from http://www.computerhistory.org/babbage/

How to run code daily at specific time in C# Part 2


dailyruncode

Few months ago I wrote blog post about how to run code daily at specific time. I dint know that the post will be the most viewed post on my blog. Also there were several questions how to implement complete example. So today I have decided to write another post, and extend my previous post in order to answer thise question as well as to generalize this subject in to cool demo called Scheduler DEMO.

The post is presenting simple Windows Forms application which calls a method for every minute, day, week, month or year. Also demo shows how to cancel the scheduler at any time.

The picture above shows simple Windows Forms application with two  numeric control which you can set starting hour and minute for the scheduler. Next there is a button Start to activate timer for running code, as well as Cancel button to cancel the scheduler. When the time is come application writes the message on the Scheduler Log.

Implementation of the scheduler

Scheduler is started by clicking the Start button which is implemented with the following code:

/// <summary>
/// Setting up time for running the code
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void startBtn_Click(object sender, EventArgs e)
{

    //retrieve hour and minute from the form
    int hour = (int)numHours.Value;
    int minutes = (int)numMins.Value;

    //create next date which we need in order to run the code
    var dateNow = DateTime.Now;
    var date = new DateTime(dateNow.Year, dateNow.Month, dateNow.Day, hour, minutes, 0);

    listBox1.Items.Add("**********Scheduler has been started!*****");

    //get nex date the code need to run
    var nextDateValue=getNextDate(date,getScheduler());

    runCodeAt(nextDateValue, getScheduler());

}

When the time is defined then the runCodeAt method is called which implementation can be like the following;

/// <summary>
/// Determine the timeSpan Dalay must wait before run the code
/// </summary>
/// <param name="date"></param>
/// <param name="scheduler"></param>
private void runCodeAt(DateTime date,Scheduler scheduler )
{
    m_ctSource = new CancellationTokenSource();

    var dateNow = DateTime.Now;
    TimeSpan ts;
    if (date > dateNow)
        ts = date - dateNow;
    else
    {
        date = getNextDate(date, scheduler);
        ts = date - dateNow;
    }

    //enable the progressbar
    prepareControlForStart();

    //waits certan time and run the code, in meantime you can cancel the task at anty time
    Task.Delay(ts).ContinueWith((x) =>
        {
            //run the code at the time
                methodToCall(date);

                //setup call next day
                runCodeAt(getNextDate(date, scheduler), scheduler);

        },m_ctSource.Token);
}

The method above creates the cancelationToken needed for cancel the scheduler, calculate timeSpan – total waiting time, then when the time is come call the method methodToCall and calculate the next time for running the scheduler.

This demo also shows how to wait certain amount of time without blocking the UI thread.

The full demo code can be found on OneDrive.