Hvorfor objektorientert programmering?

Like dokumenter
Hvorfor objektorientert programmering? Objektorientert programmering i Python: Introduksjon. Læringsmål uke 7. Undervisning og pensum IN1000

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

Læringsmål uke 7. Objektorientert programmering i Python: Introduksjon. Innhold uke 7. Lite tilbakeblikk: Programflyt og skop

Etter uke 6 skal du. Introduksjon til objektorientert programmering. Hva skjedde ~1967? INF1001. Grunnkurs i objektorientert programmering

Introduksjon til objektorientert programmering

Objektorientert programmering i Python

Innhold uke 8. Objekter: Bruk og intern organisering. Beskjeder: Oblig 1 6. Beskjeder: Oblig 7 (og 8)

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Innhold uke 10. Objektorientert programmering i Python. Oblig 7 og 8. IN1000 Seminar! IN1000 Høst 2018 uke 10 Siri Moe Jensen

Læringsmål uke 7. Introduksjon til objektorientert programmering. Paradigmet objektorientering. Objektreferanser. INF1001 Høst 2016 Uke 7

Velkommen! I dag. Viktige beskjeder. Studieadministrasjonen. IN Høst Siri Moe Jensen Geir Kjetil Sandve Henrik Hillestad

Etter uke 9 skal du. Introduksjon til objektorientert programmering. Innhold. Klasser som abstraksjoner

Innhold uke 9. Objektorientert programmering i Python. Om ukens pensum. Referanser og objekter Tema: Mer komplekse strukturer

Seminaroppgaver IN1010, uke 2

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

Innhold. Hva skal evalueres? Fra kurssidene. Kapittel 1: Introduction

INF våren 2017

Hva er en metode? INF1000 Forelesning 8. Hva skjer når vi kaller en metode? Hvorfor bruke metoder?

IN våren 2019 Onsdag 16. januar

IN våren 2018 Tirsdag 16. januar

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 Eksamensforberedelser og -tips. Høst 2014 Siri Moe Jensen

Innhold. IN1000 Høst Hva skal evalueres? Fra kurssidene. Uke 12: Pensumgjennomgang og eksamenstips

INF1000 Forelesning 8. Litt repetisjon: Metoder og klasser Innkapsling av variable og metoder Hvordan gripe an et stort problem?

Klasser og objekter. Tuva Kristine Thoresen 4. november Institutt for Informatikk

2 Om statiske variable/konstanter og statiske metoder.

YouTube-kanal ITGK. Læringsmål og pensum

INF2810: Funksjonell Programmering

TDT4110 Informasjonsteknologi grunnkurs: Tema: Enkle funksjoner. - 3rd edition: Kapittel Professor Alf Inge Wang

Et større programeksempel. Hvordan løse et reelt problem med en objektorientert fremgangsmåte

INF2810: Funksjonell Programmering

Velkommen til. IN1010 Objektorientert programmering Våren 2018

INF2810: Funksjonell Programmering

IN1000 Obligatorisk innlevering 7

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

INF2810: Funksjonell Programmering

Eksamensoppgaver 2014

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

Informasjon Prøveeksamen i IN1000 høsten 2018

Klasser og objekter. Tuva Kristine Thoresen 21. oktober Institutt for Informatikk

IN Seminaroppgaver til uke 11

INF1010 våren januar. Objektorientering i Java

IN1010 våren januar. Objektorientering i Java

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Innhold. INF1000 Høst Hva skal evalueres? Fra kurssidene. Hvorfor har vi en lærebok? Uke 11: Repetisjon og pensumgjennomgang

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

Kap3: Klassemodellering

LC191D Videregående programmering Høgskolen i Sør-Trøndelag, Avdeling for informatikk og e-læring. Else Lervik, januar 2012.

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

INF1000 Eksamen 2014 (modifisert)

Ch.7: Innføring i klasser

INF Obligatorisk innlevering 5

Objekt med Java. Harald Yndestad Høgskolen i Ålesund

2 Om statiske variable/konstanter og statiske metoder.

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

Hva er en metode. Hva skjer når vi kaller en metode

INF Innleveringsoppgave 6

IN1010 Objektorientert programmering Våren 2019

Oversikt. Informatikk. INF1000: Grunnkurs i objektorientert programmering. Utenom INF1000 Informasjon & hjelp

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 14.

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

