Objektorientert design av kode. Refaktorering.

Like dokumenter
Objektorientert design av kode. Refaktorering.

Obligatorisk oppgave 2: Bilhierarki

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

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

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

UML-Unified Modeling Language

UNIVERSITETET I OSLO

Konstruktører. Bruk av konstruktører når vi opererer med "enkle" klasser er ganske ukomplisert. Når vi skriver. skjer følgende:

INF1010 våren 2019 Onsdag 30. januar. Mer om unntak i Java (med litt repetisjon av I/O først)

INF1010 våren Arv og subklasser - del 2

UNIVERSITETET I OSLO

UML-Unified Modeling Language. Prosess-oversikt. Use case realisering

Løsningsforslag Test 2

Introduksjon til objektorientert programmering

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Seminaroppgaver IN1010, uke 2

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

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

TDT4100 Objektorientert programmering

UNIVERSITETET I OSLO

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

Gjennomgang av eksamen H99

IN1010 våren 2018 Tirsdag 15. mai. Repetisjon av subklasser og tråder. Stein Gjessing Institutt for informatikk Universitetet i Oslo

Leksjon 7. Filer og unntak

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

INF Uke 10. Ukesoppgaver oktober 2012

INF1010, 22. mai Prøveeksamen (Eksamen 12. juni 2012) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

(MVC - Model, View, Control)

Enkle generiske klasser i Java

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

IN Notat om I/O i Java

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

UNIVERSITETET I OSLO

INF1010 Arv. Marit Nybakken 2. februar 2004

OPPGAVE 5b og 8b Java Kode

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

INF1010 Eksamenstips. Løsningsforslag prøveeksamen del 1.

Løsningsforslag til eksamen i INF1000 våren 2006

Kapittel 7: Mer om arv

IN1010 V19, Obligatorisk oppgave 2

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

INF1000 Prøveeksamen Oppgave 7 og 9

Repetisjon. INF gruppe 13

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

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

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

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

INF1010 våren Arv og subklasser del 1

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

. Ved sensur vl1 ahe bokstaverte deloppgaver (a, b, c,...) telle like mye.

INF106 Objektorientert programmering

LO191D/LC191D Videregående programmering

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I Løsningsforslag

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; }

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

INF1000: Forelesning 6. Klasser og objekter del 1

UNIVERSITETET I OSLO

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

HØGSKOLEN I SØR-TRØNDELAG

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

INF1010 våren Generalisering -spesialisering Gjenbruk av klasser. Ved arv. Klasse-hierarkier. Stein Gjessing.

Object interaction. Innhold. Abstraksjon Grunnleggende programmering i Java Monica Strand 3. september 2007.

INF1010 våren Arv og subklasser del 1

Use case drevet design med UML

INF1010 våren 2017 Torsdag 2. februar. Arv og subklasser - del 2

INF Løsning på seminaropppgaver til uke 8

UNIVERSITETET I OSLO

TOD063 Datastrukturer og algoritmer

UNIVERSITETET I OSLO

En snarvei til INF2100

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

INF1010 våren Grensesnitt

INF Notat om I/O i Java

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

INF1010 Binære søketrær ++

INF1010 våren januar. Objektorientering i Java

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

IN1010 våren 2018 Tirsdag 6. februar. Arv og subklasser - del 2

UNIVERSITETET I OSLO

INF1010 våren Arv og subklasser del 1 pluss (hvis vi har tid) litt om Unntak, IO og Scanner-klassen

LC191D/LO191D Videregående programmering mai 2010

Læringsmål for forelesningen

INF Obligatorisk innlevering 5

Transkript:

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

Læringsmål Kjenne til og kunne bruke viktige prinsipper for god kodedesign. Kunne finne alternative løsninger for et gitt problem. Kunne vurdere fordeler og ulemper ved ulike løsninger.

Objektorientert design i INF1050 og INF1010 INF1050: Fokus på hele systemutviklingsprosessen. INF1010: Programmering i Java. Sommerville: Object-oriented design is concerned with developing an objectoriented model of a software system to implement the identified requirements. The objects in an object-oriented design are related to the solution to the problem that is being solved.

Bilhierarki Eksempelet fra oblig 2

Oblig2: Bilhierarki Alle biler er enten elbiler eller fossilbiler. Alle fossilbiler er enten personbiler eller lastebiler. Alle Bil-objektene ble lagt inn i en ArrayList<Bil> (eller Bil[]). Programmet skulle lese inn data fra fil og deretter skrive ut alle biler, alle elbiler eller alle fossilbiler. Diskuter fordeler og ulemper ved denne løsningen fremfor å ha Bilobjektene i to separate lister (ArrayList<Elbil> og ArrayList<Fossilbil>).

Alternativt design Bil-oppgaven: Komposisjon B il M o t o r P e rs o n b il L a s t e b il E lm o t o r F o s s ilm o t o r

