Förra föreläsningen. Dagens agenda. Vecka Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Relevanta dokument
Förra föreläsningen. Alternativ kurslitteratur. Dagens agenda Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

HT1 2013, FÖRELÄSNING 6

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

HT1 2015, FÖRELÄSNING

Projekt 2 XL. Observer-mönstret

Nej! Nej Nej Nej Nej Nej Nej Nej!

HT2 2015, FÖRELÄSNING 15 (XL-PROJEKTET)

Projekt 2 XL Schema designmöten

Projekt 2 XL Klassen Gui

Dagens program. Objektorienterad modellering och diskreta strukturer / design. Model/View/Control-implementering. Model/View/Control-arkitektur

Tentamen i EDAF25. 1 juni Skrivtid: Skriv inte med färgpenna enda tillåtna färg är svart/blyerts.

Lösningar till tentamen i EDAF25

Grammatik. BNF-grammatik

Seminarierna Instruktioner. Övningarna Viktiga relationer

HT1 2013, FÖRELÄSNING 14 (INFÖR TENTAN)

Definition. Mängden av reguljära uttryck på alfabetet Σ definieras av. om α och β är reguljära uttryck så är (α β) ett reguljärt uttryck

Information. Computer

Computer projekttid. Objektorienterad modellering och diskreta strukturer / design. Rapporter från verkligheten. EDAF10 i HT2

Föreläsning 3. Stack

Alfabeten, strängar och språk. String

Tentamen i Objektorienterad modellering och diskreta strukturer

4.7 Observatörsmönstret

HT1 2013, FÖRELÄSNING 5

HT1 2015, FÖRELÄSNING 14 (INFÖR TENTAN)

Tentamen i Objektorienterad modellering och design Helsingborg

Lösningar till tentamen i EDAF25

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design. Vad är Objektorienterad modellering?

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Kursstruktur. Objektorienterad modellering och diskreta strukturer / design. Programmering utan OMD. Vad är Objektorienterad modellering?

Föreläsning 3. Stack

Förra föreläsningen. Dagens agenda. Command Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design

Föreläsningsbilder EDAF10/EDA061 Ht 2015 HT1 2015, FÖRELÄSNING 3

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061)

Föreläsning 10. ADT:er och datastrukturer

Tentamen i Objektorienterad modellering och diskreta strukturer

Integritetsprincipen. Objektorienterad modellering och diskreta strukturer / design

HT1 2015, FÖRELÄSNING

Förra föreläsningen. Dagens agenda. Dagens agenda. Föreläsningsbilder EDAF10/EDA Ulf Asklund, Datavetenskap/LTH 1

UML Objektdiagram. Objektorienterad modellering och design (EDAF25) Föreläsning 3. UML Sekvensdiagram. UML Objektdiagram. Agenda

Lösningsförslag till tentamen

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Objektorienterad Programkonstruktion. Föreläsning 3 9 nov 2015

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Properties. Användbara metoder som kan anropas i propertychanged:

Objektorienterad programutveckling, fk

Objektorienterad Programkonstruktion. Föreläsning 3 7 nov 2016

Lycka till! TENTAMEN: Objektorienterade applikationer. Läs detta! 1 (6) Tentamen

List.java. List.java. Printed by Tom Smedsaas

F4. programmeringsteknik och Matlab

Laboration 24 Databasen MySQL och java

Dagens program. Objektorienterad modellering och diskreta strukturer / design. Model/View/Control-implementering. Model/View/Control-arkitektur

EDAF10: Objektorienterad modellering och diskreta strukturer. EDA061: Objektorienterad modellering och design. Diskreta strukturer.

Inlämningsuppgift MiniPlotter

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen i Objektorienterad modellering och design

Tentamen i Objektorienterad modellering och design Helsingborg

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

Design Patterns. En kort introduktion

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

LÖSNINGSFÖRSLAG

HT1 2015, FÖRELÄSNING

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

LULEÅ TEKNISKA UNIVERSITET

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

EDAF10: Objektorienterad modellering och diskreta strukturer EDA061: Objektorienterad modellering och design

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

DAT043 - Föreläsning 7

Modelsvar för Tentamen för Objektorienterad programvaruutveckling, TDA545

Kursstruktur. Objektorienterad modellering och diskreta strukturer / design. Vad är Objektorienterad modellering? Programmering utan OMD

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Lösningar till Fiktiv Tentamen på kursen. 2D4135 Objektorienterad programmering, design och analys med Java vt2004. Teoridel

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Objektorienterad Programmering (TDDC77)

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

Upplägg. Introduktion. Examination. Mål. Konsekvenser. Java. Kursen heter konstruktion, ej design eller formgivning.

Tentamen i Objektorienterad modellering och diskreta strukturer

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

12. Relationer och funktioner

Swing. MER Java Foundation Classes (JFC) Hur lära sig? Vad är farorna. LayoutManagers. Exempel på några av komponenterna

Tentamen i Objektorienterad programmering

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Föreläsning 15: Repetition DVGA02

Repetitionsföreläsning 2: Quiz & problemlösning med swing Inget nytt material.

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

MVC-mönstret. model-view-control i Swing

