Objektorienterad modellering och diskreta strukturer...

33
EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061) HT1 2015, FÖRELÄSNING 6 Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund Förra föreläsningen • Designmönster – Decorator (repetition) – Model-View-Control – Observer • Paketdesign LSP – Substitutionsprincipen

Transcript of Objektorienterad modellering och diskreta strukturer...

Page 1: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 1

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061) HT1 2015, FÖRELÄSNING 6

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Förra föreläsningen •  Designmönster

– Decorator (repetition) – Model-View-Control – Observer

•  Paketdesign •  LSP – Substitutionsprincipen

Page 2: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 2

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Dagens agenda •  Factory Method-mönstret

•  Syntaxanalys

•  Felhantering

•  Tillståndsdiagram

•  Namngivning

•  Introduktion till projekt 2 (”XL”) – EDA061 (finns på hemsidan)

•  Hur går projektet? Glöm inte redovisa nerlagd tid.

•  Det går att boka in tider för XL-projektet.

•  Det går snart att boka labtid – grupper om 2 personer

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Vecka 4-7 Vecka EDA061 EDAF10 4 avsluta Computer

XL design övning 3 OMD

föreläsning DS avsluta Computer föreläsning DS övning 3 OMD

5 XL designmöte 1 föreläsning DS laboration 1 DS föreläsning DS övning 4 DS

6 XL implementation föreläsning DS laboration 2 DS föreläsning DS övning 5 DS

7 XL designmöte 2 föreläsning OMD

föreläsning DS laboration 3 DS föreläsning OMD övning 6 DS

Page 3: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 3

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Att göra EDA061 Anmälan till XL-projektet senast fredag den 25

september. Designmöte 1-2 oktober.

EDAF10 Anmälan till laborationer senast fredagen den 25

september. Börjar vecka 5.

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Factory Method SomeApp

Square

<<interface>> Shape

Circle

<<creates>>

SomeApp har endast beroende till gränssnittet Shape SomeApp skapar objekt av Square och Circle – och blir även beroende till konkreta klasserna Square och Circle.

Page 4: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 4

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Factory Method SomeApp

Square

<<interface>> Shape

<<interface>> Shape Factory

+ makeSquare():Shape + makeCircle():Shape

Circle

<<creates>>

ShapeFactory Implementation

Factory Method tar bort beroendet till de konkreta klasserna

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Factory Method SomeApp

Square

<<interface>> Shape

<<interface>> Shape Factory

+ make(String):Shape

Circle

<<creates>>

ShapeFactory Implementation

Vad måste nu SomeApp känna till?

Page 5: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 5

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Factory method-mönstret Factory method används när man: •  vill undvika beroende av konkreta klasser •  måste avgöra vilken sorts objekt som skall skapas vid

exekveringen

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Factory method – i Computer •  I Computer skapas operander och instruktioner direkt med

konstruerare.

•  Man skulle kunna skapa dessa från den externa representation.

•  Vi gör en fabrik för operander…

•  och en för instruktioner.