EKSAMENSOPPGAVE. Adm.bygget, rom K1.04 og B154 Ingen. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl.

Læringsmål for forelesningen

Læringsmål for forelesningen

INF1000 Eksamen 2014 (modifisert)

Læringsmål for forelesningen

Antall sider (inkl. forsiden): 7. Alle trykte og håndskrevne

Innlevering 2b i INF2810, vår 2017

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF Seminaroppgaver til uke 3

EKSAMENSOPPGAVE. Vil det bli gått oppklaringsrunde i eksamenslokalet? Svar: JA / NEI Hvis JA: ca. kl. 10

UNIVERSITETET I OSLO

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

Finne ut om en løsning er helt riktig og korrigere ved behov

class Book { String title; } class Dictionary extends Book { int wordcount; } class CartoonAlbum extends Book { int stripcount; }

Klasser. Webprogrammering høsten Objekter. Eksempelklasser og -objekter. 2 of :56. 1 of :56

Obligatorisk oppgave 4: Lege/Resept

INF1000: Forelesning 7. Konstruktører Static

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

Enkle generiske klasser i Java

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Finne ut om en løsning er helt riktig og korrigere ved behov

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

Læringsmål og pensum. v=nkiu9yen5nc

Kapittel 1: Datamaskiner og programmeringsspråk

Litt administrativt. Informatikk studiet og INF1000. Etter denne forelesningen skal du. INF1000: Grunnkurs i objektorientert programmering

IN1010 V19, Obligatorisk oppgave 2

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon


TDT4100 Objektorientert programmering

lfæ~~~~:::j~~:~l -.~=:~-t::-d I Alle trykte og håndskrevne EKSAMENSOPPGA VE Side l av 5 Eksamenstid:

Velkommen til. INF våren 2016

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 1 Introduksjon til Programmering og Python. Professor Alf Inge Wang

Transkript:

Objektorientert programmering i Python: Introduksjon IN1000 Høst 2019 uke 7 Siri Moe Jensen Læringsmål uke 7 Kjenne til motivasjon og bakgrunn for objektorientert programmering Kunne definere en klasse, opprette og bruke objekter Forstå sentrale begreper som grensesnitt og innkapsling Kjenne til utviklingsprosessen for en klasse gjennom design, implementasjon og testing Undervisning og pensum IN1000 Innhold: Prosedural programmering Objektorientert programmering Å ta det i bruk Effektiv læring 1. Få oversikt fra forelesningene 2. Praktiser: Programmer og diskuter 3. Slå opp teori, hvorfor virket dette (ikke)? Mer avanserte mekanismer og mer komplekse programmer => Abstraksjon og designvalg Forenklinger og utelatelser Hvorfor objektorientert programmering? 1

Bakgrunn Store og komplekse systemer etter ~20 år programmering med (noen av) de mekanismene dere har lært hittil. Hovedsakelig matematiske beregninger komplekse, men formelt definerte - store tallmengder, men repetitive operasjoner. Kompleksitet ga høye kostnader og feil. Arbeidsdeling og gjenbruk ble vanskelig. Hva skjedde ~1967? Samtidig: Datamaskinene ble kraftigere billigere mer utbredt => Nye anvendelser! Forsvaret Trafikk-planlegging Økonomisystemer Pasientjournal-systemer? Facebook?? En måte å strukturere programmer på Prosedyrer og funksjoner kan brukes for å løse deloppgaver Hva om deloppgavene handler om å bearbeide felles, kanskje komplekse, data? Løsning: Samle relaterte data og kode for å manipulere dataene i objekter Objektene tilbyr resten av programmet et sett metoder Hvordan objektet representerer og manipulerer sine data er skjult Gjenstår: Hvilke data og operasjoner trengs? Hvordan skal de grupperes? Konseptet objektorientering Å programmere er å modellere Vi bygger en egen representasjon av fenomener (konkrete eller abstrakte) vi trenger å manipulere i datamaskinen denne representasjonen er ikke virkeligheten men kan holde rede på noen aspekter som er viktige for det vi skal lage et program for => Vi lager en modell av "virkeligheten" Å programmere er å forstå virkeligheten det problemet/ behovet vi skal løse hva som kan/ vil endre seg i fremtiden 2

