Objektinis programavimas

Pagrindinės programinės įrangos kūrimo kompanijos (Borland International, Microsoft Corporation ir kt.) daro prielaidą, kad objektinio programavimo technologija palengvins tiek programuotojų, tiek vartotojų darbą su kompiuteriais. Manoma, kad kuriant objektiškai orientuotų programų kodas bus labiau struktūrizuotas, lankstus, modulinis, patikimas ir tinkamas pakartotiniam naudojimui (angl. reusable). Programos, sukurtos naudojant šias technologijas, turės bendrą programos-vartotojo interfeisą, kas palengvins jų įsisavinimą ir padarys naudojimą labiau intuityviu. Kaip pamatysime, objektiškai orientuotas programavimas (OOP) leidžia programuotojams šiandien spręsti sudėtingus uždavinius, kurie anksčiau būtų pareikalavę daug programuotojų pastangų, jei jie iš viso galėjo būti išspręsti.

Nuo pat pradžių objektinio programavimo filosofija buvo vystoma kaip būdas supaprastinti programuotojo darbą. Idėja, kad programų kūrėjai turės rašyti mažiau kodo, nes bendrų operacijų objektai pakartotinai panaudojami ir jų elgesys gerai suprastas. Tai reiškia, kad kai programuotojai kuria programas, naudodami OOP technologijas, jie gali remtis pakartotinai naudojamų objektų bibliotekomis. Šie objektai sudaryti iš nepriklausomų patikrinto kodo blokų su gerai apibrėžtu interfeisu. Dėl OOP prigimties programų kūrimas, remiantis šiomis technologijomis, reiškia visiškai naują mąstymą apie programavimą.

 

Objektinio programavimo apžvalga

Kaip sako pats pavadinimas, objektiškai orientuotas programavimas (OOP) remiasi objekto koncepcija. Visos objektiškai orientuotos programos siūlo galimybes dirbti su vienokiais ar kitokiais “objektais”. Šie objektai modeliuoja būdą, kuriuo žmonės bendrauja su juos supančiu pasauliu. Žmogaus protas atpažįsta diskrečias esybes kaip objektus, kai tai naudinga. Mes žinome tokius objektus kaip gyvūnai, mašinos, namai, laivai, kompiuteriai ir kt. Kiekvienas iš šių objektų turi ne tik charakteristikas (duomenis ar reikšmes), bet ir elgesį (naudojimo metodus), kartu “supakuotus” į vieną visumą.

Pavyzdžiui, mašina turi charakteristikas - ratai, motoras, šasi ir kt., ir naudojimo metodus - judėti pirmyn ir atgal, pasukti, sustoti ir kt. Mes negalvojame apie mašiną kaip apie variklį, sumontuotą ant rėmo su sėdynėmis ir ratais, bet greičiau kaip apie unifikuotą, visuminį objektą. Eiliniam vairuotojui mašinos konstrukcijos detalės nėra svarbios. Vairuodami mašiną, jūs mintyse neatskiriate mašinos charakteristikų nuo jos elgesio.

Anksčiau mes nagrinėjome duomenų struktūras kaip pasyvias. Pavyzdžiui, dažnai duomenis talpinome masyvuose. Tačiau taip saugomi duomenys yra pasyvūs, o išorinė jėga (t.y. funkcija ar procedūra) jais manipuliuoja. OOP duomenų struktūros tampa aktyvios. Duomenų struktūros, vadinamos objektais, sudarytos ne tik iš duomenų, bet ir iš metodų (funkcijų ar procedūrų), manipuliuojančių duomenimis, viskas viename pakete. Objektai nėra pasyvūs, jie turi savo elgesį. OOP duomenys, apibrėžiantys objektą, yra kartu su operacijomis ar kodu, suteikiančiu jam funkcijas, skirtingai negu tradiciniame programavime. Tai leidžia mums kurti tikrai besimodifikuojančias programos struktūras (t.y. besimodifikuojančius objektus). Šis objekto charakteristikų ir elgesio susiejimas vadinamas inkapsuliavimu (angl. encapsulation). Ši idėja yra objektų konstravimo pamatas, t.y. objektas=kodas+duomenys.

