Objektuetara bideratutako programazioa

[thumb|[Unified Modeling Language|UML notazioan definitutako klase bat. Klase hau butoi bat irudikatzen du. Butoi klase honek eremuetan informazioa gordetzen du eta metodoetan funtzionalitatea. Herentziaren bitartez butoi mota desberdinak sortu daitezke. Objektuak klasearen instantziak dira.]]
**Objektuei bideratutako programazioa** (**OBP**) (ingelesez, object-oriented programming edo **OOP**) programazio paradigma bat da, oinarri moduan objektuen kontzeptua erabiltzen duena. Objektuak klaseen instantzia moduan sortzen diren datu-mota abstraktu bat dira. Objektuetan informazioa (datuak) eta haiek atzitzeko funtzioak (kodea) kapsulatuta daude: informazioa eremuetan (atributuetan, propietateetan) eta kodea metodoetan (prozeduretan).

OBP-ren funtsezko ezaugarri batzuk hauek dira: herentzia, kohesioa, abstrakzioa, polimorfismoa, akoplamendua eta kapsulazioa.

Gaur egun OBP onartzen duten hainbat programazio-lengoaia daude, batzuk aipatzearren: C++, Objective-C, Smalltalk, Delphi, Java, Javascript, C#, Perl, Python, Ruby eta PHP.

## Sarrera 
Programazio egituratu tradizionalean datuak eta prozedurak bereizita daude eta ez dute harremanik. Sarrera-datuak prozesatuz irteerako datuak lortzea da helburua. Objektuei Bideratutako Programazioan, aldiz, objektuak erabiltzen dira.

Objektuak identitate, egoera eta portaera jakin bat duten entitateak dira. Identitatea identifikatzaile moduko bat da, objektuak haien artean bereizten dituena. Objektuaren eremuetan dagoen informazioaren bidez egoera definitzen da eta metodoen bidez portaera. Mundu errealeko elementuei erreferentzia egin diezaiekete objektuek.

Objektuak diseinatzean eta sortzean klase-hierarkia erabiltzen da. Klaseak eta azpiklaseak, logika matematikoko multzoen eta azpimultzoen parekoak dira. Klaseek metodoak behar dituzte eremuak atzitzeko.

Datuak eta metodoak egitura berean antolatzeko mekanismo gisa kapsulazioa erabiltzen da. Haren bidez informazioa ezkutatzea lortzen dela esaten da. Horrela, klase bat erabili behar duen programatzaileak objektua nola antolatuta dagoen (datuak, metodoen inplementazioa) jakin beharrik ez du. Datuen integritatea bermatzeko, beharrezkoa da erabiltzaileari objektuaren eremuetan dagoen informazioa zuzenean aldatzen ez uztea. Hori lortzeko, kapsulazioan hiru atzipen-maila zehazten dira: publikoa, babestua eta pribatua.

## Historia 
Objektuei Bideratutako Programazioaren (OBP) kontzeptuak 50eko hamarkadaren amaieran eta 60koaren hasiera agertu ziren lehen aldiz. MITko Adimen Artifizialeko sailean "objektu"aren kontzeptua erabiltzen hasi zirenean propietateak (atributuak) dituzten elementuei (LISP atomoei) egiten zieten erreferentzia. Kontzeptu horien erabilera erakusten duen garai hartako beste adibide bat MITko Sketchpad konputagailu-programa da. Ivan Sutherland-ek sortu zuen 1960an doktore-tesia egiten ari zenean. Sketchpad-i buruzko txosten teknikoaren glosarioan, Sutherlandek "objektua" eta "instantzia" kontzeptuak definitu zituen eta klasearen kontzeptua "*master*" eta "*definition*" terminoen bidez erabili zuen. Interfaze grafikoen garapenean garrantzia handia izan zuen Sketchpad konputagailu-programak. Egindako lanagatik Turing saria jaso zuen Sutherlandek 1988an. OBPko kontzeptuen lehen erabileren beste adibide bat MITko ALGOL bertsio bat da (AED-0 bertsioa). Datu-egituren ("*plexes*" terminoaz izendatuak bertsio hartan) eta prozeduren artean lotura zuzena ezarri zen. Gerora "metodo" kontzeptua izango zenaren aurrekari moduan har daiteke.