Klassestruktur basert på komposisjon Har i tillegg konstruktører metoder for utskrift subklassene Personbil og Lastebil abstract class Bil { private Motor motor; abstract class Motor { class Elmotor extends Motor { private double batterikapasistet; class Fossilmotor extends Motor { private double utslipp;

public void skrivalle(string filter) { for (Bil bil:biler) { skrivhvismotorerlik(filter); Filtrert utskrift vha instanceof // I klassen Bil: public void skrivhvismotorerlik(type) { if ((type.equals("el") && motor instanceof Elmotor)) (type.equals("fossil")&& motor instanceof Fossilmotor)) skrivutinfo();

Filtrert utskrift vha getmetode // I klassen Bil: public void skrivhvismotorerlik(type) { if (type.equals(motor.henttype())) skrivutinfo(); // I klassen Motor: abstract String henttype(); // I klassen Elmotor: public String henttype() { return "EL"; // Tilsvarende for Fossilmotor

Filtrert utskrift vha egen sjekk // I klassen Bil: public void skrivhvismotorerlik(type) { if (motor.er(type)) skrivutinfo(); // I klassen Motor: abstract boolean er(string type); // I klassen Elmotor: public boolean er(string type) { return type.equals("el"); // Tilsvarende for Fossilmotor

Utskrift til fil Filformatet fra obligen: EL <reg.nr.> <batterikapasitet> PERSONBIL <reg.nr.> <utslipp> <seter> LASTEBIL <reg.nr.> <utslipp> <nyttevekt> Hvor bør metoden(e) for å skrive til fil legges?

Alt 1: Hvert objekt skriver sine data til fil public void skrivtilfil(string filnavn) { try { PrintWriter writer = new PrintWriter(filnavn); for (Bil bil:biler) { skrivbiltilfil(writer); writer.close(); catch (FileNotFoundException e) { // Feilhåndtering // I klassen Bil: public void skrivbiltilfil(writer) { motor.skrivmotortilfil(writer); writer.print(registreringsnummer); // Osv...

Alt 2: Hvert objekt lager teksten som skal skrives til fil public void skrivtilfil(string filnavn) { try { PrintWriter writer = new PrintWriter(filnavn); for (Bil bil:biler) { writer.println(bil.tilfil()); writer.close(); catch (FileNotFoundException e) { // Feilhåndtering // I klassen Bil: public String tilfil() { return motor.tilfil() + registreringsnummer; // Osv...

Noen generelle prinsipper Ekspertprinsippet, kohesjon og kobling

Ekspertprinsippet («Gjøre selv») Problem: Hvordan tilordne ansvar til objekter? Løsning: Det objektet som har kunnskapen (dataene) bør ha ansvaret.

(Høy) kohesjon og (lav) kobling Kohesjon er et mål på hva slags ansvar et objekt har og hvor fokusert ansvaret er. Mål: objekter som har moderat ansvar og utfører et begrenset antall oppgaver innenfor ett funksjonelt område. Kobling er et mål på hvor sterkt et objekt er knyttet til andre objekter. Mål: Objekter med begrenset antall avhengigheter.

Ja, men, det virker jo! Hvorfor er det viktig med god kodedesign? Når er det viktig med god kodedesign? Hva er god kodedesign? Generelt viktig: Lesbarhet. Vedlikeholdbarhet. Gjenbrukbarhet. Effektivitet. Robusthet. Pålitelighet. Korrekthet.

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

Bruktbutikk Eksempel fra høstens eksamen i INF1000/INF1001

Utvidelse av bruktbutikken ArrayList<Annonse> HashMap<String, Kategori> ArrayList<Bud> Nytt: En annonse skal kunne tilhøre flere kategorier. Det skal være mulig å Oppgi alle kategoriene til en annonse. Søke etter alle annonser som er i et gitt sett kategorier. Hvilke endringer ville du gjort i datastrukturen for å få til dette?

Alternative datastrukturer Bruktbutikk Kategori Annonse Annonse Bud Bruktbutikk Alt 1 Bud Alt 3 Kategori Bruktbutikk Annonse Kategori Hva er fordelene/ulempene med hver av disse? Alt 2 Bud

Bruktbutikk kategorier og annonser Sammenlign følgende beskrivelser: En bruktbutikk selger ting i en rekke ulike kategorier. Innen hver kategori finnes det en mengde annonser hvor potensielle kjøpere kan legge inn bud på de ulike tingene. En annonse kan tilhøre flere kategorier samtidig. En bruktbutikk selger ting via en mengde annonser hvor potensielle kjøpere kan legge inn bud. For hver annonse er det angitt et sett med kategorier som annonsen tilhører.

Bruktbutikk med kunder Bruktbutikken ønsker å opprette et kunderegister og samtidig utvide funksjonaliteten slik at også kundene kan legge ut annonser. Både privatpersoner og bedrifter kan være kunder. Alle kunder kan opprette annonser for å selge ting, men bare privatkunder kan gi bud. Å opprette annonser er gratis for privatpersoner. Bedriftskunder kan enten betale per annonse de legger ut eller en fast månedsavgift. Hvilken datastruktur ville du foreslått her?

Forslag: Bruktbutikk med kunder K u n d e P e r s o n k u n d e B e d r if ts k u n d e A b o n n e m e n t E n k e lta b o n n e m e n t M å n e d s a b o n n e m e n t

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? 26