Objektorientert design av kode. Refaktorering.

Like dokumenter
INF1010 våren 2007 Uke 6, 6. februar Arv og subklasser, del 2

Objektorientert design av kode. Refaktorering.

Gjennomgang av eksamen H99

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Løsningsforslag eksamen in105, høsten 2000

Løsningsforslag til eksamen i INF1000 våren 2006

"Nelsons kaffebutikk"

(MVC - Model, View, Control)

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Løsningsforslag, inf101, våren 2001

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000: Forelesning 6. Klasser og objekter del 1

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

INF Løsning på seminaropppgaver til uke 8

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

UNIVERSITETET I OSLO

INF Uke 10. Ukesoppgaver oktober 2012

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

Repetisjon. INF gruppe 13

Post-it spørsmål fra timen (Arv og subklasser)

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

Oppgave 1 - Kortsvarsoppgave. INF1000 eksamen V05. Oppgave 1 (c) Oppgave 1 (b) Svar: a = 9, b=10

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

IN1010 våren januar. Objektorientering i Java

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

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

Inf1000 (Uke 10) HashMap og ArrayList

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1000 Forelesning 9. Hashmap Eksempel: Flyreservasjon

Dagens forelesning. Husk prøveeksamen Fredag 15/3-13 kl 12 i R1. Iterator-teknikken. Eksempel med bruk av Iterator og Iterable-grensesnittene

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

TDT4100 Objektorientert programmering

HashMap. INF1000 Forelesning 9. Ulike versjoner i Java 1.4 (gammel) og Java 1.5/1.6 av HashMap. Objekter lagres med en søkenøkkel

INF1000 Prøveeksamen Oppgave 7 og 9

Dagens forelesning. INF1010 Datastrukturer Lister og køer Pekerkjedelister Øvelser. Innhold i dette lysarksettet

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Ansvarsdrevet OO: CRC og UML Sekvensdiagrammer

IN105-javaNelson-2. array, evt. flere dimensjoner. Institutt for informatikk Jens Kaasbøll sept En funksjon om gangen En klasse om gangen

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

INF1010 Binære søketrær ++

Feilmeldinger, brukerinput og kontrollflyt

UNIVERSITETET I OSLO

OPPGAVE 5b og 8b Java Kode

INF1010 MVC i tekstbaserte programmer

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

LO191D/LC191D Videregående programmering

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