OBParen kontzeptua 60ko hamarkadan formalizatu zen, Simula programazio-lengoaiak (Simula 67) klasea, objektua, herentzia, instantzia eta lotura dinamikoa moduko kontzeptuak inplementatu zituenean.  Simula I (1961–1965) eta Simula 67 (1965–1968) bertsioak garatu ziren. Ole-Johan Dahl-ek eta Kristen Nygaard-ek sortu zuten Simula, Oslo-n kokatuta dagoen Norvegiako Konputazio-Zentruan. Simulazioak egiteko helburuarekin sortu zen, portuetan itsasontzien eta haiek garraiatutako kargen mugimendua aztertzeko eta hobetzeko ereduak sortu ahal izateko. Dagoeneko LISP programazio-lengoaia funtzionalean inplementatuta zegoen "zabor-bilketa automatikoa" (ingelesez, *automatic garbage collection*) ere erabiltzen zuen. Simula 67 programazio-lengoaian inplementatutako kontzeptu horiek eragina izan zuten gerora garatutako beste programazio-lengoaia batzuetan, hala nola, Smalltalk, Object Pascal, C++, Ada eta BASIC.

70eko hamarkadan, Alan Kay-k, Dan Ingalls-ek eta Adele Goldberg-ek Smalltalk programazio-lengoaiaren lehen bertsioa garatu zuten Xerox PARC enpresan. Lengoaiak objektuetara bideratutako kontzeptuak erabiltzen zituelako eta garapenerako ingurune grafikoa erabiltzen zuelako nabarmendu zen. Hainbat bertsio sortu ziren, eta komunitatearen interesa piztu zen. Smalltalk-ek Simula 67 lengoaiaren eragina jaso zuen arren, sistema guztiz dinamikoa izateko diseinatu zen. Horrela, klaseak modu dinamikoan sortu eta aldatu zitezkeen.

70eko hamarkadan, Smalltalk-ek eragina izan zuen Lisp-eko komunitatean, eta garatzaileek objektuei bideratutako teknikak txertatu zituzten Lisp makinetan exekutatzeko. Egindako esperimentuetatik LOOPS (*Lisp Object-Oriented Programming System*) eta Flavors moduko Lisp-en hedapenak sortu ziren. Azkenean, CLOS (*Common Lisp Object System*) garatzea lortu zen, objektu-sistema dinamiko ahaltsua, programazio funtzionala eta objektuetara bideratutakoa bateratzen dituena.

80ko hamarkadan zehar, OBP garrantzia hartzen joan zen. 1981ean, Goldbergek Smalltalk-i eta OBPari buruzko artikulu bat argitaratu zuen "Byte Magazine" aldizkarian, eta publiko zabalagoarengana iristea lortu zuen. 1986an, ACM (Association for Computing Machinery) elkarteak *"Conference on Object-Oriented Programming, Systems, Languages, and Applications*" (OOPSLA) biltzarra antolatu zuen lehen aldiz, eta espero baino parte-hartzaile gehiago izan zen bertan. 80ko hamarkadaren erdialdean, Brad Cox-ek "Objective-C" garatu zuen, C programazio-lengoaiari Smalltalk-en estiloko mezu-trukea erantsi zion OBP lengoaia. Azkenean, Bjarne Stroustrup-ek objektuei bideratutako C++ programazio-lengoaia sortu zuen. 1985ean, Bertrand Meyerrek Eiffel programazio-lengoaiaren lehen diseinua egin zuen. Softwarearen kalitatearen ikuspuntutik, Eiffel objektuei bideratutako programazio-lengoaia purua da.