Page 6: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 6

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Operandfabriken public class OperandFactory {

public Operand build(String string) { if(string.charAt(0)==’[’) { return new Address(Integer.parseInt( string.substring(1,string.length()−1))); } else { return new LongWord(Integer.parseInt(string)); } }

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Instruktionsfabriken… public class InstructionFactory {

private OperandFactory operandFactory = new OperandFactory(); public Instruction build(String string) { StringTokenizer tokenizer = new StringTokenizer(string); Operand op1, op2, op3; String opCode = tokenizer.nextToken(); if (opCode.equals(”ADD”)) { op1 = operandFactory.build(tokenizer.nextToken()); op2 = operandFactory.build(tokenizer.nextToken()); op3 = operandFactory.build(tokenizer.nextToken()); return new Add(op1, op2, (Address) op3); } ...

Page 7: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 7

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Instruktionsfabriken, forts. } else if (opCode.equals(”CPY”)) { op1 = operandFactory.build(tokenizer.nextToken()); op2 = operandFactory.build(tokenizer.nextToken()); return new Copy(op1, (Address) op2); }

} else if (opCode.equals(”HLT”)) { return new Halt(); } else if … { } else { throw new RuntimeException(”syntax error”); } }

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Felhantering

Page 8: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 8

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Felhantering, forts. public class XLException extends RuntimeException {

private Object object; public XLException(String message, Object object) { super(message); this.object = object; } public Object getObject() { return object; }

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Feldetektering public class Div extends BinExpr {

public Div(Expr expr1, Expr expr2) { super(expr1, expr2); } protected double op(double op1, double op2) { if (op2 != 0) return op1 / op2; else throw new XLException(”division by zero”, this); }

}

Page 9: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 9

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Felhantering … try {

value = expr.value(); } catch (XLException e) {

report(e.getMessage(), e.getObject()); } …

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Exempel Aritmetiska uttryck

Page 10: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 10

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Aritmetiska uttryck – Konkret syntax •  Ett uttryck består av en eller flera termer separerade av

enkla plus- eller minus-tecken.

•  En term består i sin tur av en eller flera faktorer separerade av enkla multiplikations- eller divisionstecken.

•  En faktor är ett tal, en variabel eller ett uttryck inom parenteser.

•  Ett tal består av en eller flera siffror och får inledas med ett minustecken.

•  En variabel består av en eller flera bokstäver bland a–z.

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Konkret grammatik - BNF Expr ::= term (addop term)∗ Term ::= factor (mulop factor)∗ Factor ::= number | name | ’(’ expr ’)’ Addop::= ’+’ | ’−’ Mulop ::= ’∗’ | ’/’ number ::= unsignedNumber | ’−’ unsignedNumber unsignedNumber ::= digit (digit)∗ digit ::= ’0’ | ’1’ | ’2’ | ’3’ | ’4’ | ’5’ | ’6’ | ’7’ | ’8’ | ’9’ name ::= letter (letter)∗ letter ::= ’a’ | ’b’ | ... | ’z’

Operatorer * upprepa 0 eller flera gånger | eller ’ ’ literalt

Page 11: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 11

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Abstrakt representation – abstrakt grammatik

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Java.io.StreamTokenizer public class StreamTokenizer {

public double nval; public String sval; public int ttype = −4; public static final int TT EOF = −1, TT EOL = 10, TT NUMBER = −2, TT WORD = − public StreamTokenizer(Reader r) public int nextToken() throws IOException public void ordinaryChar(int ch) \\ omissions

}

Page 12: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 12

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Java.io.StreamTokenizer public class ExprParser extends StreamTokenizer {

private int token; public ExprParser(String string) throws IOException { super(new StringReader(string)); ordinaryChar(’−’); ordinaryChar(’/’); token = nextToken(); }

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Analys av faktorer private Expr factor() {

Expr e; switch (token) { case ’(’: token = nextToken(); e = expr(); token = nextToken(); return e; case TT NUMBER: double x = nval; token = nextToken(); return new Num(x); case TT WORD: String s = sval; token = nextToken(); return new Variable(s); }

}

Page 13: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 13

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Analys av termer private Expr term() {

Expr result, factor; result = factor(); while (token == ’∗’ || token == ’/’) { int op = token; token = nextToken(); factor = factor(); switch (op) { case ’∗’ : result = new Mul(result, factor); break; case ’/’ : result = new Div(result, factor); break; } } return result;

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Tillståndsdiagram

Page 14: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 14

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Tillståndsdiagram

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

En telefon

Page 15: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 15

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Namngivning

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Namngivning Bra namngivning är fundamental för att göra program begripliga. public class MyList {

private List<int[]> theList; public List<int[]> getList() { List<int[]> list = new ArrayList<int[]>(); for (int[] is : theList) { if (is[0] < 4) { list.add(is); } } return list; }

} Vad handlar det om?

Page 16: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 16

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Det handlar om projektgrupper I vilka grupper finns det plats för ytterligare studenter? public class Groups {

private List<Group> groups; public List<Group> incompleteGroups() { List<Group> list = new ArrayList<Group>(); for (Group group : groups) { if (! group.isComplete()) { list.add(group); } } return list; }

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

En grupp ska bestå av fyra studenter public class Group extends ArrayList<Student> {

private static final int MAXSIZE = 4; public boolean isComplete() { return size() >= MAXSIZE; }

}

Page 17: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 17

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Dokumentation av MyList De reviderade klasserna behöver knappast någon särskild dokumentation. MyList gör det:

•  MyList innehåller en lista av grupper av studenter. •  En grupp representeras med en ”heltalsarray” där det första

elementet innehåller antalet studenter i gruppen och de övriga innehåller id-nummer för studenterna.

•  Metoden getList returnerar en lista med de grupper som har plats för ytterligare studenter.

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Namngivning av klasser

•  Ett klassnamn är normalt ett substantiv hämtat från uppdragsgivarens beskrivning eller den verklighet som programmet modellerar.

•  Namnet inleds med en versal och följs av gemener. På engelska använder man versal i början på varje ord när namnet är sammansatt.

Page 18: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 18

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Namngivning av klasser, forts. •  Konstruera inte klasser som bäst beskrivs med namn som slutar

på Handler, Controller, Manager och liknande. De indikerar ofta dålig design. Builder och Parser kan vara helt OK för en ”fabrik”.

•  Undvik namn som Item, Element, Value och Data om det inte handlar om generiska typer.

•  Undvik att inkludera representationstypen i namnet om typen bara förekommer i ett attribut. class StringList extends ArrayList<String> är OK, medan class StringArray { private String string []; \\ omissions } inte är det.

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Namngivning av gränssnitt

•  Samma principer som för klassnamn. •  Namn på gränssnitt används oftare än namn på konkreta klasser;

därför är det viktigare att dessa namn är bra. •  Undvik att indikera att det handlar om gränssnitt som i ITree

TreeInterface. Hierarkien som IList, AbstractList och ArrayList är bra när alla nivåerna behövs.

Page 19: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 19

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Namngivning av metoder •  Metodnamn inleds med en gemen och följande ord i sammansatta

namn med versal. •  Metoder som förändrar objektets tillstånd bör ha ett verb som

namn. •  Metoder som inte förändrar objektets tillstånd bör ha ett substantiv

som namn eller inledas med is om de implementerar ett predikat. •  Namn som inleds med set och get bör reserveras för de tillfällen

då det handlar om att sätta och hämta attribut.

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Namngivning av attribut, lokala variabler och parametrar

•  Ett attribut kan ofta ha samma namn som sin typ, fast med inledande gemen.

•  Om det finns flera attribut av samma typ som används på samma sätt kan man numrera dem: Expr expr1, expr2;

•  När en variabel används som index i en ”array” använder man gärna konventionella namn som i och j.

•  För strängar använder man gärna namn som indikerar användningen: String title;

•  Använd inte the som ett prefix i attributnamn. När det behövs är this det självklara alternativet.

Page 20: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 20

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Alternativ kurslitteratur Det finns en annan lärobok som skulle kunna vara kursbok. Henrik Bærbak Christensen: Flexible, Reliable Software — Using Patterns and Agile Development, CRC Press, 2010. ISBN 978-14200-9326-9

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

3-1-2 - processen Henrik Christensen sammanfattar användning av Strategi-mönstret i tre punkter:

3 Identify some behaviour that varies. 1 Describe this behaivior as an interface. 2 Implement each behaviour by a class.

Den egendomliga numreringen beror på att momenten anges i en annan ordning i Christensens inspirationskälla:

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software

”Gang of Four”

Page 21: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 21

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software ”Gang of Four”

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Projekt 2 – ”XL”

Page 22: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 22

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Projekt 2 - XL

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Schema designmöten Möte 1: användningsfall, paketindelning, klassdiagram torsdag 1 oktober kl 8-10 fredag 2 oktober kl 8-10 Möte 2: klassdiagram, källkod (fungerande program) torsdag 15 oktober kl 8-10 fredag 16 oktober kl 8-10 Slutinlämning före läsperiod 2.

Page 23: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 23

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Observer-mönstret public interface Observer {

public void update(Observable observable, Object object); } public abstract class Observable {

public void addObserver(Observer observer) public void notifyObservers()

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

GUI-modellering

Den oerfarne gör allt i en stor klass. Den agile gör lite i många klasser med beaktande av principen om enkelt ansvar.

Page 24: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 24

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Paket expr aritmetiska uttryck – modifieras ej gui användargränssnittet – modifieras menu menyer – modifieras … egna paket

util ”avvecklingspaket”

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Paketet expr Expr ExprParser Num Add …

AddressExpr

Page 25: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 25

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Paketet gui Gui med main

GuiList

CurrentView

StatusArea

Editor

RowNumberPanel

SheetView

SlotView

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Varför inte javax.swing.Jtable? JTable tillhandahåller mycket som skulle göra projektet lättare, men

döljer mycket av det som projektet vill lära ut javadoc omfattar 68+ sidor

Page 26: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 26

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Paketet menu - menyerna

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Paketet util Address Environment Adjustment NumberAdjustment

XLException XLBufferedReader XLPrintStream En del av dessa klasser bör flyttas till andra paket.

Page 27: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 27

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

XL - Gui JFrame ger ett eget fönster på skärmen. import javax.swing.JFrame; import java.awt.BorderLayout; public class Gui extends JFrame {

public Gui(int count) { super("Untitled-" + count); setLayout(new BorderLayout()); // omissions pack(); setVisible(true); }

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

BorderLayout

Page 28: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 28

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Structure

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Structure

Page 29: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 29

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

statusArea

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

Editor - JTextField JTextField används för textinmatning. public class Editor extends JTextField implements ActionListener {

public Editor() { setBackground(Color.WHITE); addActionListener(this); } public void actionPerformed(ActionEvent event) { // activated by Return key // contents returned by getText() }

}

Page 30: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 30

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

WindowMenu

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

WindowMenuItem class WindowMenuItem extends JMenuItem

implements ActionListener { private Gui gui; public WindowMenuItem(Gui gui) { super(gui.getTitle()); this.gui = gui; addActionListener(this); } public void actionPerformed(ActionEvent event) { gui.toFront(); }

}

Page 31: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 31

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

JMenu public class WindowMenu extends JMenu implements Observer {

private GuiList guiList; public WindowMenu(GuiList guiList) { super("Window"); this.guiList = guiList; guiList.addObserver(this); update(null, null); } public void update(Observable observable, Object object) { removeAll(); for (Gui gui : guiList) { add(new WindowMenuItem(gui)); } }

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

GuiList public class GuiList extends Observable

implements Iterable<Gui> { private List<Gui> list = new ArrayList<Gui>(); public void add(Gui gui) { list.add(gui); setChanged(); notifyObservers(); } public Iterator<Gui> iterator() { return list.iterator(); } //omissions

}

Page 32: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 32

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

MouseListener Några swing-komponenter kan ha en ActionListener, t ex: JButton, JMenuItem, JTextField. Alla komponenter kan ha en MouseListener. Den läggs till med public void addMouseListener(MouseListener listener); public interface MouseListener {

void mouseClicked(MouseEvent event); void mouseEntered(MouseEvent event); void mouseExited(MouseEvent event); void mousePressed(MouseEvent event); void mouseReleased(MouseEvent event);

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

MouseAdapter I regel vill man bara reagera på en av händelserna. Då är det bekvämt med public abstract class MouseAdapter {

public void mouseClicked(MouseEvent event){} public void mouseEntered(MouseEvent event){} public void mouseExited(MouseEvent event){} public void mousePressed(MouseEvent event){} public void mouseReleased(MouseEvent event){}

}

Page 33: Objektorienterad modellering och diskreta strukturer ...fileadmin.cs.lth.se/cs/Education/EDAF10/2015/lectures/...EDAF10/EDA061 HT2015, Ulf Asklund 1 Datavetenskap/LTH | EDAF10/EDA061

EDAF10/EDA061 HT2015, Ulf Asklund 33

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund

MouseListenerLabel public class MouseListenerLabel extends JLabel {

private class ClickListener extends MouseAdapter { public void mouseClicked(MouseEvent event) { setBackground(Color.YELLOW); } } public MouseListenerLabel() { setBackground(Color.WHITE); addMouseListener(new ClickListener()); }

}

Datavetenskap/LTH | EDAF10/EDA061 HT2015 | Ulf Asklund