Arv. Book book1 = new Book(); book1. title = "Sofies verden" class Book { String title; } class Dictiona ry extends Book {

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

Studieaktiviteter i INF1010

INF1010 våren januar. Objektorientering i Java

INF1010 notat: Binærsøking og quicksort

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Løsnings forslag i java In115, Våren 1996

UML- Use case drevet analyse og design. Domenemodeller Sekvensdiagrammer Use case realisering med GRASP patterns Klassediagram - designmodeller

INF1010 Arv. Marit Nybakken 2. februar 2004

Løsningsforslag til eksamen i INF1000

Dagens tema: 12 gode råd for en kompilatorskriver

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

programeksempel Et større En større problemstilling Plan for forelesingen Problemstillingen (en tekstfil) inneholdt ordet "TGA"

INF1010 våren Grensesnitt

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

LC191D/LO191D Videregående programmering mai 2010

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Eivind Storm Aarnæs

Transkript:

Objektorientert design av kode. Refaktorering. DEL 2 INF1010-forelesning 9. mars Ragnhild Kobro Runde

Kjennetegn på god design (fra INF1050) En god utforming gjør den jobben den er ment å gjøre. En god utforming er enkel og elegant. Eleganse innebærer å finne akkurat riktig abstraksjonsnivå. En god utforming er gjenbrukbar, utvidbar og enkel å forstå. Et godt objekt har et lite og veldefinert ansvarsområde. Et godt objekt skjuler implementasjonsdetaljer fra andre objekter. - Grady Booch

Eksempel: Barnehage-programmet

Et større eksempel: Barnehage Vi skal lage et program for å administrere en barnehage. I barnehagen finnes det to typer avdelinger: Småbarnsavdeling Barn opp til 3 år Plass til 9 barn Avdeling for større barn Barn over 3 år Plass til 18 barn Et barn kan være tatt opp til maksimalt en avdeling. For hver avdeling vedlikeholdes en venteliste. Et barn kan bare stå på en venteliste. Derimot kan et barn både være tatt opp i en småbarnsavdeling, og stå på venteliste til en avdeling for større barn. Opptak fra ventelisten skjer "ved loddtrekning", men med søskenprioritet ved opptak til småbarnsavdelingene. Til avdelingene for større barn har barn som allerede har plass i en småbarnsavdeling prioritet. Hvilken datastruktur ville du foreslått her? 4

Barnehage: Klassediagram Barnehage 1 tattopp * * Barn * * søsken venteliste 1..* 1 Avdeling 1 SmåbarnAvd StorebarnAvd 5

Klassen Avdeling med subklasser class Avdeling { String navn; int antallplasser; HashMap tattopp; HashMap venteliste; Avdeling(String navn) { this.navn = navn; tattopp = new HashMap(); venteliste = new HashMap(); class SmåbarnAvd extends Avdeling { SmåbarnAvd(String navn) { super(navn); antallplasser = 9; class StorebarnAvd extends Avdeling { StorebarnAvd(String navn) { super(navn); antallplasser = 18; 7

Klassene Barn og Barnehage class Barn { String navn; int født; HashMap søsken; Avdeling venter, opptak; Barn(String navn) { this.navn = navn; søsken = new HashMap(); class Barnehage { HashMap allebarn = new HashMap(); HashMap alleavd = new HashMap(); 8

Barnehage: noen metoder Vi skal konsentrere oss om følgende metoder: Ny avdeling Ledige plasser: Skriver ut antall ledige småbarnsplasser og antall ledige plasser for store barn totalt i barnehagen. Søknad: Setter et barn på venteliste til en avdeling. Opptak: Foretar opptak av barn til alle avdelingene i barnehagen. I tillegg finnes selvfølgelig metoder for å registrere barn/søsken, skrive informasjon om barn/avdeling, Se kursets hjemmeside for komplett program. 9

Metoden nyavdeling() // I klassen Barnehage: void nyavdeling() { String navn; Avdeling a; System.out.print("Navn på ny avdeling: "); navn = inn.intext(); if (alleavd.containskey(navn)) { System.out.println("Registrert allerede"); return; System.out.print("Småbarnsavdeling (j/n)? "); if (inn.inchar() == 'j') { a = new SmåbarnAvd(navn); else { a = new StorebarnAvd(navn); alleavd.put(navn, a); 10

Metoden ledigeplasser() // I klassen Barnehage: void ledigeplasser() { int antallsmå = 0; int antallstore = 0; Iterator it = alleavd.values().iterator(); while (it.hasnext()) { Avdeling a = (Avdeling) it.next(); if (a instanceof SmåbarnAvd) antallsmå += a.antallledige(); else antallstore += a.antallledige(); System.out.println("Småbarnsplasser: " + antallsmå); System.out.println("For store barn: " + antallstore); // I klassen Avdeling: int antallledige() { return antallplasser tattopp.size(); 11

Søknad om opptak // I klassen Barnehage: void søknad() { String anavn, bnavn; Avdeling a; Barn b; System.out.print("Avdelingens navn: "); anavn = inn.intext(); System.out.print("Barnets navn: "); bnavn = inn.intext(); a = (Avdeling) alleavd.get(anavn); b = (Barn) allebarn.get(bnavn); if (a == null b == null) { System.out.println("Finner ikke barn/avdeling"); return; a.søknad(b); 12

Søknad om opptak (klassen Avdeling) // I klassen Avdeling: void søknad(barn b) { venteliste.put(b.navn, b); b.settventeliste(this); // I klassen StorebarnAvd: // I klassen SmåbarnAvd: void søknad(barn b) { if (b.alder() < 3) { super.søknad(b); else { System.out.println("For stor"); void søknad(barn b) { if (b.alder() >= 3) { super.søknad(b); else { System.out.println("For liten"); 13

Søknad om opptak (klassen Barn) // I klassen Barn: int alder() { int iår = Calendar.getInstance().get(Calendar.YEAR); return iår - født; void settventeliste(avdeling a) { if (venter!= null) { venter.fjernfraventeliste(this); venter = a; // I klassen Avdeling: void fjernfraventeliste(barn b) { venteliste.remove(b.navn); 14

Opptak // I klassen Barnehage: void opptak() { Iterator it = alleavd.values().iterator(); while (it.hasnext()) { Avdeling a = (Avdeling) it.next(); a.opptak(); 15

Opptak (klassen Avdeling) // I klassen Avdeling: void opptak() { ArrayList søknader = new ArrayList(); Iterator it = venteliste.values().iterator(); while (it.hasnext()) { Barn b = (Barn) it.next(); if (prioritert(b)) { søknader.add(0,b); // Legg til først else { søknader.add(b); // Legg til sist // Søknadslisten er nå sortert slik at barn med prioritet // ligger først i arrayen. while (antallledige() > 0 && søknader.size() > 0) { Barn b = (Barn) søknader.remove(0); taopp(b); 16

Opptak (klassen Avdeling forts.) // I klassen Avdeling: boolean prioritert(barn b) { return false; void taopp(barn b) { tattopp.put(b.navn, b); fjernfraventeliste(b); b.tattopp(this); // I klassen SmåbarnAvd: boolean prioritert(barn b) { return b.søskenmedplass(); // I klassen StorebarnAvd: boolean prioritert(barn b) { return b.harplass(); // I klassen Barn: void tattopp(avdeling a) { if (opptak!= null) opptak.slutter(this); if (venter == a) venter = null; opptak = a; // I klassen Avdeling: void slutter(barn b) { tattopp.remove(b.navn); 17

Opptak (klassen Barn) // I klassen Barn: boolean harplass() { return opptak!= null; boolean søskenmedplass() { boolean plass = false; Iterator it = søsken.values().iterator(); while (it.hasnext() &&!plass) { Barn b = (Barn) it.next(); if (b.harplass()) { plass = true; return plass; 18

Ønsket endring 1 Opptak av barn skjer ikke lenger ved loddtrekning, men slik at de eldste barna innen hver kategori (avdelingstype, prioritet) blir tildelt plass først. Hva/hvor mye må endres for å få til dette? 19

Ønsket endring 2 Systemet skal nå brukes for å administrere flere barnehager, ikke bare en. Variant A: Opptak skal fortsatt kjøres separat for hver barnehage. Variant B: Opptaksprosessen skal samordnes ved at Det kan søkes om plass i inntil sju barnehager i prioritert rekkefølge. Hver barnehage melder inn antall ledige plasser i hver kategori (små/store barn). Opptak skjer felles etter samme kriterier som før (alder og prioritet). Hva/hvor mye må endres for å få til dette? 20

Refaktorering

Prosessen med å endre et program/system slik at det ikke endrer ekstern oppførsel men likevel forbedrer den interne strukturen. Mål: Rydde opp i koden, uten å introdusere (nye) feil.

Generelle tips (Fowler) Når du skal legge til funksjonalitet og programkoden ikke er strukturert i forhold til dette gjør først refaktorering og legg så til den ønskede funksjonaliteten. Før du starter med refaktorering, sørg for at du har en solid mengde selv-sjekkende tester. Refaktorering endrer programmet i små skritt. Hvis du gjør noe galt, er det lett å finne feilen. «Any fool can write code that a computer can understand. Good programmers write code that humans can understand.»