90eko hamarkadan, OBParen erabilera asko zabaldu zen, batez ere OBP tekniketan oinarritutako programazio-lengoaien erabilera (C++, Visual FoxPro, Delphi) orokortu zenean. Interfaze grafikoen erabileraren gorakadak ere eragina izan zuen arrakastan. Lehendik existitzen ziren lengoaia askotan OBP ezaugarriak gehitu ziren, Ada, BASIC, Fortran, Pascal eta COBOL lengoaietan, besteak beste. Hasieran OBP paradigmarako diseinatu ez ziren lengoaiei OBP ezaugarriak gehitzeak, askotan, bateragarritasun- eta mantentze-arazoak ekarri zituen.

Gerora, neurri handi batean OBP paradigmari jarraitzen dioten baina programazio funtzionalarekin ere bateragarriak diren lengoaiak sortu dira. Horietako bi Python eta Ruby dira. Segur aski, ikuspegi komertzialetik garrantzitsuenak Java (Sun Microsystems-ek garatua), C# eta Visual Basic (Microsoften .NET plataformarako diseinatutakoak) dira.

## Oinarrizko kontzeptuak 
Objektuei bideratutako programazioa (OBP) onartzen duten programazio-lengoaia guztiek ez dituzte onartzen hari lotutako teknika eta egitura guztiak. Izan ere, lengoaia batzuk klasearen eta objektuaren kontzeptuetan oinarrituz diseinatu ziren baina beste batzuk, malguagoak dira eta hainbat programazio-paradigma onartzen dituzte. OBP paradigmaren kontzeptu nagusiak dira honakoak dira:

**Klasea**

Klasea objektuak sortzeko funtsezko mekanismoa da. Bertan definitzen dira objektu mota baterako eremuak (atributuak, propietateak) eta metodoak (prozedurak). Klase baterako sortzen diren objektu guztiek eremu eta metodo berberak partekatzen dituzte. Adibidez, "Katu" izeneko klase batean, eremuen atalean katuen ezaugarriak defini daitezke (kolorea, pisua, etab) eta metodoen atalean katuen jokaera (salto egitea, jatea, etab.).

Programazio egituratu tradizionalarekin alderatuta, objektuaren eremua "aldagaiak" dira, objektuaren egoerari buruzko informazioa ematen duen barne-edukiontzi bat, eta objektuaren metodoak "funtzioak" dira, objektuaren barne-prozedurak.

**Objektua**

Klase bateko objektu berri bat sortzeari instantziazioa deritzo. Horrela, objektua klase baten instantzia moduan sortutako datu-mota abstraktua da. Objektuetan informazioa (datuak) eta haiek atzitzeko funtzioak (kodea) kapsulatuta daude: informazioa eremuetan (atributuetan, propietateetan) eta kodea metodoetan (prozeduretan).

Objektuak "*constructor*" izeneko metodo berezi bati deituz sortzen dira. Objektu batek mundu errealeko elementu bat adieraz dezake. Online erosketa-sistema batean, adibidez, objektu bat "erosketa-orga", "bezeroa" edo "produktua" izan daiteke. "Katu" klaserako objektu bat, adibidez, "Mixina" katua izan daiteke. Entitate abstraktuagoak ere adieraz daitezke objektuen bidez; neurketak metrika batetik bestera aldatzeko zerbitzua ematen duen objektu bat, adibidez, miliak kilometrotara bihurtzeko.

Objektuak barne-egitura konplexuko aldagai gisa atzitzen dira. Programazio-lengoaia askotan erakusle (ingelesez, *pointer*) moduan erabiltzen dira. Abstrakzio-maila bat ematen diote programatzaileari, barne-kodea eta kanpo-kodea bereizteko aukera ematen dutelako. Kanpoko kodeak objektu bat erabil dezake, instantzia-metodo jakin bati deituz, objektuaren instantzia-aldagai batetik irakurriz edo bertan idatziz.

**Eremua**

Objektuaren ezaugarriak gordetzen dira bertan. "Katu" klaseko "Mixina" objektuaren "kolorea" eremuan, adibidez, "beltza" balioa egon daiteke, eta "pisua" eremuan "3 kg" balioa. "Katu" klasean definitutako metodoak exekutatuz aldatzen dira objektuaren eremuetan gordetako balioak.

**Metodoa**

