Forord

Dette er en slags lærebok i objektorientert programmering mm. i Java, som prøver å kombinere innhold på en ny måte: - den forklarer grunnleggende begreper og teknikker innen objektorientert programmering - forklarer bruk av Java-biblioteker og -rammeverk - inkluderer forklarte og forklarende kode-eksempler Målet er at kombinasjonen både gir en konseptuell forståelse og hjelper til å utvikle praksiske ferdigheter.

En kan tenke på det som en videreføring av fagwikien til TDT4100, men på en form som gjør den litt mer lærebokaktig, enn løse sider om et avgrenset sett med temaer. Ved å bruke asciidoctor blir det både enklere å integrere ulike typer materiale og generere ulike typer formater.

Introduksjon

Objektorientering handler ikke om finurlig logikk, smarte triks eller komplekse algoritmer, men om måter å organisere kode på, som har vist seg å fungere godt i både liten og stor skala, for å håndtere kompleksiteten som oppstår når programmer utvikles over tid.

Det er lurt å lære seg objektorientert programmering av flere grunner: - Mange av kodebibliotekene og -rammeverkene en bruker er basert på objektorienterte teknikker, så for å utnytte dem, trengs forståelse av objektorientering. - Etterhvert som en lager større programmer selv, vil objektorienterte teknikker hjelpe en å holde dem ryddige og kompleksiteten nede. - Når flere samarbeider om et program, så hjelper objektorientering en til å dele det opp slik at sambeidet blir enklere. - Ønskede egenskaper som konfigurerbarhet og utvidbarhet bygger gjerne på god bruk av objektorientering.

Bruk av objektorienterte teknikker kan virke unødig kompliserende, spesielt i læringssammenheng, hvor de introduseres før programmer er så store at det egentlig trengs. Spesielt oppdelingen i mange små programfiler, i stedet for å samle koden i få, kan være forvirrende, men med en god konseptuell forståelse av teknikkene og gode verktøy så blir problemet mindre.

Objekter

Et objektorientert (kjørende) program består av en masse objekter som er koblet sammen. Inni hvert objekt er det data og kode, koden er til for å administrere og operere på dataene iht. regler for hvordan dataene henger sammen. Hvert objekt har en del operasjoner en kan be dem utføre, f.eks. hente ut dataene inni eller endre på dem (iht. de innebygde reglene).

Et av de enkleste objektene en kan tenke seg, holder orden på en teller-verdi. Teller-objektet har to operasjoner, én for å lese ut teller-verdien og én for å øke telleren med én. Figuren under viser et slikt teller-objekt, etter at telleren har kommet til 7 (hva den begynte på er ikke gitt, heller ikke om den noen gang vil stoppe).

diag 28d5462ed1c4d279a1d8b5f64f03e4d6

Hvis en ber telleren om å telle opp ett hakk, så blir teller-verdien 8. Dette kan illustreres slik:

diag 03b5d9189335a3c1f622d62b43f7fcfb

"#1" er "identiteten" (id-en) til objektet, her har begge objektene samme id for å illustrere at det er samme objekt i to forskjellige tilstander. Objektet har gått fra den ene til den andre tilstanden, en såkalt transisjon, her illustrert med en stiplet pil, fordi vi har bedt det utføre operasjonen tell-opp-ett-hakk.

Objekter som er koblet sammen, kan samhandle for å kunne utføre mer komplekse operasjoner enn hvert enkelt objekt kan alene. En kan tenke på det som en "chat" mellom objektene, hvor de ber hverandre om å utføre ulike operasjoner, på en koordinert måte. Objekter kan samhandle på ulike måter, ofte snakker en om at de spiller ulike roller i en samhandlingen. Noen ganger er et objekt administrert av og underordnet et annet og fungerer som hjelpeobjekt, mens andre ganger er forholdet mer balansert. Det er slik man klarer å holde kompleksiteten nede, for å unngå for komplekse enkeltobjekter, så deler man dem opp i en struktur av samhandlende objekter i stedet. Men hva som er en ryddig og "naturlig" oppdeling er ikke opplagt eller entydig.

diag 5692169d8ef7af695e380a9af4edaa34

Figuren over illustrerer hvordan tre objekter samhandler. klokke ber sekund-teller om å telle opp et hakk. Så spør klokke sekund-teller om hva telleren er, og siden den er kommet til 60 (sekunder) så ber klokke den om å nullstille telleren, før minutt-teller får beskjed om å telle opp ett hakk.

Analogier fra den analoge verden kan være til hjelp, faktisk var objektorientert tenkning opprinnelig en måte å forstå virkelige fenomer og gjøre dem enklere å representere i en datamaskin. Slik er det fortsatt, men objektorientering har også vist seg som en ryddig måte å organisere rene digitale fenomener.

En analogi for samhandlende objekter er håndverkere som samarbeider om å bygge et hus. Ulike typer håndverkere gjør ulike typer deloppgaver, snekkere snekrer, rørleggere legger rør og elektrikere kobler opp strømnettet. Arbeidslederen koordinerer dem, så oppgaver utføres i en naturlig rekkefølge og med nødvendig koordinering. Hvis hver enkelt håndverker gjør sin del av jobben riktig, og oppgavene utføres i rett sekvens, så blir sluttresultatet som forventet.

En annen analogi er et lag av kokker, med hver sin spesialitet, som samarbeidet om å lage et måltid. Hvert måltid har sine retter, som bestemmer hvilke kokker som utgjør laget, og hver kokk følger sin oppskrift. Kanskje er én oppskrift for en rett så komplisert at to kokker må samarbeide. Kokkene må uansett jobbe koordinert, slik at hver rett blir klar til riktig tid. De deler dessuten kjøkkenressursene, så de må sørge for å bytte på å bruke kopper og kar, kniver og andre redskaper, kokeplater og ovn, osv.

Kode-eksempler

Her er en oversikt over alle kode-eksemplene. Eksemplene følger samme klassifisering og pakkestruktur som øvingene, f.eks. stateandbehavior og encapsulation, for å gjøre det lettere å se når de er relevante å bruke.

Tilstand og oppførsel (stateandbehavior)

Innkapsling (encapsulation)

  • Date - klasse for representasjon av dato.

  • Person - klasse for representasjon av person-navn.

  • TimeInterval - klasse for representasjon av tidsintervall.

Objektstrukturer (objectstructures)

  • TimeInterval - klasse for representasjon av tidsintervall, ved bruk av hjelpeklasse for tidspunkt.

Standardteknikker (patterns)

Delegering (delegation)

Observert-observatør (observable)

JavaFX

  • HelloWorld - minimalistisk eksempel på app med knapp som endrer tekst når den trykkes på

  • Chess - en sjakk-app, som utvikles i en rekke trinn