Vi har tidligere brukt objekter som Metoder..representerer lister m/ tilhørende metoder (tjenester) navneliste = [] navneliste.append("per") navneliste.append("paal") navneliste.append("espen") navn = navneliste.pop()..representerer filer m/ tilhørende metoder utfil = open ("navn.txt", "w") utfil.write (navn) utfil.close() Vi kaller på metoder omtrent som prosedyrer og funksjoner MEN en metode må alltid kalles for ett objekt, derfor bruker vi "dot-notasjon" minliste.append(nyttelem) Vi utfører metoder på objektet vårt ved hjelp av kallet < objekt.metode(parametere) > En metode kan ta argumenter En metode kan returnere en verdi (som en funksjon) Grensesnitt Et objekt tilbyr ett sett tjenester i form av metoder som programmerere kan kalle på for å lese av, endre eller aktivisere et objekt: Objektets grensesnitt Et objekt har.. et grensesnitt og en innmat: Implementasjon Grensesnittet bestemmes av objektets klasse Hvordan finner vi ut hvilke metoder som tilbys av objekter av en bestemt klasse? F eks i læreboka eller Python dokumentasjon google search: python methods List f eks https://docs.python.org/3/tutorial/datastructures.html (nb bl.a. ulike versjoner av Python) 3

Klasser En klasse er et mønster/ oppskrift for objekter av samme type. Eks: Student Dato Å lage egne klasser Hva finnes bak grensesnittet? Klassedefinisjonen beskriver hvilke data hvert objekt skal ha (i instansvariabler) og de metodene som skal operere på instansvariablene i objektet Du kan definere (programmere) dine egne klasser som du så kan opprette en eller flere instanser (objekter) av Klasse-definisjon (syntaks) Opprette objekter (syntaks) self._antmott = 0 klassenavn self._antmott = self._antmott + 1 def hentoppmote(self): return self._antmott funksjonsmetode konstruktør metode Noen innebygde klasser har snarveier for opprettelse av objekter "" oppretter en ny str [] oppretter en ny list Ellers opprettes objekter vha klassenavn med argumentliste (som kan være tom): nystudent = Student() 4

Eksempel Student Skal lagre og bearbeide informasjon om studenter Studenter har MANGE egenskaper ulike systemer vil "se" studenter på ulike måter Devilry Eksamenssystemet Lånekassen Hva skal jeg bruke klassen til? => Hjelp for gruppelærer: Holde rede på oppmøte i gruppetimene Student: Grensesnitt uformelt Ønsker å kunne gjøre følgende: Lage Student-objekt med null oppmøte ved oppstart Øke oppmøte med 1 ved tilstedeværelse Lese av (hente ut) oppmøte ved behov Grensesnittet må tilby metoder som: Registrerer oppmøte Henter antall ganger møtt Student: Grensesnitt i Python ## Behandler en students oppmote på gruppetime # ## Oppretter student med oppmote 0 # ## Registrer oppmote # ## Hent ut oppmote # def hentoppmote(self): Student: Implementasjon og bruk self._antmott = 0 self._antmott += 1 def hentoppmote(self): return self._antmott stud1 = Student() stud1.registrer() antall = stud1.hentoppmote 5

Bruk av klassen Student Oppgave Instansvariable opprettes og initialiseres i init metoden (konstruktøren) Konstruktøren kalles automatisk når et nytt objekt opprettes: 1. oppretter objektet 2. oppretter og initierer instansvariablene i objektet 3. returnerer det nye objektet til kallstedet 2) 3) self._antmott = 0 3) stud _antmott 4) 0 self._antmott = 0 self._antmott += 1 def hentoppmote(self): return self._antmott Utvid klassen student med studentens navn: instansvariabel _navn endre konstruktør: Ny parameter navn ny funksjonsmetode hentnavn Hvordan opprettes nå et nytt Student-objekt? stud = Student() 1) 4) Student-klasse utvidet med navn: Implementasjon i Python Test av klassen Vi skriver et testprogram i en egen fil Importerer klassen Student (fra filen student.py) <programfiler ligger under uke7 på semestersiden> Oppretter (minst) et objekt Kaller på alle metoder (minst) en gang - ulike sekvenser kan være nødvendig for å avdekke feil siden objekter husker verdiene sine (har en tilstand) assert tvinger oss til å tenke ut på forhånd hva vi forventer 6