Lösningsförslag till tentamen i EDAF25 Objektorienterad modellering och design Helsingborg

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Objektorienterad Programkonstruktion. Föreläsning 6 23 nov 2015

Swing. MER Java Foundation Classes (JFC) Vad är farorna. Hur lära sig? LayoutManagers. Exempel på några av komponenterna

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

ITK:P1 Föreläsning 4. Grafiska gränssnitt i Java. AWT-komponenter

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 7 Erik Nilsson, Institutionen för Datavetenskap, LiU

Transkript:

Förra föreläsningen Objektorienterad modellering och diskreta strukturer (EDAF10/EDA061) HT1 2014, FÖRELÄSNING 6 Designmönster Decorator (repetition) Model-View-Control Observer Paketdesign LSP Substitutionsprincipen Dagens agenda Factory Method-mönstret Syntaxanalys Felhantering Tillståndsdiagram Namngivning Introduktion till projekt 2 ( XL ) EDA061 Hur går projektet? Glöm inte redovisa nerlagd tid. Det går snart att boka labtid grupper om 2 personer 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 EDAF10/EDA061 HT2014, Ulf Asklund 1

Att göra EDA061 Anmälan till XL-projektet senast fredag den 26 september. Designmöte 2-3 oktober. EDAF10 Anmälan till laborationer senast fredagen den 26 september. Börjar vecka 5. 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-4200-9326-9 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 EDAF10/EDA061 HT2014, Ulf Asklund 2

Factory Method Factory Method SomeApp SomeApp <<interface>> Shape <<interface>> Shape Factory + makesquare():shape + makecircle():shape <<interface>> Shape Square <<creates>> Circle 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. ShapeFactory Implementation <<creates>> Square Circle Factory Method tar bort beroendet till de konkreta klasserna Factory Method Factory method-mönstret <<interface>> Shape Factory + make(string):shape SomeApp <<interface>> Shape 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 ShapeFactory Implementation Square Circle <<creates>> Vad måste nu SomeApp känna till? EDAF10/EDA061 HT2014, Ulf Asklund 3

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. 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 Word(Integer.parseInt(string)); Instruktionsfabriken Instruktionsfabriken, forts. 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);... 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 ); EDAF10/EDA061 HT2014, Ulf Asklund 4

Felhantering 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; 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); Felhantering try { value = expr.value(); catch (XLException e) { report(e.getmessage(), e.getobject()); EDAF10/EDA061 HT2014, Ulf Asklund 5

Aritmetiska uttryck Konkret syntax Exempel Aritmetiska uttryck 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. Konkret grammatik - BNF Abstrakt representation abstrakt grammatik Expr ::= term (addop term) Term ::= factor (mulop factor) Factor ::= number name ( expr ) Addop::= + Mulop ::= / Operatorer * upprepa 0 eller flera gånger eller literalt number ::= unsignednumber unsignednumber unsignednumber ::= digit (digit) digit ::= 0 1 2 3 4 5 6 7 8 9 name ::= letter (letter) letter ::= a b... z EDAF10/EDA061 HT2014, Ulf Asklund 6

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 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(); 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); 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; EDAF10/EDA061 HT2014, Ulf Asklund 7

Tillståndsdiagram Tillståndsdiagram En telefon Namngivning EDAF10/EDA061 HT2014, Ulf Asklund 8

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? 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; 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; 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. EDAF10/EDA061 HT2014, Ulf Asklund 9

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. 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. 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. 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. EDAF10/EDA061 HT2014, Ulf Asklund 10

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. Projekt 2 XL Projekt 2 - XL Schema designmöten Möte 1: användningsfall, paketindelning, klassdiagram Torsdag 2 oktober kl 8-10 Fredag 3 oktober kl 8-10 Möte 2: klassdiagram, källkod (fungerande program) torsdag 16 oktober kl 8-10 fredag 17 oktober kl 8-10 Slutinlämning före läsperiod 2. EDAF10/EDA061 HT2014, Ulf Asklund 11

Observer-mönstret GUI-modellering public interface Observer { public void update(observable observable, Object object); public abstract class Observable { public void addobserver(observer observer) public void notifyobservers() 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. Paket expr aritmetiska uttryck modifieras ej gui användargränssnittet modifieras menu menyer modifieras egna paket util avvecklingspaket Paketet expr Expr ExprParser Num Add AddressExpr EDAF10/EDA061 HT2014, Ulf Asklund 12

Paketet gui Gui med main GuiList CurrentView StatusArea Editor RowNumberPanel SheetView SlotView 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 Paketet menu - menyerna Paketet util Address Environment Adjustment NumberAdjustment XLException XLBufferedReader XLPrintStream En del av dessa klasser bör flyttas till andra paket. EDAF10/EDA061 HT2014, Ulf Asklund 13

XL - Gui BorderLayout 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); Structure Structure EDAF10/EDA061 HT2014, Ulf Asklund 14

statusarea 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() WindowMenu 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(); EDAF10/EDA061 HT2014, Ulf Asklund 15

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)); 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 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); 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){ EDAF10/EDA061 HT2014, Ulf Asklund 16

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()); EDAF10/EDA061 HT2014, Ulf Asklund 17