Klase bateko objektuaren portaera definitzen duen algoritmoa da eta objektuak egin dezakeena definitzen du. Hainbat metodo defini daitezke klase batean. "Katu" klaserako, adibidez, "salto egin" metodoa, "jan" metodoa, etab. Metodoak exekutatzeko, "*message passing*" izeneko teknika erabiltzen da: mezu batek metodoaren exekuzioa eragiten du objektu jakin baterako (haren eremuetako balioetarako). Ondorioz, objektuaren propietateetako balioak alda daitezke, edo gertaera bat sor daiteke metodoa beste objektu baterako exekutatzeko.

**Gertaera**

Gertaerak sistemaren ekintzak dira eta programaren exekuzio-fluxua gidatzen dute. Erabiltzaileak eragindakoa izan daiteke (saguaren botoia edo teklatuaren tekla bat sakatzea) edo beste objektu batek bidalitako mezu batek eragindakoa. Gertaera baten ondorioz, sistemak mezu bat bidaliko dio dagokion objektuari. Gertaeretara bideratutako programazioaren paradigman asko erabiltzen dira.

**Mezua**

Mezu bat gertaera batek objektu bati bidalitako komunikazioa da. Mezu bat bidaltzean, objektuaren metodo jakin bat exekutatzeko agindua ematen da, eta exekuzioan gertaera horri lotutako parametroak erabiltzen dira. Mezu-trukeari dagokionez, halaxe zioen Alan Kay-k: "*I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning – it took a while to see how to do messaging in a programming language efficiently enough to be useful*".

## Ezaugarriak 
Hona hemen Objektuei Bideratutako Programazioaren (OBP) ezaugarri nagusiak:

**Herentzia**

Klasearen kontzeptuan oinarritzen diren programazio-lengoaia gehienek herentziaren mekanismoa eskaintzen dute. Klaseak ez dira isolatuta egoten, elkarren artean modu hierarkikoan erlazionatuta baizik. Horrela, klase berriak sor daitezke existitzen diren klaseen azpiklase moduan "*is-a-type-of*" erlazioen bidez. Adibidez, "Ugaztun" klasearen azpiklase moduan "Katu" eta "Txakur" klaseak definituz gero, "Ugaztun" klaserako definituta dauden eremuak eta metodoak herentzia bidez jasoko dituzte. Horrela, hierarkian behera gero eta espezializatuagoak diren azpiklaseetarako espezifikoak diren eremuak eta metodoak besterik ez ditu definitu beharko programatzaileak. Objektuak klase bat baino gehiagokoak direnean, klase guztien propietateak eta metodoak heredatzen dituzte.

Herentziari esker, polimorfismoa eta kapsulatzea errazten dira, objektuak lehendik existitzen diren objektu-mota espezializatu moduan sor daitezkeelako.

**Kapsulatzea**

Kapsulatzearen kontzeptuak honako bi esanahiak izan ditzake: 1) datuak eta datu horiekin lan egiten duten metodoak elkartzea, 2) objektuaren hainbat osagaietarako atzipena murriztea. Kapsulatzeari esker, kanpoko kodeak ez du objektuaren barne-funtzionamenduaz arduratu behar. Horrela, errazagoa gertatzen da objektuko eremuetan eta kodean aldaketak egitea.

**Abstrakzioa**

Abstrakzioaren helburua konplexutasuna maneiatzea da, erabiltzaileari beharrezkoak ez diren xehetasunak ezkutatuz. Programatzeko garaian, aktore abstraktuak adierazten dituzten objektuak defini daitezke, zeregin bat beteko dutenak, objektuari buruz informatuko dutenak edo bere egoera aldatuko dutenak, baina inplementazioari buruzko xehetasunetan sartu gabe. Horri esker, programatzaileak logika konplexuagoa erabil dezake, abstrakzio-maila altuagoan lan eginez.

**Polimorfismoa**