Studentobjekter livekode testprogram student <programfiler ligger under uke7 på semestersiden> Vi har tidligere sett objektene vi bruker "fra utsiden", og nøyd oss med å bruke tjenestene deres Når vi lager egne klasser, bestemmer vi hvordan "innmaten" i objektene skal se ut. Kan være nyttig å tegne, spesielt når vi får mange objekter av forskjellige klasser _navn _antmott stud1 P e r 0 stud1 = Student("Per") stud2 = Student("Kari") stud2.registrer() stud2 _navn K a r i _antmott 01 Hvorfor lage en klasse? For å tilby et sett tjenester som hører sammen (verktøykasse) Spesielt nyttig for tjenester som trenger å dele data over tid (eks for håndtering av en liste, eller en fil, eller en tekst) For å kunne lage flere like objekter med samme data og oppførsel (eks representere studenter) For å simulere sammensatte fenomener vha objekter som representerer virkelige elementer (eks trafikk- simuleringer) Fremgangsmåte: OOP 1. Identifiser aktuelle klasser (hva er sentrale «ting»/ begreper programmet skal behandle?) 2. Design klassens grensesnitt (hvilke operasjoner trenger jeg for objekter av klassen?) 3. Design klassens datarepresentasjon (hvordan skal objektene representere dataene sine?) 4. Implementer (fyll ut) metodene (skriv klassen ferdig) 5. Lag et testprogram som oppretter et eller flere objekter og kaller på metodene i objektenes grensesnitt 7

Innkapsling Innkapsling i Python og IN1000 Prinsipp som innebærer at programmerere kun har tilgang til (utvalgte) metoder i objekter av en klasse: Klassens grensesnitt ("public interface") Data og evt andre metoder definert inne i klassen er "non-public" og brukes kun inne i klassedefinisjonen Sentralt prinsipp i objektorientert programmering en klasse kan endres så lenge grensesnittet er det samme uten at det får konsekvenser der klassen brukes gjennomført ansvarsdeling (splitt og hersk) Python støtter innkapsling med konvensjoner, men har ikke mekanismer for å hindre tilgang alle instansvariable og metoder som ikke skal inngå i grensesnittet, får navn som begynner med _ Dette prinsippet skal dere bruke konsekvent i IN1000 I praktisk bruk er det et designvalg om / når/ hvordan man anvender innkapsling Dere vil se eksempler på direkte aksess av data (utenom klassens metoder) blant annet i IN1010 Et info-program om O-JD terminalrom Informasjon om rommene i O-JD er kopiert fra termvakt wiki til fil For hvert rom: romnummer romnavn hva slags maskiner hvor mange plasser Skal skrive et program som leser inn data om rommene, skriver ut en oversikt og etter hvert svarer på ulike spørsmål Uformelt grensesnitt leser alle data fra fil > oppretter objekter etter hvert nye objekter opprettes med individuelle verdier for romnummer romnavn hva slags maskiner hvor mange plasser trenger metoder som skriver ut en "pen" linje med info om rommet sjekker om et rom tilfredsstiller krav til plass og op.sys. 8

Eksempel Rom: Klassedefinisjon Rom: Program class Rom : def init (self, nr, navn, opsys, ant) : self._nr = nr self._navn = navn self._type = opsys self._ant = ant <programfiler ligger under uke7 på semestersiden> def skrivlinje(self) : print ("%d %-15s %-15s %d" % (self._nr, self._navn, self._type, self._ant)) OO støtter modularisering Både funksjoner og klasser er mekanismer som hjelper oss å strukturere koden vår gjennom modularisering Å definere en klasse, opprette objekter og kalle på metoder klassenavn Klassen definerer data og operasjoner som hører sammen, og kan definere et begrenset vindu (grensesnitt) som brukere av klassen (programmerere) skal få til objekter av klassen Klassedefinisjonen er mønsteret som blir fulgt når vi lager nye objekter av klassen: De har de samme instansvariablene, men instansvariablene kan ha ulike verdier self._antmott = 0 self._antmott = self.antmott + 1 def lesoppmote(self): return self._antmott konstruktør funksjons-metode metode Et objekt husker data i instansvariablene sine mellom hver gang en metode kalles for objektet stud1 = Student() stud1.registrer() metodekall på objektet stud1 9