Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

Forelæsning Uge 6 – torsdag – repetition

Lignende præsentationer


Præsentationer af emnet: "Forelæsning Uge 6 – torsdag – repetition"— Præsentationens transcript:

1 Forelæsning Uge 6 – torsdag – repetition
Java style guide Niveauer af programbeskrivelser Arraylister (én-til-mange relation) For-løkker (almindelig og udvidet) Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (magen til) Klassevariabler og klassemetoder Levetid for variabler og parametre Virkefeltsregler Algoritmeskabeloner Sortering ved hjælp af Collections og Comparable

2 ● Java style guide Navngivning Indrykning
Navne skrives på engelsk (eller amerikansk) og skal være velvalgte (beskrivende) Klasser: med stort CamelCase eks.: Person, String, NumberDisplay, Variabler og metoder: med lille camelCase eks.: firstName, trackName, displayString Indrykning Alt mellem {} rykkes ét ’hak’ ind For hvert ekstra niveau af {} rykkes endnu et ’hak’ ind public class Person { private int age; public Person() age = 32; } public class Person { private int age; public Person() { age = 32; } Mine slides BlueJ editor BlueJ styleguide: Link

3 ● Niveauer af programbeskrivelser
Klassediagram (oversigt) Hvad (specifikation) JavaDoc (mellem-niveau) Hvad Java-kode (detaljeret) Hvordan (inplementation) Objektdiagram (oversigt) Relationer mellem objekter (referencer) Sekvensdiagram (detaljeret) Interaktion mellem objekter (metodekald) Statisk (struktur) rum for hvad der generelt kan ske Dynamisk scenarie for hvad der vil ske i en konkret situation

4 Klassediagram (statisk, oversigt)
TestDriver run() UML BlueJ Sommetider viser klassediagrammet også nogle af feltvariablerne 1 ClockDisplay NumberDisplay 2 timeTick() setTime(int h, int m) getTime() void updateDisplay() int getValue() String getDisplayValue() void setValue(int val) void increment()

5 Java-kode (statisk, detaljeret)
Disse kommentarer indsættes i klassens dokumentation

6 JavaDOC (statisk, mellem-niveau)
Første sætning Tilsvarende gælder for kommentarer til klassen og kommentarer til metoder Hele kommentaren

7 Objektdiagram (dynamisk, oversigt)
ClockDisplay hours minutes displayString NumberDisplay limit value 24 String "00:00" NumberDisplay limit value public ClockDisplay() { hours = new NumberDisplay(24); minutes = new NumberDisplay(60); updateDisplay(); } 60 public NumberDisplay(int rollOverLimit) { limit = rollOverLimit; value = 0; } Konstruktører

8 Sekvensdiagram timeTick
minutes :NumberDisplay hours :NumberDisplay 23:00 22:59 :ClockDisplay timeTick() increment() getValue() increment() updateDisplay() getDisplayValue() getDisplayValue() public void timeTick() { minutes.increment(); if (minutes.getValue() == 0) { hours.increment(); } updateDisplay(); private void updateDisplay() { displayString = hours.getDisplayValue() + ":" + minutes.getDisplayValue(); }

9 ● Arraylister (én-til-mange relation)
Objektreferencer for at holde fast i et objekt skal der bruges en objektreference (en variabel) for at holde fast i objekter skal der bruges objektreferencer... Collections en særlig slags objekter, der kan opbevare (referencer til) objekter f.eks. ArrayList java.util en pakke, der bl.a. indeholder klasserne i Javas såkaldte collection framework

10 Eksempel: Index over bekendte
public void createIndex() { //declare a field of type Person Person person; //declare a field of type ArrayList ArrayList<Person> persons; //create empty arraylist persons = new ArrayList<Person>(); // create persons and add them to arraylist person = new Person( "Jeppe", " ", 33 ); persons.add(person); person = new Person( "Ole", " ", 28 ); person = new Person( "Linda", " ", 21 ); } Husk parenteserne Kald af konstruktør Ellers typenavn

11 Objektdiagram for testMethod
persons ArrayList<Person> 1 2 size() = 0 1 2 3 Bemærk at index'erne nummereres fra 0 til size()-1 name number age 33 Person String "Jeppe" " " name number age 28 Person String "Ole" " " name number age 21 Person String "Linda" " " person

12 Realisering af én-til-mange
UML Feltvariabel (liste af personer) AddressBook ArrayList<Person> persons void addPerson(Person p) void print() String getNumber(String name) int averageAge() Person String getName() String getNumber() int getAge() * Metode (tilføjer person til listen) BlueJ

13 Realisering af en-til-mange – kode
For at realisere en en-til-mange relation i koden skal man gøre 3 ting Inkluderer Collections klassen Comparable interfacet IM 1. Importere klassen ArrayList import java.util.ArrayList; import java.util.*; ER 2. Erklære en feltvariabel af typen ArrayList<…> private ArrayList<Person> persons; 3. Initialisere feltvariablen (gøres normalt i konstruktøren) KO public AddressBook(){ persons = new ArrayList<Person>(); } IMERKO-reglen

14 ArrayList er en parametriseret type
Erklæring af ArrayList Klassenavn Type parameter (i <…> parenteser) public class ArrayList <E> { boolean add( E e){…} void add(int index, E element){…} boolean remove(Object o){…} E get(int index){…} boolean contains (Object o){…} boolean isEmpty(){…} int size(){…} ... } Flere detaljer: se JavaDoc... Link

15 Arrayliste med heltal Parameteren til ArrayList skal være en objekt type Det betyder, at man ikke kan skrive ArrayList<int> I stedet skal man skrive ArrayList<Integer> Integer er en objekt type med de "samme værdier" som den primitive type int Integer er en wrapper klasse for int (wrapper = indpakning) Integer-værdier konverteres automatisk til int-værdier (og omvendt), når der er behov for det Eksempel liste.add(i) i = liste.get(3) hvor i er af typen int og liste af typen ArrayList<Integer>

16 Keyword (reserveret ord)
● For-løkker ERKLÆRING + INITIALISERING Lokal variable i af type int med startværdi 0 Almindelig for-løkke TEST Falsk Sand Keyword (reserveret ord) KROP move(100); turn(90); OPDATERING i++ ≈ i = i+1 for( int i=0 ; i<4 ; i++ ) { move(100); turn(90); }

17 For-each-løkke (udvidet for-løkke)
Erklæring og initialisering er slået sammen public void createIndex() { Person person; ArrayList<Person> persons = new ArrayList<Person>(); // add some persons person = new Person("Jeppe", " ", 33 ); persons.add(person); ... } Vi vil gerne gennemløbe arraylisten og printe alle personerne i den Keyword (reserveret ord) Erklæring af lokal variabel (af type Person) Reference til den arrayliste, der skal gennemløbes for ( Person person : persons ) { System.out.println(person); } KROP (de instruktioner, der skal gentages)

18 Find gennemsnitsalder
/** * return the average age of the * people in the address book */ public int averageAge() { return ageSum() / persons.size(); } /** * return the sum of the age of the * people in the address book */ private int ageSum() { int result = 0; for (Person person : persons) { result += person.getAge(); } return result; Metoden er private (den kan kun bruges i denne klasse) Angiver at værdien af udtrykket på højresiden lægges til variablen på venstresiden

19 X ≤ Y angiver at udtryk af type X kan assignes til variabler af type Y
● Primitive typer byte short int long 8 bit 16 bit 32 bit 64 bit Heltal Reelle tal 32 bit 64 bit float double Eksempel: boolean 1 bit Sandhedsværdier char 16 bit Tegn double d; int i; Man må gerne assigne en lille værdi til en stor variabel X ≤ Y angiver at udtryk af type X kan assignes til variabler af type Y Lovligt: int ≤ double d = 7; Ulovligt: i = 3.5; Man kan ikke proppe en stor værdi ind i en lille variabel

20 Forfremmelse og begrænsning
En værdi kan forfremmes til en "større type" d = 7; Lovligt: integer udtrykket 7 bliver forfremmet til typen double Håndteres automatisk af compileren (når det er nødvendigt) En værdi kan begrænses til en "mindre type" Kræver et type-cast (indsat af programmøren) i = d; Ulovligt: Man kan ikke proppe en stor værdi ind i en lille variabel i = (int) 3.5; Lovligt: double udtrykket 3.5 bliver begrænset til typen int type-cast

21 Konstanter (literals)
Type Literal byte 15 short -3215 int 45320 long 45320L float 15.03e5F double 15.03e5 char 'a' boolean false Wrapper type Byte Short Integer Long Float Double Character Boolean Primitive typer Objekt typer Objekt type String "hello"

22 ● Identitet versus lighed (magen til)
I det virkelige liv skelner vi mellem objekter, der er identiske, og objekter, der ligner hinanden To personer er ikke identiske, selvom de hedder det samme og er født samme dag (har samme attributværdier). Hvis man fortæller tjeneren, at man vil have den Pizza, som står på nabobordet, kommer han med en der ligner (dvs. er magen til). Java == identitet equals lighed (magen til) Operator Metode i Object klassen (redefineres i mange underklasser, f.eks. String)

23 Identitet mellem objekter
p1 == p2 evaluerer til false "Jill" p2 Person "Fred" p1 Operatoren == tester for identitet Det er ikke nok, at de to objekter har samme attributværdier Nedenfor peger p1 og p2 på samme objekt p1 == p2 evaluerer til false "Fred" p2 Person p1 p1 == p2 evaluerer til true "Jill" p2 Person "Fred" p1

24 Sammenligning af strenge
Strenge skal altid sammenlignes ved hjælp af equals metoden fra String klassen Eksempel Næste input String input = reader.getInput(); Lad os antage, at input derved har fået værdien "stop" Test ved hjælp af equals metoden "stop" input String equals tester lighed (magen til) if( input.equals("stop") ) { ... } Testet evaluerer til true Test ved hjælp af == operatoren == tester identitet if( input == "stop" ) { ... } Testet evaluerer til false – eller true, hvis det er en smart compiler

25 ● Klassevariabler og klassemetoder
Instansvariabler og instansmetoder Hvert objekt har sine egne af feltvariabler Metoder kaldes ved at bede objekter om at udføre dem Det er imidlertid muligt at erklære feltvariabler og metoder som tilhører klassen Klassevariabler og klassemetoder erklæres med keywordet static Klassevariabler bruges til at modellere egenskaber for klassen, f.eks.: myndighedsalder for personer, fælles rentesats for alle konti Klassemetoder bruges til at modellere operationer, der er uafhængige af objekters tilstande

26 Har I set dem før? Hvor har I mødt klassemetoder?
new TestDriver() void run() Open Editor Compile Inspect Remove Klassemetode kan kaldes uden at lave et objekt af typen TestDriver Hvor har I mødt klassevariabler? System.out.println(……); Klasse i java.lang (importeres automatisk) Klassevariabel af type PrintStream Metode i PrintStream udskriver parameteren på "standard" output stream (BlueJ's terminal)

27 Eksempler fra java.lang.Math
public class Math { public static final double PI = ... /** 0.0 ≤ random() < 1.0 */ public static double random() {...} /** sqrt(a) == a */ public static double sqrt(double a) {...} /** pow(a,b) == ab */ public static double pow(double a, double b) {...} } konstant (kan ikke ændres) navne på konstanter skrives med store bogstaver og "underscores", fx MAX_NO

28 Brug af klassevariabler og klassemetoder
Klassevariable og klassemetoder tilgås via klassen Math.PI; Math.random(); Account.setInterestRate(2.65); Kan også tilgås via objekt, men det er "dårlig stil" og kan være forvirrende Account myAccount = new Account(...); myAccount.setInterestRate(2.65); Metoden kaldes på en specifik bankkonto, men det er rentesatsen for alle konti, der ændres Pause

29 ● Levetid for variabler og parametre
Feltvariabler modellerer tilstand for objekter levetid er den samme som objektets Lokale variabler hjælpevariabler i en metode/konstruktør levetid er metode/konstruktør kaldet Parametre parametrisering af metode/konstruktør lokale variabler hvor startværdien leveres af kalderen Klassevariabler programudførelsen

30 ● Virkefeltsregler (fortolkning af navne)
I Java (og andre programmeringssprog) er der præcise, utvetydige regler for fortolkning af navne For at bruge et navn skal det erklæres eller importeres Navne fra java.lang importeres automatisk Klasserne String, Math og System Wrapper klasserne for de primitive typer En masse andet…(se i Java API) Variabler kan erklæres som feltvariabler i klasser og som lokale variabler i metoder/konstruktører Som vi skal se i det følgende, er der lidt forskel på hvilke regler, der gælder de to steder

31 Tre slags variabler Feltvariabler Parametre Lokale variabler 31
public class Date { private int day; private int month; private int year; public void addDays(int d) { for ( int i=0; i<d; i++ ) { setToNextDate(); } private int daysInMonth() { int[] daysInMonth = {0,31,28,31,…}; int res; res = daysInMonth[month]; // handle leap year if (month == 2 && isInLeapYear()) { res++; return res; 31

32 Feltvariabler public class Scope { public Scope() { i = 0; } public void addTwo() { addOne(); addOne(); private int i; public void addOne() { i = i + 1; public int getValue() { return i; Style guide: Feltvariabler bør erklæres i begyndelsen af klassen En klasse definerer et navnerum, hvor alle navne erklæret i klassen er tilgængelige overalt i klassen

33 Metoder public class Scope { public Scope() { i = 0; } public void addTwo() { addOne(); addOne(); private int i; public void addOne() { i = i + 1; public int getValue() { return i; En klasse definerer et navnerum, hvor alle navne erklæret i klassen er tilgængelige overalt i klassen

34 Parametre public void addDays( int d ) { for ( int i=0; i < d; i++ ) { setToNextDate(); } En metode definerer et navnerum, hvor parametre til metoden er tilgængelige overalt i metoden

35 Lokale variabler public void pip() { x = x++; int x = 0; x++; } X Fejl (medmindre der er en feltvariabel x) I en metode/konstruktør definerer en blok {...} et navnerum, hvor alle navne erklæret i blokken er tilgængelige fra og med erklæringen og indtil blokkens afslutning

36 Indre blokke I en blok kan man erklære indre blokke { ... { ... } ... } public void pip() { int i = 0; { i++; System.out.println(i); int x = 0; x = i; x++; System.out.println(x); } Reglen for indre blokke er den samme som reglen for blokke i metoder (forrige slide), dvs. lokale variabler er tilgængelig fra og med erklæringen og indtil afslutningen på den indre blok

37 Et navn virker også inde i indre blokke
public void pip() { int i = x; int x = 0; ... { i++; System.out.println(i); x++; System.out.println(x); } Fejl (medmindre der er en feltvariabel x)

38 Et navn kan “skygge” for et andet
public class Scope { private int i; public Scope() { i = 0; } public void pip() { i++; { i++; System.out.println("a " + i); int i = 0; i++; System.out.println("b " + i); public void testMethod() { Scope s = new Scope(); s.pip(); Gør livet lettere for alle: Brug forskellige navne !!! this.i

39 Kontrolvariabel i for-løkker
Konstruktionen for ( int j=0 ; j<4; j++) { System.out.println(j); } svarer til { int j; for (j=0; j<4; j++) { System.out.println(j); } For-each løkke for ( Person p : persons) { System.out.println(p); }

40 Virkefeltsregler i Java (opsummering)
En feltvariabel erklæret i en klasse virker overalt i klassen med undtagelse af virkefeltet for eventuelle ens-benævnte lokale variabler erklæret i blokke i klassens metoder En lokal variabel erklæret i en blok virker overalt i blokken med undtagelse af den del af blokken, der går forud for erklæringen virkefeltet for eventuelle ens-benævnte lokale variabler erklæret i indre blokke i blokken

41 Hvilken variabel? Antagelse: Feltvariabler er erklæret øverst i klassen (jvf. style-guide) Metode: Gå op og ud indtil en erklæring nås (spring indre blokke og metoder/konstruktører over) public class Scope { private int i = 0; public Scope ( int i ) { i = i + 1; System.out.println("a " + i ); } public void pip() { System.out.println("b " + i ); for ( int i = 0; i < 3; i ++){ System.out.println("c " + i ); System.out.println("d " + i );

42 ● Algoritmeskabeloner
Finder ét element med den angivne egenskab Alle eksamenssæt indeholder opgaver, som kan løses ved hjælp af algoritmeskabeloner public TYPE findOne( PARAM ) { for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { return elem; } return null; Finder alle elementer med den angivne egenskab, og returnerer dem i en arrayliste public ArrayList<TYPE> findAll( PARAM ) { ArrayList<TYPE> result = new ArrayList<TYPE>(); for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result.add(elem); } return result;

43 Algoritmeskabeloner Finder antallet af elementer med den angivne egenskab public int findNoOf( PARAM ) { int result = 0; for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result++; } return result; Finder summen af de elementer, der har den angivne egenskab public int findSumOf( PARAM ) { int result = 0; for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { result += VALUE(elem, PARAM); } return result;

44 findBest = finder bedste element i liste
public TYPE findBest( PARAM ) { TYPE result = null; for ( TYPE elem : LISTE ) { if ( TEST(elem,PARAM) ) { if ( result == null || BEST(elem,result,PARAM) ) { result = elem; } return result; Holder hidtil bedste Er elem bedre end hidtil bedste? or-operator (lazy) Dette test udføres kun, hvis result != null Har vi et hidtil bedste? Algoritmeskabelon Gennemsøger LISTE og returnerer det BEDSTE af de elementer, der opfylder TEST Hvis flere elementer er lige gode, returneres et vilkårligt af disse Hvis der ingen er, returneres null Hvis man undlader TEST (og fjerner den yderste if-sætning), finder man det BEDSTE blandt alle i LISTE

45 Sammenligning af algoritmeskabeloner
Fælles Alle skabeloner gennemsøger en arrayliste og tjekker hvert enkelt element i listen op mod en angiven betingelse (der kan afhænge af parametre) Betingelsen involverer kun det element i listen, der pt. undersøges Forskelle findOne returnerer ét element, der opfylder den angivne betingelse (og stopper så snart en sådant element er fundet) findAll returnerer en arrayliste med alle elementer, der opfylder den angivne betingelse findNoOf returnerer antallet af elementer, der opfylder den angivne betingelse findSumOf returnerer summen af værdierne af de elementer, der opfylder den angivne betingelse findBest returnerer det bedste af de elementer, der opfylder den angivne betingelse Skabelon Initialisering Opdatering findAll tom liste add findNoOf += 1 findSumOf += VALUE findBest null hidtil bedste

46 ● Sortering via Collections og Comparable
Klassen Collections indeholder en række nyttige metoder Metoderne kan bruges på forskellige typer objektsamlinger Typen af objektsamlingen skal implementere Collection interfacet Det er f.eks. tilfældet for ArrayList T min(Collection<T> c) //returnerer mindste element T max(Collection<T> c) //returnerer største element void sort(List<T> l) //sorterer listen void shuffle(List<T> l) //blander listen void reverse(List<T> l) //vender listen om ... Alle metoderne er static Collections.metode()

47 Brug af Collections på ArrayList<Person>
public class Driver { public static void run() { ArrayList<Person> list; list = new ArrayList<Person>(); list.add(new Person("Cecilie", 18)); list.add(new Person("Erik", 16)); list.add(new Person("Adam", 16)); list.add(new Person("Bo", 39)); list.add(new Person("Dora", 47)); print("*******************"); print("liste: " + list); Collections.shuffle(list); print("blandet liste: " + list); Collections.reverse(list); print("liste bagfra: " + list); } ...

48 Brug af Collections på ArrayList<Person>
public class Driver { public static void run() { ArrayList<Person> list; list = new ArrayList<Person>(); list.add(new Person("Cecilie", 18)); list.add(new Person("Erik", 16)); list.add(new Person("Adam", 16)); list.add(new Person("Bo", 39)); list.add(new Person("Dora", 47)); print("*******************"); print("liste: " + list); print("min: " + Collections.min(list)); print("max: " + Collections.max(list)); Collections.sort(list); print("sorteret liste: " + list); } ...

49 Hvad gik galt? Metoderne min, max og sort i klassen Collections kan kun anvendes, hvis elementerne i ArrayListen har en ordning String klassen har en indbygget ordning (alfabetisk sortering) Derfor kunne vi bruge min, max og sort på ArrayList<String> Person klassen (som vi selv har lavet) har (endnu ikke) en ordning Derfor kan vi ikke bruge min, max og sort på ArrayList<Person> Men vi kan godt bruge shuffle og reverse, idet disse metoder ikke kræver en ordning

50 Ordning kan defineres via interfacet Comparable
public interface Comparable<T> { /** whether this object is * smaller (negative integer) * equal (0) * or greater (positive integer) * than object o */ public int compareTo(T o); } Tænk på et interface som en rolle Person-objekter kan spille rollen Comparable, hvis to ting er opfyldt Person skal implementere interfacet public class Person { ... } implements Comparable<Person> { T = Person public int compareTo(Person p) { ... } T = Person Den ordning, som compareTo definerer, kaldes den NATURLIGE ORDNING Person skal implementere en compareTo metode med den signatur, der er specificeret i interfacet

51 compareTo kan implementeres på mange måder
Vi kan sortere (alfabetisk) efter personens navn public int compareTo(Person p){ return name . compareTo ( p.name ); } Personens eget navn Metode fra String klassen (sorterer alfabetisk) Navnet på personen p Vi kan sortere efter personens alder (yngste først) public int compareTo(Person p){ return this.age - p.age; } public interface Comparable<T> { /** whether this object is * smaller (negative integer) * equal (0) * or greater (positive integer) * than object o */ public int compareTo(T o); }

52 Vi kan kombinere de to sorteringskriterier
De yngste først Hvis to personer er lige gamle: alfabetisk efter navn public int compareTo(Person p){ if ( this.age != p.age ) { return this.age - p.age; } //alderen er identisk return name.compareTo(p.name); Er alderen forskellig? Yngste først Alfabetisk efter navn Alle eksamenssæt indeholder opgaver, som kan løses ved hjælp af Collections og Comparable

53 Multiple sorteringsmåder
Hvad gør man, hvis vi har behov for at kunne sortere på flere forskellige måder, f.eks Sommetider sortere personer efter navn Sommetider sortere personer efter alder Sommetider sortere personer efter alder og navn Så bruger man Collections sammen med Comparator interfacet (i stedet for Comparable interfacet) I dIntProg eksamensopgaverne er det tilstrækkeligt at bruge Comparable

54 Det var alt for nu….. … spørgsmål


Download ppt "Forelæsning Uge 6 – torsdag – repetition"

Lignende præsentationer


Annoncer fra Google