Zerbait modu desberdinetan gerta daitekeela esan nahi du. OBP paradigman, sintaktikoki berdinak diren mezuak mota desberdineko objektuei bidali ahal izatea, adibidez, datu-motekin arazorik izan gabe. Objektuak modu polimorfikoan erabili ahal izateko, bidaltzen zaien mezuari erantzuteko prestatuak egon behar dute. Interfazeekin lan egitean, mota desberdineko objektuak interfaze komun baten bidez atzitu ahal izango dira. Adibidez, Java-n klase guztiak Object klasetik heredatzen dute. Hortaz, Object motako aldagai bat sortu daiteke eta edozein klaseko instantzia esleitu.

**Modularitatea**

Aplikazio bat "modulu" izeneko atal txikiagoetan zatitzeko aukera ematen duen propietatea da. Zati bakoitzak aplikazioaren eta gainerako zatien artean ahalik eta independenteena izan behar du. Modulu horiek bakoitza bere aldetik konpilatu daitezke, baina loturak dituzte haien artean.

**Informazioa ezkutatzea**

Objektuen arteko elkarrekintza interfazeen bidez egiten da. Bertan adierazten zaie beste mota bateko objektuei, klase horretako objektuekin nola elkarreragin dezaketen. Isolamendua horri esker, objektuaren eremuak babesten dira, haiek aldatzeko baimenik ez dutenen aurrean. Horrela, objektuen barne-egoera ez da ezustean aldatuko.

**Zabor-bilketa**

Zabor-bilketa egitea (ingelesez, *garbage collection*) erreferentziatuak ez diren objektuak modu automatikoan suntsitzea da. Erreferentziarik gabeko objektuak dagoeneko erabiltzen ez direnak dira; suntsitzeko markatzen dira eta haiei lotutako memoria askatu egiten da. Teknika horri esker, programatzaileak ez du memoriaren kudeaketaz arduratu behar; objektu berriei inguruneak esleituko die memoria eta dagoeneko erabiltzen ez diren objektuen memoria hark askatuko du.

## OBP programazio-lengoaiak 
thumb|'HTML5 lengoaia eta JavaScript APIak' liburua.
OBP-an oinarritutako lehen programazio-lengoaia Simula izan zela esaten da (1967). Simulazio-programak egiteko sortu zen, eta informazio garrantzitsuena objektu izenekoetan gordetzen zen. Smalltalk ere lehenengotariko OBP lengoaia bat izan zen (1972-1980) eta harekin garatu zen OBP paradigmaren oinarrizko teoria. Objektuetara duten bideratze-mailari dagokionez, sailkapen hau egin daiteke:

* Lengoaia puruak. Lengoaia hauetan dena interpreta daiteke objektuen ikuspuntutik: primitibak (karaktereak, puntuazio-markak, etab.), klaseak, prototipoak, blokeak, moduluak eta abar. OBP metodoen erabilera errazteko diseinatuta daude: Ruby, Scala, Smalltalk, Eiffel, Emerald, JADE, Self, Raku.
* OBPrako diseinatutako lengoaiak, elementu prozeduralak dituztenak: Java, Python, C++, C Sharp, Delphi, Object Pascal, Visual Basic.NET.
* Lengoaia prozeduralak, hainbat OBP ezaugarri onartzeko hedatuak izan direnak: PHP, Perl, Visual Basic, MATLAB, COBOL 2002, Fortran 2003, ABAP, Ada 95, Pascal.
* OBP ezaugarri gehienak dituzten lengoaiak (klaseak, metodoak, herentzia), but modu desberdinean inplementatuak: Oberon.
* OBP programazioaren antza duten lengoaiak, datu-mota abstraktuak onartzen dituztenak baina OBP paradigmako ezaugarriak falta dituztenak. Objektuetan edo prototipoetan "oinarritutako" programazio-lengoaiak direla esaten da: JavaScript, Lua, Modula-2, CLU.
* Kameleoi-lengoaiak, programazio-paradigma asko onartzen dituztenak, baita OBP ere: Tcl lengoaiak, adibidez TclOO bertsioan, prototipoetan oinarritutako programazioa eta klaseetan oinarritutako OBP onartzen dituen objektu-sistema hibridoa dauka.

## Erreferentziak 
## Kanpo estekak