Objektai

Vakar vienas mano tinklaraščio skaitytojas pasidžiaugė mano straipsnių apie programavimą gausa ir įdomumu, bei paprašė plačiau papasakoti apie objektinį programavimą ir jo teikiamus privalumus. Kadangi pereiti nuo bet kokio programavimo iki tvarkingo (nebūtinai objektinio) programavimo pradedantiesiems dažnai būna sunku, tai aš pabandysiu paaiškinti kas yra objektas, kodėl programuotojai savo kodą skirsto į objektus ir kaip visą tai galima panaudoti praktikoje. Be to, šis straipsnis nebus visiškai nukreiptas į programuotojus, todėl jis turėtų pasirodyti įdomus ir kitiems, kompiuteriais besidomintiems, skaitytojams - jame nagrinėsiu ne programavimo kalbų subtilybes, o aiškinsiu bendrą objektinio programavimo sampratą.

Kas yra objektas? Į šį klausimą būtina žinoti atsakymą norint suvokti objektinio programavimo esmę. Pradėkime nuo to, kad objektu galima laikyti bet kokį realų ar įsivaizduojamą kūną, pvz.: katę, namą, knygą, mašiną ir t.t. yra objektai. Žinoma programavime objektai dažniausiai atspindi loginį kūną ar duomenų struktūrą, tačiau vis tiek objektai programavime yra panašūs į realaus gyvenimo objektus. Turbūt jums kilo klausimas, o kokia prasmė skirstyti kodą į objektus? Pirmiausia, objektas apibrėžiamas įvairias parametrais, iš kurių svarbiausi yra jo funkcijos arba veiksmai, kuriuos galima atlikti su objektu. Įsivaizduokime realų objektą knygų lentyną, kurią apibrėžėme jos talpa. Su knygų lentyna galime atlikti šiuos veiksmus: įdėti knygą, rasti knygą, paimti rastą knygą, perkelti rastą knygą, suskaičiuoti knygas ir pan. Matome, kad mūsų objektas yra konkretus daiktas, kuris turi keletą parametrų (dydį, spalvą ir pan.) ir apibrėžtus veiksmus, kuriuos galime su juo atlikti.

Objektai visose kalbose apibrėžiami vienodai - klasėmis. Klasė, tai rinkinys funkcijų bei kintamųjų pagal kuriuos ir sukuriamas objektas. Nemažai pradedančiųjų programuotojų galvoja, kad klasė ir yra objektas, tačiau tai nėra tiesa - klasė yra tik objekto struktūros aprašas ir iš vienos klasės galima sukurti neribotą kiekį objektų. Kartais žmonės sutrinka ir dėl to, kad klasė gali būti panaudojama keliems objektams, tačiau tai yra gana aišku, nes juk mes galime naudoti ne vieną knygų lentyną - vietoje pirmajame pavyzdyje naudotos knygų lentynos galime naudoti tris lentynas. Visos trys lentynos gali būti skirtingos, tačiau visų jų funkcionalumas (veiksmai su jomis) bus apibrėžtas vienodai. Taigi galime drąsiai sakyti, kad objektas yra realių kūnų atitikmuo programavime ir kiekvienas objektas apibrėžiamas veiksmais, kuriuos su juo galima atlikti (funkcijos) bei savybėmis (kintamieji).

Programavime objektai naudingi tuo, kad paprastas kintamasis savyje talpina ne tik konkrečią reikšmę, bet ir visą spektrą veiksmų. Jeigu norite suprogramuoti rašytojų paieškos algoritmą, kuris gražina visus rašytojus, kurių vardas atitinka konkrečią reikšmę, tai labiausiai tikėtina, kad rezultatus gražinsite kaip asociatyvų dvimatį masyvą. Toks sprendimas yra pateisinimas ir teisingas, tačiau norint pasiekti maksimalų optimalumą reikėtų gražinti vienmatį masyvą, kuriame kiekvienas rašytojas būtų apibrėžtas ne asociatyviu vienmačiu masyvu, o konkrečiu rašytojo objektu. Jei rezultatus gražinate masyvu, tai norėdami atlikti papildomus veiksmus su rašytojais jūs turėsite dirbti su masyvo reikšmėmis, tačiau jei naudosite objektus, tai su rezultatais galėsite dirbti tiesiogiai. Pasižiūrėkite pavyzdį (PHP):

Funkcinis programavimas

$writers = getWriters(); //Gauname rašytojus


foreach ($writers as $writer)
{
print $writer['first_name'] . $writer['last_name'];
}

Objektinis programavimas

$writers = getWriters(); //Gauname rašytojus


foreach ($writers as $writer)
{
$writer->printName();
}

Antrasis kodas yra geresnis, nes norėdami išvesti rašytojo vardą ir pavardę mes neturime žinoti kokiais masyvo elementais jie žymimi. Programuojant objektiškai mums nebūtina žinoti kaip saugomi duomenys objekto viduje - mums užtenka žinoti funkcijų vardus, kuriais galima iškviesti konkrečius veiksmus. Tai patogu tuo, kad mūsų pavyzdinėje rašytojo klasėje pakeitus rašytojo vardo saugojimo būdą mums nereikės perrašinėti kodo klasės išorėje - visa programa nesikreipia į duomenys tiesiogiai, todėl pakitimai duomenų struktūroje neturės įtakos programos darbui. Žinoma yra dar daug kitų objektinio programavimo pliusų - kodo per-panaudojimas, paveldėjimas, abstrakcijos ir interfeisai, statiniai metodai ir t.t., tačiau mano manymu šiuos dalykus reikia nagrinėti tik tada, kai yra iš esmės suprantama objektinio programavimo prasmė bei tvarka. O be to, labai svarbu, kad objektinis programavimas nėra privalomas ir tai tik vienas iš būdų programuoti, kuris nebūtina yra privalomas ir tai, kad jūs programuojate objektiškai nebūtinai reiškia, kad jūs programuojate gerai.

Be abejo aš tikrai nerodysiu kaip reikia aprašyti klases ar kurti objektus - internete ir knygose yra daugybė pavyzdžių ir pats objekto suprogramavimas nėra sudėtingas suvokiant objektinio programavimo esmę. Kai aš mokiausi programuoti objektiškai, tai turbūt didžiąją dalį laiko praleidau studijuodamas teorinę medžiagą, o ne konkrečios programavimo kalbos subtilybes - aprašyti klasę galima išmokti perskaičius vieną knygos paragrafą, tačiau suvokti objektų prasmę gali pareikalauti žymiai daugiau laiko. Tikiuosi visiems pradedantiesiems šis straipsnis bus naudingas ir informatyvus, o jei kyla klausimų, tai galite drąsiai man rašyti ir aš pasistengsiu atsakyti į visus jūsų klausimus.

RSS Patiko ką perskaitei? Užsiprenumeruok RSS srautą ir visada gauk mano naujausius įrašus pats pirmas! Tai ne tik, kad yra be galo patogu, tačiau ir leis tau nepraleisti nei vieno mano įrašo. Jei kiltų problemų - rašyk.

--!>