Inkapsuliavimas - procesas jungimo savybių (duomenų) ir elgesio (operavimo metodų) į vieną visumą, vadinamą objektu.

Grįžkime prie analogijos su mašina. Kad valdyti mašiną, mes duodame jai komandas, siųsdami jai pranešimus (angl. messages). Šie pranešimai generuojami, manipuliuojant mašinos valdymo prietaisais, tada mes leidžiame pačiai mašinai (objektui) juos interpretuoti ir atlikti reikiamus veiksmus. Mes iš tikrųjų nesirūpiname, kaip mašina gali atsakyti į mūsų pranešimus ar kaip ji keičia savo charakteristikas, t.y. mes galime naudoti objektą, nežinodami kaip jis dirba, jei tik žinome, kaip pasiųsti reikiamą pranešimą, kad atlikti norimą veiksmą. OOP ši koncepcija vadinama duomenų abstrakcija (angl. data abstraction).

Duomenų abstrakcija - galimybė manipuliuoti duomenimis, naudojant rinkinį apibrėžtų operacijų, nežinant vidinio duomenų formato (pavaizdavimo).

Prieš kurdami tikrą objektą, mes turime apibrėžti jo struktūrą, t.y. prieš kurdami tikrą veikiantį objektą, pirmiausia turime sukurti jo šabloną ar prototipą jo konstravimui. Šis procesas panašus į masyvo ar įrašo apibrėžimą. Tačiau kurdami objekto tipą, turime ne tik duomenų saugojimo sistemą, bet ir metodus, kurie operuoja duomenimis. Ši duomenų ir operacijų su jais kombinacija viename tipe yra vienas iš abstraktaus duomenų tipo pavyzdžių.

Abstraktus duomenų tipas - programuotojo sukurtas duomenų tipas, kuriame nustatomas duomenų reikšmių vaizdavimas ir kartu apibrėžiamos galimos šiam tipui operacijos.

Objektinio programavimo terminologijoje duomenų tipas, naudojamas kaip šablonas objektui, vadinamas klase.

Klasė - aibė objekto charakteristikų, kuri yra naujas duomenų tipas, naudojamas kaip šablonas objektų kūrimui, apimantis reikšmes ir operacijas. Klasė yra tipo koncepcijos išplėtimas.

Objekto tipo apibrėžimas ar klasė naudojama kaip šablonas ar prototipas objekto kintamiesiems. Apibrėžtas tokios klasės kintamasis vadinamas tipo egzemplioriumi (angl. instance).

Egzempliorius - aprašytos klasės kintamasis (tikrasis objektas).

Klasė nusako objekto kintamojo formatą. Tam tikro objekto tipo reikšmė vadinama būsena (angl. state).

Būsena - objekto egzemplioriaus reikšmė.

Terminas duomenų abstrakcija reiškia galimybę dirbti su duomenimis, nežinant jų vidinio formato. Su objektais duomenų abstrakcija pasiekiama, siunčiant objektui pranešimus ir tokiu būdu iškviečiant vieną iš jo metodų. Du svarbūs terminai yra metodas ir pranešimas (angl. message).

Metodas - aprašytas klasėje elgesys, apibrėžiantis kaip objektas atsako ar elgiasi, kai jis gauna jam siunčiamus pranešimus (instrukcijas ar įvykius).

Pranešimas - kreipinys į objektą, kad iškviesti vieną iš jo metodų. Pranešimai yra būdas bendrauti su objektais.

Kita analogija, naudinga kalbant apie objektus, yra aktorius. Aktorius scenoje turi tiek charakteristikas, tiek elgesį. Režisierius siunčia aktoriui pranešimus, ir aktorius, atsakydamas į juos, skaito tekstą ir juda scenoje. Be to, skirtingi aktoriai skirtingai elgiasi toje pačioje scenoje.

