OOP e uge kursusgang. Disposition for (gennemgang af) afleveringsopgave. Deck.shuffle() 'Problemformulering', Indledning

Relaterede dokumenter
OOP e uge kursusgang: Grafik (II) class Scribble (Tegnebrættet) Frihåndstegning: repræsentation

et enkelt kontrol flow sætningerne i programmet afvikles en ad gangen flowet følger dels den tekstlige rækkefølge

Hvordan organiseres et programs grafik-elementer? OOP e uge kursusgang. Advarsel! Component-objekter

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Videregående programmering i Java

Tree klassen fra sidste forelæsning

DANMARKS TEKNISKE UNIVERSITET

Objektorienteret design

1. Flyreservationssystem. OOP e uge 37 - første kursusgang. OO-paradigmet jf. XP s. 10f

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

Forelæsning Uge 6 Mandag

Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Forelæsning Uge 12 Torsdag

Forelæsning Uge 12 Mandag

Objektorienteret design!

Real-time programming safety in Java and Ada

import java.applet.applet; import java.awt.*; public class MinApplet extends Applet { // diverse metoder her - til grafik er det nok med "paint":

Objektorienterede metoder

Hvad er Objekter - Programmering

import java.awt.event.*; import java.awt.*; Container <- Panel <- Applet Component <- Button <- Checkbox <- ScrollPane <- Label

Klasser og nedarvning

Kursusgang 11. Oversigt: Sidste kursusgang Værktøjer til udvikling og implementering af HCI-design Oversigt over Java Swing

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16,

Dag 10 Flertrådet programmering

Skriftlig eksamen i Datalogi

Objektorienteret design med arv og polymorfi:

Vejledende løsninger

Forelæsning Uge 5 Mandag

Forelæsning Uge 3 Torsdag

Singleton pattern i Java

Grundlæggende Programmering ITU, Efterår Skriftlig eksamen i Grundlæggende Programmering

Ugeseddel 4 1. marts - 8. marts

Videregående programmering i Java

Forelæsning Uge 3 Torsdag

Objektorienteret Programmering

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Hvad er et distribueret objekt? Plan Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation

Om binære søgetræer i Java

Forelæsning Uge 4 Torsdag

Forelæsning Uge 4 Torsdag

Lektion 6. Grundlæggende programmering i VR

Polymorfi. Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type. Coercion

Har kun én enkelt abstract metode De steder, hvor man skal bruge et objekt, hvis type er et funktionelt interface, kan man i stedet bruge en lambda

Forelæsning Uge 3 Mandag

Introduktion til ActionScript, fortsat

Forelæsning Uge 4 Mandag

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

SWC eksamens-spørgsmål. Oversigt

Dag 10 Flertrådet programmering

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004

Skriftlig eksamen i Datalogi

Software Construction 1 semester (SWC) Spørgsmål 1

Skriftlig eksamen i Datalogi

Forelæsning Uge 3 Torsdag

Java Klasse nedarvninger

Programmering og Problemløsning, 2017

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Objektorienteret programmering!

It og informationssøgning Forelæsning 7 1. november 2006 Jakob Grue Simonsen. Indlejring og Nedarvning

Forelæsning Uge 4 Mandag

Objektorienteret programmering. Introduktion

Online billede filtrering

Michael Jokil

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

OOP e uge kursusgang: Samtidighed (II) Safety = sikkerhed. Safety

Har kun én enkelt abstract metode De steder, hvor man skal bruge et objekt, hvis type er et funktionelt interface, kan man i stedet bruge en lambda

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Programmering 1999 KVL Side 5-4. Klassen Time: metoder. Metoder i objektet giver mulighed for at ændre tilstanden, eller kigge på tilstanden.

Videregående programmering i Java

Flash Logic Free CMS. Manual og brugervejledning

Lær Python - Dag 4, modul 2 Objektorienteret programmering

Forelæsning Uge 3 Mandag

Forelæsning Uge 3 Torsdag

DM507 Algoritmer og datastrukturer

Forelæsning Uge 2 Mandag

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

A Profile for Safety Critical Java

Singleton pattern i C#

Forelæsning Uge 4 Mandag

Bilag 1 Rige billeder Ordremodtagelse

Forelæsning Uge 3 Torsdag

Dokumentation for Java applikationer

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

Klasser og Objekter i Python. Uge 11

DM507 Algoritmer og datastrukturer

Martin Geisler. Uge 49, 2001

Forelæsning Uge 1 Torsdag

Spil Master Mind. Indledning.

ATTRIBUTES MULTITHREADING DYNAMIC PROGRAMMING. Grundlæggende programmering Lektion 11

StarWars-videointro. Start din video på den nørdede måde! Version: August 2012

Videregående programmering i Java

Sider og segmenter. dopsys 1

DM507 Algoritmer og datastrukturer

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Kursus navn: Indledende programmering Kursus nr

Forelæsning Uge 3 Mandag

Vejledning til opbygning af hjemmesider

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

C# spil (del 1) - Kom i gang med et simpelt spil

Transkript:

OOP e2002 - uge 40 Disposition for (gennemgang af) afleveringsopgave IV. Teori B: Designmønstre. V. Tips til øvelser: Bold-appletten, dobbeltbufring. 1. Problemformulering 2. Design for at forklare designet vælger jeg at vise noget af implementationen under designdiskussion 3. Implementation Formål: vise hvordan man kan fokusere på design-pointer vise at der faktisk er mange principielle design pointer i noget så simpelt (?) som et kort-objekt. men jeg får mere med end der kunne være på 5 sider 'Problemformulering', Indledning Deck.shuffle() Afgrænsning: Jeg vil vise jer Kortblanding målsætning: så hurtig som mulig class Deck målsætning: nem og fleksibel tildeling af gif-filer Alle kort byttes med et vilkårligt kort til højre for kortet (eller kortet selv) F.eks. byttes kort nr. 2 med et af kortene mellem 2 og 51. public void shuffle() { for (int i = 0; i < size(); i++) swap(i, i + rand.nextint(size() - i));

class Card nem tildeling af gif-filer til kort public String tostring() { return suit.tostring() + rank.tostring(); Kortets attributter suit og rank fortæller hvilket kort det er. Ideen er at bruge attributternes værdi til at finde gif-filen, f.eks. "as.gif". Hvis kortet er spar es (Ace of Spades), udskrives "as". For at skabe stien til gif-filen, skal der blot tilføjes ".gif". class Card / ImageCard nem tildeling af gif-filer til kort (forts.) Alt det grafiske vedr. et kort er lagt i en subklasse. Fordele mere overskuelig kode mulighed for at bruge kortklassen uden grafikdelen. Princip: modularisering. "A.. system should be decomposed into a set of highly cohesive but loosely coupled modules" (Xiaoping s. 11) hvor modul = klasse forudsætter at koblingen kun er "løs" class ImageCard nem tildeling af gif-filer til kort (forts.) OOP e2002 - uge 40 Kobling: Eneste kobling til superklassen er at metoderne til at hente billeder kalder superklassens tostring(). Man kan arbejde med den ene klasse uden at behøve kigge i den anden. private Image fetchimage(applet app) { String imagepath = <codebase..> + tostring() + ".gif"; return app.getimage(app.getcodebase(), imagepath); IV. Teori B: Designmønstre. V. Tips til øvelser: Bold-appletten, dobbeltbufring. // Gif-fil skal kun hentes 1 gang, Image-objekt lagres i image-attribut.

Modularisering (class Card / class ImageCard) Designledetråde Adskil interface / implementation (interface List / class ArrayList, s. 147) Generalisering (interface Iterator, s. 209) Faktorisering (animerings-idiom, generisk animeringsapplet-klasse) Delegering (s. 139) Mere specifikt (tommelfingerregler) undgå public-kvalificerede attributter (s. 145) brug klassers kanoniske form (s. 150) undgå "skjulning"/hiding (s. 143) Adskil interface / implementation class Deck extends ArrayList { public void shuffle() { size();.. swap(..); private void swap(i,j) {.. get(..);.. set(..); java.util-pakken adskiller interfaces og implementation: class Deck bruger kun metoder der er erklæret i interface List. Derfor kan klassen let ændres til at nedarve fra en anden listeimplementation. Multipel nedarvning - kan erstattes af delegering Delegering (jf. Xiaoping s. 140) Datalogistuderende pia = new Itc-kandidat(), per = new Ruc-kombination(); pia.udskrivbeståedekurser(); per.udskrivbeståedekurser(); // fælles metoder i class Datalogistuderende if (per instanceoff) Ruc-kombination) ((Ruc-kombination)per).udskrivBasis(); // specifikke metoder for subklasser BådeOg implementerer multiple interfaces tvinger BådeOg til at implementere Ruc og Itc-metoder BådeOg har Ruc- og Itc-attributter delegering betyder at attributterne rummer metodernes reelle implementation

Animeringsidiom (ide, huskeregel) Animeringsidiom: klassestruktur class AnimationApplet extends Applet implements Runnable { Thread animationthread = null; int delay;.. // lidt flere attributter public void init() {.. public void start() {.. public void stop() {.. public void run() {.. public void paint(graphics g) {.. Animationsappletten opretter en (stærkt aggregeret) tråd, hvis eneste opgave er at udføre animationsapplettens run-metode. init(): start(): stop(): Animeringsidiom: metodernes opgaver læse parametre fra html-fil, læse applet-vinduets størrelse oprette animerings-tråd, starte tråd stoppe tråd public void run():.. pause; repaint();.. public void paint(graphics g): tegne Animeringsidiom: kontrol start() { if (animationthread == null) { animationthread = new Thread(this); animationthread.start(); public void stop() { animationthread = null; public void run() { if (animationthread!= null) {.. pause; repaint().. Tråden (run-metoden) tester, om stop() har givet stop-ordre. class Thread har egen stop()-metode, men den er usikker.

Scrolling banner: beregning af bevægelse OOP is cool paint() (Scrolling banner) paint(graphics g) { g.setfont(font); // font initialiseret andetsteds FontMetrics fm = g.getfontmetrics(); int length = fm.stringwidth(text); // banner-længde (x,y) x starter som d.width g.drawstring(text,x,y) tegner kun den del af teksten, der falder indenfor vinduet. g.drawstring("abc",-100000,20) har ingen synlig effekt. x tælles ned indtil x's værdi er så lav (stor negativ), at det indikerer at banneret er kørt helt forbi. x -= offset; if (x < - length) x = d.width; // starte forfra g.setcolor(color.black); g.fillrect(0,0,d.width, d.height); g.setcolor(color.green); g.drawstring(text, x, y); Applet-konteksten: ApplicationListener er en metafor for den del af konteksten, der lytter til hændelser genereret af applikationen (appletten), dvs. kald af repaint(). SystemListener lytter til hændelser genereret af systemomgivelserne, f.eks. ved at brugeren resizer vinduet eller browser videre. Applet-konteksten (flere detaljer)

repaint() --> update(), paint() Når ApplicationListener/SystemListener kalder paint()/update(): 0. Muligvis ventes der lidt først. 1. Graphics g = det nuværende billede (det sidst tegnede); 2. kald af enten update(g) eller paint(g); // 2 og 3 3. tegn(g); // kan foregå samtidigt Container superklasse opfanges kald af update()/paint() hvis de ikke overskrives i subklasser: public void update(grahpics g) { g.setcolor(getbackground()); // vælger baggrundsfarven g.clearrect(0, 0, width, height); // udfylder g med farven g.setcolor(getforeground()); // vælger forgrundsfarven paint(g); public void paint(graphics g) { {kalder paint() i alle subkomponenter OOP e2002 - uge 40 IV. Teori B: Designmønstre. V. Tips til øvelser: Bold-appletten, dobbeltbufring. Nedarvning fra generisk animerings-klasse Konstruktion af animerings-appletter som subklasser (a la XP s. 185) class DigitalClock extends AnimationApplet { DigitalClock() { setdelay(1000) ; public void paint(graphics g) {.. som før.. ; Font font =..; Color color =..; // hvor er init(), start(), stop(), run() etc.? class AnimationApplet (XP s. 184) [abstract] class AnimationApplet extends Applet implements Runnable { Thread animationthread = null; int delay; setdelay(int d) {..; public void init() {.. public void start() {.. public void stop() {.. public void run() {.. // ingen paint() // ny: setdelay()

"faktorisering ved nedarvning" (a la XP s. 182) Faktorisering Før: class DigitalClock { metode1(); metode2(); metodedc(); class ScrollingBanner { metode1(); metode2() metodesb(); Nu: class AnimationApplet { metode1(); metode2(); class DigitalClock extends AnimationApplet{ metodedc(); class ScrollingBanner extends AnimationApplet { metodesb(); "Faktorisering" kan opfattes som nedbrydning i et antal egenskaber, der går igen mellem flere klasser. I matematik er faktorisering opdeler af et tal i faktorer: 6 = 2*3 14 = 2*7 (2 er en fælles faktor) De fælles faktorer/metoder kan implementeres i en abstrakt klasse. En abstrakt klasse er en klasse, der skal subklasses før der kan skabes instanser af den. Faktorisering kan også realiseres vhja. delegering. Lad os faktorisere dobbelt-bufrede appletter! Formål: at undgå flimmer flimmer kommer når vi maler (langsomt) i et grafik-objekt, fordi konteksten tegner grafik-objektet på skærmen samtidig Flimmer kan reduceres ved at male i et ekstra ("dobbelt") grafik-objekt, som først overføres til konteksten når vi er færdige. Det viser sig, at ved dobbelt-bufring bør man overskrive update() i stedet for paint(). I konteksten kaldes paint() af update(), efter update() har "forbehandlet" grafikobjektet ved at overmale det med baggrundsfarven. Vi har ikke brug for forbehandlingen da vi overskriver det gamle grafikobjekt med vores grafik-buffer, og derfor selv skal lave baggrunden. AnimationApplet og DBAnimationApplet (XP s. 191) AnimationApplet tager sig af alt vedr. animering (dog ikke dobbelt-bufring) Oprettelse af en separat tråd, kald af sleep()/repaint() fra trådens run(), m.m. Subklasser skal blot definere paint() samt evt. justere delay. DBAnimationApplet har sin egen final update(), der kalder paintframe(), der er en abstrakt metode.

Konstruktion af class DBAnimationApplet Nedarver fra AnimationApplet, derfor kun konstruere: initialisering omdefinering af paint()/update() til at bruge dobbeltbuffer endvidere foreslår XP at gøre dobbeltbufringen valgfri (?) Initialisering skal omfatte både: initialisering i appletten/subklassen initialisering af dobbeltbuffer Maling skal omfatte både: selve malerarbejdet i appletten/subklassen dobbeltbufringen i DBAnimationApplet class DBAnimationApplet (frit efter XP s. 192) class DBAnimationApplet extends AnimationApplet { Graphics offscreengraphics; // "papiret" Image offscreenimage; // "billedet" // (en matrix af pixels) final public void init() {.. ; void initanimator() {; // overskrives formentlig final public void update(graphics g) {..; abstract void paintframe(graphics g) {; // skal overskrives DBAnimationApplet er lavet ud fra et "mistillidsprincip", hvor man garderer sig mod at subklassen/appletten ikke læser brugervejledningen! Initialisering Maling Graphics offscreengraphics; Image offscreenimage; final public void init() { Dimension d = getsize(); offscreenimage = createimage(d.width, d.height); offscreengraphics = offscreenimage.getgraphics(); initanimator(); Graphics offscreengraphics; Image offscreenimage; final public void update(graphics g) { paintframe(offscreengraphics); g.drawimage(offscreenimage); // g "overskrives" abstract void paintframe(graphics g) { void initanimator() { // overskrives formentlig

update() vs. paint(): hvilken skal overskrives i Applet-subklasser? OOP e2002 - uge 40 Hvis subklasser overskriver update(): skal de selv sørge for at gentegne hele baggrunden men så slipper de for at vente på at appletkonteksten gentegner baggrunden. Hvis man bruger dobbelt-bufring: bør man overskrive update() fordi man alligevel selv skal tegne baggrunden (da man jo ikke tegner i det grafikobjekt der er skabt i konteksten, men tværtimod overskriver det med ens egen "buffer") IV. Teori B: Designmønstre. UDSKUDT TIL NÆSTE GANG V. Tips til øvelser: Bold-appletten, dobbeltbufring. OOP e2002 - uge 40 BouncingBall (BoldAppletten) IV. Teori B: Designmønstre. V. Tips til øvelser: Bold-appletten class BouncingBall extends DBAnimationApplet { int x, y; // boldens koordinater int dx, dy; // boldens bevægelse void initanimator() { {vælg startposition for bold void paintframe(graphics g) { {hvis bolden har ramt kant, vend retning {bevæg bold {tegn bold