la emblemo de Ĝavo montras kafotason

Objektema programado per Ĝavo


Rimarkigo: Ni koncentriĝas al la klasa modelo de Ĝavo 1.4. En pli novaj versioj de Ĝavo la modelo estas pli kompleksa, kaj por la kurso ni ne bezonas tiun kompleksecon.

La plena specifaĵo de la aktuala stato de Ĝavo estas publikigita de Sun Microsystems sub jena adreso: java.sun.com/docs/books/jls/third_edition/html/j3IX.html.


1 Kio estas objektemo?

Objektemo estas esprimo por informadika tekniko, kies centro estas la konsiderado de "objektoj" (kiujn ni tuj difinos). La esprimon en Esperanto enkondukis verŝajne Sergej Pokrovski. Aliaj lingvoj uzas esprimojn kia "orientiĝo je objektoj" (foje mallongigita kiel "OO"), sed la esperanta termino estas pli esprima kaj klara.

Objekto en tiu senco estas io, kio similas objekton en la reala mondo. La informadiko komence provis izoli certajn aspektojn de realaj objektoj; ekzemple ĝi dividis ilin al "datenoj" (informoj pri la objekto) kaj "operacioj" (inspektado aŭ modifado de tiuj informoj). En objekto ĉiuj tiuj aspektoj estas kunigitaj. Por distingi objektemajn operaciojn disde proceduraj operacioj, la objektema programado uzas la esprimon "metodoj".

La programado, kiun karakterizas la rekta uzo de instrukcioj kaj la rekta voko de proceduroj, estas nomata "procedur(em)a" aŭ "ordonema" programado.

1.1 Por kio utilas objektemo?

Homoj kutimas pensi pri objektoj de la reala vivo. Dum multaj jarmiloj la evolucio instruis nin pensi pri ili. Ĉar programistoj estas homoj, ili profitas, se programoj similas realajn objektojn.

Krome, ĉar objektoj havas operaciojn, ili povas mem zorgi pri kelkaj aferoj, pri kiuj nuraj datenoj estas senhelpaj. Precipe grava estas la integreco de objektoj, tio estas la evito de internaj kontraŭdiroj. Konata ekzemplo estas signovicoj konsistantaj el vico da signoj kaj ĝia longo. Se oni permesus apartan manipuladon de tiuj du partoj, ili povus esti kontraŭdiraj; ekzemple vico kun reale nur 5 signoj povus havi "longon" de 80. Objektema programado malpermesas tian apartan manipuladon kaj permesas nur operaciojn, kiuj konservas la integrecon.

1.2 Karakterizaj ecoj de objektemaj lingvoj

Objektemaj lingvoj estas tiaj, kiaj subtenas la verkadon de objektemaj programoj. Ekzistas pluraj ecoj, kiujn tiaj lingvoj havu; kelkaj estas konsiderataj kiel kernaj (nepraj), aliaj kiel subtenaj. La distingo inter tiuj du grupoj estas iom arbitra kaj ne universale konsentita.

1.2.1 Kernaj ecoj de objektemaj lingvoj

1.2.2 Subtenaj ecoj de objektemaj lingvoj

Kiel konkludeblas el la rimarkigoj en la du listoj, Ĝavo posedas ĉiujn kernajn ecojn de objektemaj lingvoj kaj du el la tri aliaj. Ĝi ne posedas pluroblan heredon, kiu, pretere, povas tre kompliki la programadon.

1.3 Klasoj kaj metodoj

Objektema programado havas "klasojn" kaj "metodojn", kie ordonema programado havas "daten-tipojn" kaj "procedurojn" (aŭ funkciojn). Kie ordonema programo "vokas" proceduron, oni diras, ke objektema programo "sendas mesaĝon al objekto.

Kial tiuj malsamaj terminoj? Ĉu vere estas diferencoj inter la konceptoj?

Efektive la koncepto "daten-tipo" estas uzata ankaŭ en objektema programado. Klasoj estas speco de daten-tipoj, sed estas pli ol nur tio; ili ja havas ne nur datenojn, sed ankaŭ metodojn.

Ĉar metodo apartenas al klaso, eblas doni al metodo specialajn privilegiojn: Ĝi povas aliri partojn de la klaso, kiuj estas nevideblaj de ekstere. Tio helpas en la menciita "enkapsuligo" de datenoj.

Enkapsuligo helpas garantii la "integrecon" de datenoj, la eviton de kontraŭdira stato. Ni jam vidis la ekzemplon de signo-vica klaso kun longo; alia ekzemplo estas klaso, kiu storas la naskiĝdaton (jaro, monato, tago) de homo. La monato ja devas esti inter 1 kaj 12; sed se ĝi estus libere modifebla de ekstere, iu parto de la programo povus meti monaton "13". Tio eble kaŭzus misfunkcion en alia parto. Se la monato estas enkapsuligita, oni povas restrikti modifadon al unu metodo, kaj tiu metodo povas kontroli, ĉu la monato estas inter 1 kaj 12. Tiu kontrolo en unu centra loko garantias, ke en ĉiuj aliaj lokoj de la programo la monato estas ĉiam en la ĝusta aro.

Sed kial oni (foje) diras, ke oni sendas al objekto mesaĝon, prefere ol "voki" metodon? Pro la menciita "dinamika bindado" okazas, ke programo ne scias, kiun metodon ĝi vokas; ĝi sendas certan mesaĝon al objekto, kaj tiu objekto decidas, kiun metodon voki.

Kiel ekzemplon imagu programon, kiu desegnas geometriajn figurojn: cirklojn, elipsojn, poligonojn, strekojn. Ĉiu tia figuro respondas al objekto en la programo. Ĉiu objekto havas metodon por desegni sin, sed la desegna metodo por cirklo estas tute alia ol tiu de triangulo. Se programo volus voki la ĝustan metodon por ĉiu geometria figuro, ĝi devus unue ekzameni, ĉu temas pri cirklo, triangulo ktp. Anstataŭe ĝi sendas al la figur-objekto la mesaĝon "desegnu vin". Tio igas la strukturon de la programo pli simpla kaj pli klara.

Tiu ĉi ekzemplo montras la necesecon de la dinamika bindado. Se programo devus jam je la tempo de verkado (aŭ de tradukado, se temas pri lingvo tradukata) decidi pri la vokataj metodoj, la objektoj ne povus mem decidi pri tio.

La ekzemplo same montras la neceson de heredado. Se en programo estus du klasoj Cirklo kaj Triangulo, ĉiu kun aparta mesaĝo desegnu, la programo ja devus mem decidi, kiun el tiuj du mesaĝoj sendi. Necesas plia klaso Figuro, kiu estas bazo por la aliaj kaj difinas, ke ekzistas komuna mesaĝo desegnu. Al tiu komuna mesaĝo respondas la malsamaj metodoj de la klasoj.

En Ĝavo oni kutime uzas la esprimon "(abstrakta) metodo" anstataŭ "mesaĝo".

La rilato "estas subklaso de" difinas grafon sur la klasoj de Ĝavo. Evidente la rilato estas malsimetria kaj difinas hierarkion; se A estas subklaso de B, B ne povas esti subklaso de A. Oni kutime desegnas partojn de tiu arbo tiel, ke subklasoj "pendas" sub siaj superklasoj. En Ĝavo la grafo estas arbo, ĉar ĉiuj klasoj estas subklasoj de la universala klaso Object; ĝi estas la radiko de la arbo. En aliaj objektemaj lingvoj tia universala klaso povas manki; la hierarkio tiam konsistas el pluraj sendependaj arboj.


sekva