Kaip buvo pažymėta anksčiau, OOP metodologija leidžia programuotojui inkapsuliuoti objekto tipe objekto atributus ir elgesį. Kai toks tipas sukurtas, jis gali būti panaudotas sukūrimui kitų “palikuonių” objektų tipų, kurie paveldi atributus ir savybes su galimybe pridėti naujus. Paveldėjimas (angl. inheritance) prie bazinio objekto tipo pridėti papildomas charakteristikas ir elgesį.

Paveldėjimas - procesas, kuriame palikuonių klasė įgauna visas protėvio (tėvo) klasės charakteristikas ir elgesį.

Kadangi objektai yra duomenų ir algoritmų paketai, jūs galite sukurti naujus paketus iš egzistuojančių, paveldėdami jų duomenis ir metodus. Be to, šie nauji tipai gali praplėsti protėvių charakteristikas ir veiksmus, kad geriau atitiktų naujas sąlygas ar paskirtį. Galimybė kurti naujus objektus, galinčius paveldėti savybes iš anksčiau apibrėžtų, yra galingas instrumentas. Tai leidžia kurti sudėtingus objektus iš paprastesnių.

Paveldėjimo koncepcija gali būti panaudota sukūrimui hierarchijos objektų, paveldinčių metodus vienas iš kito. Bet kadangi kiekvienas objektas yra egzempliorius, galintis turėti skirtingus duomenis ir veikti skirtingoje aplinkoje, paveldėti metodai dažnai turi būti pamodifikuoti, kad geriau atitiktų naują objekto aplinką. Kad tai padaryti, objektinis programavimas leidžia duoti vieną vardą metodui bendram objektų hierarchijai, bet kiekvienas objektas hierarchijoje realizuoja metodą polimorfiškai savaip. Terminą polimorfizmas galima apibrėžti taip:

Polimorfizmas - galimybė vienodai pavadintą veiksmą realizuoti skirtingais būdais skirtingoms objektų klasėms.

Taigi OOP programuotojai turi pradėti mąstyti apie duomenis ir algoritmus kartu, bet tai nieko naujo. Dirbant su kompiuteriais, dažnai tenka didesnius daiktus dalinti į mažesnes dalis ir OOP sistemos leidžia programuotojams sudėti duomenis ir metodus į objektą, kuris yra nepriklausomas nuo programos, kurioje yra. Tai leidžia programuotojams koncentruotis ties globalesniu požiūriu. OOP neeliminuoja sudėtingų ir sunkių darbų, greičiau jis pakelia į aukštesnį abstrakcijos lygį.

Objekto elgesys kaip “juodos dėžės” leidžia programą daryti labiau modulinę, nesirūpinant “nubangavimo efektu”, sąlygotu nedideliu kodo pakeitimu. OOP dalina dideles programas į modulius ir dirba su duomenimis kaip klasėmis. Vienas iš OOP tikslų leisti programuotojams rašyti programas panašiu būdu kaip ir bendraujant su realiu pasauliu. OOP koncepcijos inkapsuliavimas, duomenų abstrakcija (informacijos slėpimas), paveldėjimas ir polimorfizmas.

Panagrinėkime žaislinę mašiną su distanciniu valdymu. Tokia mašinėlė turi charakteristikas (ratus, motorą, baterijas) ir elgesį (juda pirmyn, atgal, pasuka į kairę ir į dešinę, sustoja ir pradeda važiuoti). Pranešimai, siunčiami iš distancinio valdymo pulto, valdo mašinos veiksmus. Valdyti mašiną galima, nežinant kaip ji interpretuoja gautus pranešimus ir kaip ji atlieka nurodytus veiksmus. Paklausus vaiką, kaip veikia mašina, atsakymas galėtų būti “tikrai gerai”, pabrėžiant faktą, kad objektas gali būti naudojamas, iš tikrųjų nežinant kaip jis veikia. Tęsiant šią analogiją, galime panagrinėti mašinėlę su priekaba, t.y. mes praplečiame objektą pridėdami jam naujas savybes, bet išlaikydami originalios mašinos savybes ir elgesį. Mes galėjome pridėti ir naujas savybes, t.y. sukurti objektą - palikuonį. Kiekvienas iš šių objektų paveldi originalios mašinos savybes ir elgesį. Svarbu, kad mes galime naudoti tą patį distancinio valdymo įrenginį ir siųsti tuos pačius pranešimus bet kuriam mašinos objekto palikuoniui. Be to, jei mes darysime korektiškai pagal OOP projektavimo filosofiją, šie palikuoniai žinos, kaip interpretuoti gautus pranešimus ir galės atlikti pageidaujamus veiksmus savaip polimorfiškai.

 

OOP Turbo Pascal kalba

OOP galimybė buvo įvesta Turbo Pascal versijoje 5.5. Turbo Pascal objektas yra tam tikro specifinio tipo kintamasis (egzempliorius). Objekto tipas aprašomas beveik taip pat kaip įrašo tipas. Objektas, kaip ir įrašas, yra rinkinys komponenčių, nebūtinai vieno tipo. Tačiau objekto komponentės yra ne tik duomenys, bet ir paprogramės. Turbo Pascal dokumentacijoje OOP terminai apibrėžiami taip:

Inkapsuliavimas - naujo duomenų tipo - objektas - formavimas, kombinuojant įrašą ir procedūras bei funkcijas, dirbančias su juo.

Paveldėjimas - apibrėžimas objekto ir jo naudojimas, kad sukurti objekto palikuonių hierarchiją, kurioje kiekvienas objektas palikuonis paveldi priėjimą prie protėvio kodo ir duomenų.

Polimorfizmas - suteikimas veiksmui vieno vardo, naudojamo bendrai hierarchijoje, kai kiekvienas objektas realizuoja veiksmą savo būdu.

Klasė - objekto tipo aprašas. Šis aprašas apima objekto reikšmių aibę ir aibę objektui apibrėžtų operacijų. Turbo Pascal objekto klasė vadinama objekto tipu.

Bendra objekto aprašymo forma:

Type

   Objekto_tipo_identifikatorius = Object

   Lauko_identifikatorius : Duomenų_tipas; {Laukų sąrašas}

   ...

   Funkcijos ar procedūros antraštė;       {Metodų sąrašas}

   ...

end;

Var

   Objekto_kintamasis : Objekto_tipo_identifikatorius;

 

Pastabos:

-         Apibrėžus objekto tipo kintamąjį (egzempliorių), jo duomenys (laukai) ir paprogramės (metodai) gali būti pasiekti kaip įrašo laukai, t.y. naudojant “.” arba sakinį With.

-         Objekto metodai (funkcijos ar procedūros) gali naudoti visus objekto duomenis (nereikia “.”), t.y. metodas tiesiogiai pasiekia savo objekto egzemplioriaus duomenis.

-         Metodo formalių parametrų vardai negali sutapti su duomenų laukais, nes apibrėžiami viename objekte.

-         Visos klasės (objektų tipai) turi būti apibrėžti prieš metodų realizaciją (angl. implementing).

-         Metodų realizacijoje, galima nekartoti formalių parametrų.

-         Rašant metodo realizaciją, prieš metodo vardą reikia prirašyti objekto tipo identifikatorių.

Aprašius objektą, su juo galima dirbti 2 būdais: su juo visu (jo egzemplioriumi) ar su jo komponentėmis (duomenimis ar metodais). Pagal OOP mes galime dirbti su objektu, siųsdami jam pranešimus. Turbo Pascal kalboje pranešimas tai objekto metodo iškvietimas.

Bendra objekto metodo iškvietimo forma:

Objekto_kintamojo_identifikatorius.Metodo_vardas (parametrai