Programmering 2 eksamensnoter

Størrelse: px
Starte visningen fra side:

Download "Programmering 2 eksamensnoter"

Transkript

1 Programmering 2 eksamensnoter Andreas Troelsen Mathias Bak Bertelsen December 24, 2012 Contents 0.1 Læs dette først! Generelt om mundtlig eksamen Fremlæggelse af patterns Recursive Methods & Data Structures Fibonacci Fraktaler Evaluering af udtryk Dispositionsforslag Dispositionsforslag Class Design & Invariants Klassestruktur Indkapsling Cloning Quality of class interfaces Programming by contract Dispositionsforslag Dispositionsforslag Polymorphism & Interfaces Interfaces Polymorfi Nedarvning Abstract classes Dispositionsforslag Dispositionsforslag Design Patterns Observer Pattern Template Method Pattern Strategy Pattern Composite Pattern Dispositionsforslag Dispositionsforslag

2 5 Inheritance & Abstract Classes Superclass (generel) og subclass (specialiseret) Abstract classes Hvornår er nedarvning ikke en god ide? Dispositionsforslag Dispositionsforslag Exceptions & Files Defensive programming Hvis man ikke har exceptions? Throwable hierakiet Exception handling Error recovery and avoidance File handling Dispositionsforslag Dispositionsforslag The Java Type System and Object Model Typer og værdier Subtype-forhold Wrappers (aka. Snoop Dogg) Enum Type inquiry The Object class - mother of all classes Serialization Generic Types Dispositionsforslag Dispositionsforslag Frameworks & Collections Frameworks og libraries Applets Collections Dispositionsforslag Dispositionsforslag Multithreading Fordele Ulemper Runnable interfacet Selfishness Tilstand interrupt() Race conditions Dispositionsforslag Dispositionsforslag

3 0.1 Læs dette først! Dokumentet er ment som en hjælp til at læse op til eksamen i Programmering 2. Det er på ingen måde komplet, og vi giver ingen garanti for korrektheden af indholdet. Hvis du opdager fejl, eller har forslag til forbedringer, er du mere end velkommen til at skrive til en af os. s findes på forsiden af dokumentet. Dokumentet er opbygget med et kapitel for hvert eksamensemne. Først er der noter til emnet og til sidst to eksempler på dispositioner. Nogle af punkterne i dispositionerne er markeret med fed skrift - det er disse punkter, vi anbefaler, at du skriver på tavlen, efter du har trukket dit emne. 0.2 Generelt om mundtlig eksamen Det er vigtigt at forberede sig godt på emnerne og komme i gang i god tid. Det tager som regel længere tid at forberede sig, end man regner med. En god teknik er at arbejde sammen i grupper af to eller tre personer og fremlægge for hinanden. På denne måde får man feedback med det samme og kan således nå at forbedre sin fremlæggelse inden eksamen. Tag også tid på dine fremlæggelser. Det er vigtigt at tiden passer nogenlunde, så du får sagt alt det, du gerne vil, og at du ikke er færdig efter fem minutter. Øvelse, øvelse, øvelse... og atter øvelse - Holger A. Nielsen. Det kan derudover være en god ide at overvære hinandens eksamener. Aftal med din læsemakker, at I går med ind til hinandens eksamener. På den måde kan I få ekstra feedback på jeres præsentation, og dermed forbedre jer til næste eksamen. Husk på, at skulderklap ikke hjælper ret meget, så man skal kunne tåle at høre, hvad man har gjort galt. Udover at få god feedback finder du også ud af, hvilke spørgsmål censor og eksaminator stiller, og muligvis hvilke emner, der bør undgås. 0.3 Fremlæggelse af patterns Når du skal fremlægge et pattern er det vigtigt at have styr på tre ting: UML-diagrammet for det pågældende pattern skal være helt på plads. Pilene skal tegnes korrekt og der skal være styr på relationerne mellem klasser og interfaces. Det kan være en god ide at tegne dette som noget af det første, da du resten af tiden vil kunne referere til det og kigge på det, hvis du glemmer noget. Hvilket problem dette pattern løser og i hvilke situationer det er relevant at benytte. Dette er skrevet på punktform for hvert pattern i Horstmann-bogen, så det burde ikke være så svært at finde ud af. Et konkret eksempel på brug. Sørg for at have et godt eksempel som du føler dig tryg ved (brug fx afleveringerne, hvis det specifikke pattern er blevet anvendt i en aflevering). Hvis du ikke selv bringer det op kan du risikere at blive spurgt. Det kan være svært at finde på et godt eksempel midt under eksaminationen. 3

4 1 Recursive Methods & Data Structures Rekursive metoder er metoder, som kalder sig selv. Rekursion kan i nogle tilfælde gøre kodestykker meget kortere og være meget lettere at implementere end iteration (fx Koch-kurver). Derimod kan rekursion nemt være meget langsommere, og nogle gange fylde meget mere i hukommelsen, hvis man ikke er varsom. 1.1 Fibonacci Fibonacci-tallene er et godt eksempel på en noget som kan defineres som en rekursiv funktion. Sekvensens definition siger, at hvert nyt tal i sekvensen er summen af de to foregående tal, og de to første tal er begge 1. Kvadrater med sidelængde af disse tal kan sættes op omkring hinanden i spiraler. Sekvensen ser således ud: 1, 1, 2, 3, 5, 8, 13, 21, 34, etc = 2, = 3, = 5, = 8, etc. Rekursivt kan metoden defineres således: { 1 n {1, 0} F n = F n 1 + F n 2 n > 1 Man kan skrive en tilsvarende metode i Java således: public int fib(int n) { if (n == 0 n == 1) return 1; return fib(n-1) + fib(n-2); } Testen for om n er 0 eller 1 kaldes en stopbetingelse. En rekursiv metode bør altid have en stopbetingelse, så man er sikker på, at den ikke fortsætter med at kalde sig selv uendeligt. Rekursive kald giver anledning til visualisering vha. træstrukturer. For et kald til fib(4) laves to yderligere kald, fib(3) og fib(2), og hver af disse kald laver yderligere to kald, etc. Følgende træstruktur viser kaldet til fib(4): fib(4) fib(3) fib(2) fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) Bemærk, at fib(2) og fib(0) kaldes to gange, mens fib(1) kaldes tre gange. Dette er et perfekt eksempel på en langsom/ineffektiv implementation, hvor de samme værdier beregnes flere gange. 1.2 Fraktaler Fraktaler er rekursiv grafik. Fraktaler er kurver som aldrig er glat nok til at kunne approximeres med linjestykker. Hvis man zoomer ind på en fraktal vil den altid udfolde sig mere. Velkendte fraktaler inkluderer Mandelbrot-mængden, Sierpinski-trekanter og Koch-linjer. 4

5 En Koch-linje er et linjestykke med et trekantet hak i midten, som gør at hvert linjestykke brydes ned i fire linjestykker, som hver brydes ned i fire linjestykker, osv. Koch-linjen kan defineres rekursivt vha. et tegneobjekt, fx et Crayon objekt c, hvis turn(x) metode drejer objektet x grader, og move(y) tegner en streg af længde y. private void kochline(int order, double len) { // Stopkriterie if (order == 0) c.move(len); } // Rekursionsskridt kochline(order-1,len/3); c.turn(-60); kochline(order-1,len/3); c.turn(120); kochline(order-1,len/3); c.turn(-60); kochline(order-1,len/3); Hvis stopbetingelsen ikke er opfyldt vil hvert kald til kochline lave 4 rekursive kald. Det bliver derfor meget hurtigt kompliceret manuelt at gennemløbe sådan en metode, og træstrukturen vil blive meget bred, meget hurtigt. 1.3 Evaluering af udtryk Rekursion kan bruges til evaluering af matematiske udtryk. Man kan have et udtryk som 3+4 5, som ikke beregnes lineært. Her kan man opdele de matematiske udtryk i forskellige elementer. Operatorer Deludtryk, som kan være enten et tal eller endnu et deludtryk 5

6 På den måde vil en metode, fx getvalue(string exp) kalde sig selv rekursivt, hver gang den har brudt et udtryk ned i to deludtryk. Når deludtrykkene til sidst udmunder i tal bliver der langsomt returneret delværdier, indtil hele udtrykket er beregnet. 6

7 1.4 Dispositionsforslag 1 Hvad er rekursion? Fordele: simplere kode, let at implementere Ulemper: adskillige pitfalls Rekursive metoder Fibonacci-tal Rekursionstræer Rekursive datastrukturer Tree, Node, Leaf UML-diagram Visitor Pattern UML-diagram accept(), visitnode() og visitleaf() FileSystemNode-aflevering Sammenlign med Composite Pattern 7

8 1.5 Dispositionsforslag 2 Rekursion vs iteration Stopkriterie og rekursionstilfælde (skriv matematisk notation og kode for fibonacci eller fakultet) Mange problemer er rekursive af natur og derfor simplere at løse på denne måde. Kodens læsbarhed kan også øges markant. Eks. nyttigt til fraktaler (husk dintprog) Kan være (meget!) ineffektivt i forhold til iteration (kan føre til stackoverflow) Tegn kald-træ for fibonacci Tradeoff mellem simplicitet og effektivitet Visitor pattern Referer til afleveringen Tegn UML og forklar hvordan et accept()-kald fungerer Composite pattern 8

9 2 Class Design & Invariants En klasse er en samling af fields og metoder. Ofte bruges klasser som skabeloner, som objekter kan instantieres fra. Nogle klasser kan således betragtes som blueprints, som man kan skabe objekter ud fra. Et velgennemtænkt og godt struktureret klassedesign er meget vigtigt for brugbarhed af klasser. 2.1 Klassestruktur Klasser indeholder typisk nogle fields, en eller flere constructors og en række metoder. Klassens fields udgør dens tilstand, og dens metoder udgør dens interface (klasse-interface). Constructors sørger for at objekter instantieres fra klasser med nogle bestemte værdier for deres fields, dvs. en starttilstand. Metoder er funktioner som kan kaldes på klassen selv (static), eller på individuelle objekter instantieret fra en klasse Utility-klasse: En klasse med en private constructor (kan ikke instantieres), og udelukkende static metoder (fx Math, Collections). 2.2 Indkapsling Visibility modifiers: public/private/protected static Constructors er generelt public. Metoder kan være begge dele. Ofte bruges private metoder som hjælpemetoder til public metoder. (Én gang public, altid public - gælder også for protected) Fields bør altid være private, og objekters/klassers tilstande bør altid tilgås/manipuleres gennem public metoder. Fields og metoder tagged som static er tilgængelige på klassen selv, og alle objekter instantieret fra klassen. Static fields deles mellem alle objekter af klassen. Static metoder (kaldes på klassen) kan kun tilgå static fields. Non-static metoder (kaldes på objekter) kan tilgå både static og non-static fields. Et objekts tilstand (dvs. fields) aflæses gennem accessorer (fx get() metoder), og modificeres gennem mutatorer (fx set() metoder). Objekters tilstande må aldrig modificeres af accessorer (da de så vil være mutatorer), men de må gerne aflæses af mutatorer, så længe der samtidig er en tilsvarende accessor-metode, som aflæser tilstandene uden at ændre på dem. Scanner er et godt eksempel på dårlig stil: Ingen accessor (getcurrent()), så hvis man skal bruge det nuværende element skal man efter kaldet til next() gemme værdien/referencen i en lokal variabel, da next() flytter cursoren ét element frem inden den returnerer et element. Et objekt er mutérbart, hvis dets fields kan manipuleres med enten via direkte adgang (public) eller gennem mutator-metoder. Omvendt kaldes det immutérbart, hvis det kun består af accessor-metoder (fx String), og således ikke kan ændres på, efter det er blevet skabt. Kun immutérbare objekter bør deles mellem andre objekter. 9

10 Mutérbare objekters indre tilstand kan ændres, hvis deres fields af reference-typer returneres direkte af get() metoder (fx ArrayList, HashMap), da sådanne return-values returnerer objekt-referencen, fremfor blot at returnere en simpel værdi (som med primitive typer). Hvis mutérbare objekter skal returneres i get() metoder bør objekterne klones først vha. clone(). På samme måde bør constructors klone eventuelle mutérbare objekter, som de får som parametre. 2.3 Cloning Deep/shallow clone. 2.4 Quality of class interfaces Cohesion: En klasse er cohesive eller sammenhængende, hvis dens metoder alle har at gøre med det samme overordnede emne. Fx en Mailbox-klasse som kun har metoder, som har at gøre med breve/beskeder. Completeness: En klasse er complete eller fuldstændig, hvis den har metoder til ethvert tænkeligt formål indenfor dens scope. Fx Math-klassen, som har en stor mængde metoder til matematiske beregninger (dog ingen metoder til beregning af egentlige brøker, dvs. ikke helt complete). Convenience: En klasse er convenient eller bekvem, hvis simple operationer og opgaver er nemme at løse. Et klasseinterface skal være nemt at bruge, så brugere ikke skal kalde 10 forskellige metoder for at få et simpelt resultat. Clarity: En klasse er clear eller letforståelig, når der ikke kan opstå meget forvirring omkring dens interface. ListIterator s next() og add() metoder er meget analog til hvordan et tekstbehandlingsprogram virker, men dens remove() metode er meget klodset. Dårlig clarity. Consistency: En klasse er consistent hvis dens metoder ikke afviger i fx parameter-syntax. Fx tager Java s GregorianCalendar klasse et månednummer mellem 0 og 11, men et dagnummer mellem 1 og 31, i dens constructor, hvilket er meget fjollet. 2.5 Programming by contract En måde at undgå tunge, performance-sænkende gyldighedschecks. Ved at opstille kontrakter for hvordan metoder må/skal benyttes kan man fralægge sig ethvert ansvar for effekterne af at kalde metoderne med ugyldige parametre (dvs. hvis preconditions ikke er opfyldt). Samtidig kan man garantere at metoden gør hvad den skal (postconditions), hvis preconditions er opfyldte. Preconditions Skal være opfyldt for at metoden kan garantere en korrekt/gyldig kørsel. For at gøre preconditions fair skal kalderen af metoden kunne checke om preconditionen er opfyldt eller ej, før den laver metodekaldet. Man bør ikke kaste exceptions som resultat af uopfyldte preconditions; det er netop pointen med preconditions: hvis ikke du opfylder disse krav, så garanterer jeg intet og du må sejle i din egen sø. Postconditions 10

11 Skal være opfyldt når metoden er fuldført. Invarianter En måde at checke pre- og postconditions er ved at lave assertion-metoder, som checker et objekts fields gyldighed. Assertion-metoderne kaldes efter constructor og efter metoder, og bruges til runtime debugging. 11

12 2.6 Dispositionsforslag 1 Klasser og objekter Hvordan er en klasse opbygget? Tilstand (fields), klasseinterface (metoder) Indkapsling Visibility modifiers (once public, always public) Accessors vs. mutators Mutable vs. immutable Programming by contract Invarianter generelt Preconditions, postconditions JavaDocs, exceptions/returværdier Cloning Deep vs. shallow Java API en, ArrayList Pointer-diagram 12

13 2.7 Dispositionsforslag 2 Indkapsling Regler Mutable Immutable (klasser uden mutators eks. String) Husk at klone før returnering Visibility modifiers En gang public, altid public 1 Ingen public feltvariable! Dette vil resultere i klassen aldrig kan ændre sin interne repræsentation. Benyt altid getters og setters. Kloning Deep / Shallow (tegn og forklar på tavlen) Programming by contract Invarianter - Sand efter constructoren og sand efter enhver metode Preconditions hos subklasser max lige så stærke som hos superklasse Postcondions hos subklasser minimum lige så stærke som hos superklasse Pre- og post skal nemlig overholde Liskov s substitution Throws definerer hvilke exceptions metoden kan smide (lav kodeeksempel) Assertions (kan bruges til at tjekke pre- og postconditions) 1 Når en metode har været public kan den aldrig laves protected eller private. Hvis andre afhænger af denne metode kan ændringen ødelægge deres programmer. 13

14 3 Polymorphism & Interfaces Polymorfi betyder mangeformet, med hvilket der menes evnen for en variabel af type B at udgive sig for at være af type A, hvis A er en supertype til B. Fx kan klasserne Dog og Cat begge udgive sig for at være Animal objekter. 3.1 Interfaces Et interface er en samling metodesignaturer. Dvs. metoder, som ingen krop har. Metoderne er ikke implementerede. En klasse kan implementere et interface, hvilket betyder, at alle interfacets metoder skal implementeres i klassen. Dette betyder, at hvis en klasse implementerer et interface, kan compileren være sikker på, at interfacets metoder eksisterer i klassen. Java-keyword: implements public class Dog implements Animal {... } 3.2 Polymorfi Hvis en klasse implementerer et interface er klassen en subtype til interfacet. Oprettes en variabel a af type Animal kan den indeholde et objekt af en klasse som implementerer Animal interfacet, fx Dog. Nu har variablen a en formel type (Animal) og en aktuel type (Dog). Liskov s substitutionsprincip siger, at et object af en subclass kan benyttes nårsomhelst et objekt af dens superclass forventes. Eksempelvis kan et Manager objekt altid lægges i en Employee variabel, men ikke den anden vej rundt. Da Manager objekter altid er garanteret at have samme metoder og variable (og lidt til) som Employee objekter, er dette netop muligt. På samme måde kan Dog objekter altid lægges i Animal variable. 3.3 Nedarvning is-a forhold: <subclass> is-a <superclass> Java-keyword: extends public class Manager extends Employee {... } Subclasses arver alle metoder og variable fra deres superclass Subclasses kan override deres superclass metoder, dog ikke hvis de er erklæret final Polymorfi bestemmer hvilken metode der kaldes vha. objektets aktuelle type. En Employee variabel kan fx indeholde et Manager objekt (Liskov s substitutionsprincip), og polymorfien sørger for at kalde Manager-objektets overridden metode - hvis en sådan eksisterer. Override-metoder skal have samme metodesignatur (samme return type, samme parametre), som superclassen s metode. Selvom en metode er overridden kan subclasses godt kalde deres superclass version af metoden med keywordet super. Preconditions til overridden metoder må ikke være mere strikse end superclassens preconditions. Hvis ingen preconditions findes i superclassen må subclassens overridden metode heller ikke have preconditions. Postconditions skal omvendt være mindst ligeså strikse. 14

15 En overridden metode må ikke kaste yderligere check exceptions. Subclasses kan kun tilgå private variable gennem get()-metoder, dog kan de tilgå protected variable (en slags intern public ) Nedarvning af classes betyder, at metoder og funktionalitet er tilgængelige med det samme, og principielt behøver man ikke skrive noget yderligere kode for at bruge sin nye subclass. Implementering (implements) af interfaces betyder derimod, at man selv skal supplere koden for hver af de metoder, som interfacet definerer. 3.4 Abstract classes Abstract classes er ikke instansiérbare - dvs. man kan ikke lave objekter af abstract classes. En class tagges som abstract med keywordet abstract. Fx: public abstract class SelectableShape implements SceneShape Eksempel: SelectableShape. Abstract class der implementerer SceneShape interfacet, og som definerer nogle af interfacets metoder, men ikke alle. De metoder som ikke er definerede skal derfor defineres i subclasses (fx CarShape, HouseShape). Abstract classes implementerer typisk noget af funktionaliteten i de interfaces de evt. implementerer, men ikke alt. Resten af metoderne er abstract. Fordele: Man kan lægge al ensartet funktionalitet for flere classes i én superclass, som implementerer et interface, som er nyttigt for disse classes. Ulemper: Classes kan kun extende én superclass, men implementere adskillige interfaces. Refactoring - at omskrive kode så det er bedre eller lettere at forstå. Fx: Extract superclass - Lav en superclass ud fra de fælles features to eller flere classes har. Refactoring adskiller sig fra design patterns idet refactoring handler om at omskrive allerede eksisterende kode, mens design patterns handler om at planlægge sit arbejde så man kan undgå at skulle benytte sig af refactoring. Template method - en metode som flyttes fra subclasses til en superclass, og som kalder primitive operations, som kan være forskellige, i subclasses. Design pattern En templatemethod() er en metode i en abstract class, som kalder abstract methods (dvs metoder som bliver defineret af subclasses som extender denne abstract class). Altså er en templatemethod() en metode, som kalder andre metoder, som ikke endnu er blevet defineret. 15

16 Eksempel: drawselection() i SelectableShape - drawselection() er defineret i SelectableShape, men kalder metoder draw() og translate(), som er abstract methods i SelectableShape, men som bliver defineret i CarShape og HouseShape. 16

17 3.5 Dispositionsforslag 1 Interfaces Hvad er et interface? Ingen instantiering, ingen implementation Eksempel: public class Hest implements Animal... Polymorfi og nedarvning Hvad er polymorfi? Formel/aktuel type Lisskovs substitutionsprincip Eksempel: public class Manager extends Employee... Abstrakte klasser En slags class-interface hybrid Ingen instantiering, delvis implementation Eksempel: public abstract class Carnivore implements Animal... Template Method Pattern UML-diagram Eksempel: Animal-Carnivore-Cat fra review-opgaverne Eksempel: Applets og metoderne init(), start(), etc. 17

18 3.6 Dispositionsforslag 2 Interfaces Programmør behøver ikke kende egentlige klasser (jvf. Frameworks) Kan implementere mange interfaces modsat nedarvning Visibility modifiers (public, protected, private) private - Bruges som regel til hjælpemetoder public - Bruges til metoder der skal kunne kaldes af andre protected - Kan kun kaldes af subklasser og klassen selv Kan ikke instantieres (kan kun bruges som statisk type) Nedarvning arve metoder fra superklassen super keyword Kan kun nedarve fra én klasse Regler ved nedarvning is-a relationen (<subtype>is a <supertype>) Liskov substitution 2 (en subklasse kan altid indsættes i stedet for en superklasse) Eksempel der overholder Liskov substitution Både is-a og Liskov glæder (Crab extends Animal (fra dintprog) eller JonglerendeKlovn extends Klovn) Kun is-a gælder (Square extends Rectangle 3 ) Preconditions (maks lige så stærke) Postconditions (mindst lige så stærke) Centralisering af kode ved at flytte det op i supertype (referer til aflevering om BankAccount) Polymorfi Flere metoder med samme navn typesystemet sørger for korrekt kald dynamisk/statisk type Hvis man skal modellere cirkusartister har man Linedanser og KanonKonge. Programmøren ved ikke hvilken rækkefølge artisterne skal på scenen så et interface Artist benyttes. Interfacet har metoderne udfør_nummer()og buk().begge klasserne implementerer interfacet og programmøren kan nu håndtere forskellige artister som var de ens. Typesystemet i Java sørger for at metoden bliver kaldt på den rigtige klasse. Altså artist.udfør_nummer()er forskellig alt efter om artist er af typen Linedanser eller KanonKonge. Altså metoden der bliver udført afhænger af den dynamiske type. Det giver bedre muligheder for udvidelse Hvis der skal bruges en ny type artist kan denne blot tilføjes uden videre. Typesystemet sørger for at den korrekte metodeimplementation bliver kaldt. TEMPLATE METHOD pattern 2 Husk at Barbara Liskov er en kvinde 3 Da square er mere restriktiv end rectangle 18

19 Eks. Gå over vejen (menneske og hund) primitive metoder (kig() og gå()) Da hunden har 4 ben går den anderledes end mennesket Den kigger sig nok heller ikke så godt for 19

20 4 Design Patterns Design patterns er guidelines for hvordan man kan designe programmer og klasser. De kan betragtes som generelle løsninger til generelle problemer. Konceptet begrænser sig ikke til datalogi, og blev faktisk opfundet af en arkitekt. Design patterns kan sammenlignes med algoritmer som også er software mønstre, men algoritmer løser beregningsproblemer, mens design patterns løser designproblemer. 4.1 Observer Pattern Hvis et objekt (Subject) starter events (som fx mine data har ændret sig ), som andre objekter (Observers) er interesserede i at vide noget om, kan man bruge OBSERVER mønstret. Stort set alle GUI elementer (fx knapper, checkboxes, slidere) er Subjects i implementationer som følger OBSERVER mønstret. Subject har en samling observer objekter, som bliver tilknyttet med en attach() metode. Når en event sker, meddeler subjectet det til alle observerne. Eksempel: JButtons (Subject) har ActionListeners (Observers). Ofte bruges anonyme klasser i stedet for at lave ConreteObserver klasser: mybutton.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { // do something } }); 4.2 Template Method Pattern Hvis en algoritme eller metode er brugbar i flere klasser, og kan brydes ned i primitive operationer (som godt kan være defineret forskelligt i de forskellige klasser) kan man bruge TEM- PLATE METHOD mønstret. Metoden eller algoritmen, templatemethod(), flyttes ind i en abstract superclass, sammen med abstract metoder for hver af de primitive operationer, som templatemethod() kalder. Disse primitive operationer defineres IKKE i superclassen, men i subclasses (som extender den abstrakte superclass). Altså er en templatemethod() en metode som kalder andre metoder som ikke endnu er blevet defineret. 20

21 Eksempel: drawselection() i SelectableShape - drawselection() er defineret i Selectable- Shape, men kalder metoder draw() og translate(), som er abstract methods i SelectableShape, men som bliver defineret i CarShape og HouseShape. 4.3 Strategy Pattern Hvis en klasse kan udnytte forskellige variationer af en algoritme, kan man bruge STRAT- EGY mønstret. LayoutManagers i Java er designet omkring STRATEGY mønstret. Containers (Context, fx JPanel, JFrame) kan udnytte forskellige layout managers (ConcreteStrategy, fx BorderLayout, GridLayout) til at arrangere deres indhold. De forskellige variationer af algoritmen defineres i klasser som implementerer et Strategy-interface. Context-klassen kalder så den rigtige metode på det konkrete Strategy-objekt. Dvs. enhver klasse som implementerer Strategy-interfacet kan benyttes af Context-klassen, men Contextklassen er også afhængig af (dependency) Strategy-interfacet. 4.4 Composite Pattern Hvis man har behov for at kombinere en række primitive objekter i en bundle, som bliver opfattet af klienter som værende et enkelt primitivt objekt selv, kan man benytte COMPOSITE mønstret. Man lader en klasse (Composite) implementere det samme interface som det, de primitive objekter implementerer. Composite-klassen betragtes således af klienter på samme måde som de primitive objekter. Desuden aggregerer Composite-klassen også interfacet, hvilket betyder at den har en samling (fx ArrayList) af primitive objekter. 21

22 Metoderne fra interfacet defineres i Composite-klassen ved at kalde metoderne på hvert af de primitive objekter, som er indeholdt i klassen. De skal selvfølgelig kaldes på en bestemt måde - fx skal en Bundle-klasse som indeholder Item-objekter udregne alle Item-objekternes samlede pris, når getprice() kaldes på Bundle. 22

23 4.5 Dispositionsforslag 1 Design Patterns Hvad er design patterns? Universel kommunikation Komplet pattern: navn, kontekst, løsning og UML-diagram Observer Pattern UML-diagram Subject has-an Observer (implementerer interfacet) Event på Subject kald på Observer Eksempel: JButton og ActionListeners Visitor Pattern UML-diagram accept(), visitnode() og visitleaf() FileSystemNode-aflevering Sammenlign med Composite Pattern Template Method Pattern UML-diagram Eksempel: Animal-Carnivore-Cat fra review-opgaverne Eksempel: Applets og metoderne init(), start(), etc. 23

24 4.6 Dispositionsforslag 2 Det vigtige i dette emne er at du vælger så få at du har tid til at gå i dybden med dem alle, men ikke det er også vigtigt at du kan fylde tiden ud. Hellere have forberedt et pattern for meget end et for lidt. For hvert pattern skal der være styr på UML diagrammet og hvilket problem det løser. Derudover ville det også være fint at kunne give et eksempel på brug. Composite mønstret realiserer at en samling af objekter kan håndteres som et enkelt objekt. (Eks. en dagligvare og en indkøbspose med varer) Adapter et objekt skal bruges af en klasse uden at der ændres på objektet. Objektet implementerer ikke det rigtige interface og skal adaptes til det rigtige interface. En adapter-klasse oprettes som implementerer det rigtige interface og bruger objektets metoder til at realisere de nye metoder Template Method Proxy Relater til frameworks og nævn prototype pattern Hvad: en klasse der kalder primitive metoder på subklasser af et interface og kombinerer disse til en kompleks metode. Hvornår: en algoritme bruges i flere klasser. Algoritmen kan brydes ned til mindre dele. Delalgoritmerne defineres i klasserne. En superklasse kalder de primitive algoritmer i en rækkefølge så det danner den komplekse algoritme. Algoritmen er nu samlet et sted. Hvad: en stand-in klasse for det oprindelige subjekt. Har samme metoder, dog med nogle modifikationer der gør den fordelagtig. Hvordan: en proxyklasse implementerer samme interface som det oprindelige subjekt. Proxyen kalder metoderne på subjektet. 24

25 5 Inheritance & Abstract Classes Nedarvning handler om at lave specialiserede udgaver af allerede eksisterende og mere generelle klasser. Eksempelvis Employee-Manager forholdet diskuteret i Horstmann kap. 6; alle Managers er Employees, men ikke alle Employees er Managers. Managers er specielle typer af Employees, som har ekstra features. 5.1 Superclass (generel) og subclass (specialiseret) is-a forhold: <subclass> is-a <superclass> Java-keyword: extends public class Manager extends Employee {... } En class som er erklæret final kan ikke extendes Alle classes extender Object Subclasses arver alle metoder og variable fra deres superclass Subclasses kan override deres superclass metoder, dog ikke hvis de er erklæret final Polymorfi bestemmer hvilken metode der kaldes vha. objektets aktuelle type. En Employee variabel kan fx indeholde et Manager objekt (Liskov s substitutionsprincip 4 ), og polymorfien sørger for at kalde Manager-objektets overridden metode - hvis en sådan eksisterer. Override-metoder skal have samme metodesignatur (samme return type, samme parametre), som superclassen s metode. Selvom en metode er overridden kan subclasses godt kalde deres superclass version af metoden med keywordet super. Preconditions til overridden metoder må ikke være mere strikse end superclassens preconditions. Hvis ingen preconditions findes i superclassen må subclassens overridden metode heller ikke have preconditions. Postconditions skal omvendt være mindst ligeså strikse. En overridden metode må ikke kaste yderligere check exceptions. Subclasses kan kun tilgå private variable gennem get() metoder, dog kan de tilgå protected variable (en slags intern public ) Nedarvning af classes betyder, at metoder og funktionalitet er tilgængelige med det samme, og principielt behøver man ikke skrive noget yderligere kode for at bruge sin nye subclass. Implementering (implements) af interfaces betyder derimod, at man selv skal supplere koden for hver af de metoder, som interfacet definerer. 5.2 Abstract classes Abstract classes er ikke instansiérbare - dvs. man kan ikke lave objekter af abstract classes. En class tagges som abstract med keywordet abstract. Fx: public abstract class SelectableShape implements SceneShape 4 Liskov s substitutionsprincip siger, at et object af en subclass kan benyttes nårsomhelst et objekt af dens superclass forventes. Eksempelvis kan et Manager objekt altid tildeles en Employee variabel, men ikke den anden vej rundt. Da Manager objekter altid er garanteret at have samme metoder og variable (og lidt til) som Employee objekter, er dette netop muligt. 25

26 Eksempel: SelectableShape. Abstract class der implementerer SceneShape interfacet, og som definerer nogle af interfacets metoder, men ikke alle. De metoder som ikke er definerede skal derfor defineres i subclasses (fx CarShape, HouseShape). Abstract classes implementerer typisk noget af funktionaliteten i de interfaces de evt. implementerer, men ikke alt. Resten af metoderne er abstract. Fordele: Man kan lægge al ensartet funktionalitet for flere classes i én superclass, som implementerer et interface, som er nyttigt for disse classes. Ulemper: Classes kan kun extende én superclass, men implementere adskillige interfaces. Refactoring - at omskrive kode så det er bedre eller lettere at forstå. Fx: Extract superclass - Lav en superclass ud fra de fælles features to eller flere classes har. Refactoring adskiller sig fra design patterns idet refactoring handler om at omskrive allerede eksisterende kode, mens design patterns handler om at planlægge sit arbejde så man kan undgå at skulle benytte sig af refactoring. Template method - en metode som flyttes fra subclasses til en superclass, og som kalder primitive operations, som kan være forskellige, i subclasses. Design pattern En templatemethod() er en metode i en abstract class, som kalder abstract methods (dvs metoder som bliver defineret af subclasses som extender denne abstract class). Altså er en templatemethod() en metode, som kalder andre metoder, som ikke endnu er blevet defineret. Eksempel: drawselection() i SelectableShape - drawselection() er defineret i SelectableShape, men kalder metoder draw() og translate(), som er abstract methods i SelectableShape, men som bliver defineret i CarShape og HouseShape. 26

27 Protected interfaces protected er en mellemting mellem public og private; kan ses som internt public for alle subclasses til en class, men eksternt private for alle andre classes. Metoder kan kun bruge protected metoder/fields fra objekter af samme class som de ligger i. Fx kan HouseShape ikke kalde add() på en CarShape, selvom de begge extender CompoundShape, som har en protected add() metode. Protected fields bør undgås af samme grund som public fields bør undgås. 5.3 Hvornår er nedarvning ikke en god ide? Nedarvning bruges til is-a forhold. is-a forhold betyder at en class er en specialiseret version af en anden class. Fx, CarShape is a SelectableShape Aggregering bruges til has-a forhold. has-a forhold betyder at en class har et field hvis type er en anden class. Fx, Circle has a Point - Circle classen har et Point objekt som sit centrum. Den er ikke et Point objekt i sig selv. Nedarvning bør ikke bruges, hvis resultatet bryder med Liskov s substitutionsprincip. Fx, Stack<T> extends Vector<T> er en dum idé, da en stack og en vektor ikke har noget med hinanden at gøre. Med en stack kan man kun push og pop elementer på og af, og i LIFO 5 orden. Med en vektor kan man fjerne elementer tilfældige steder i arrayet. 5 LIFO = Last In First Out 27

28 5.4 Dispositionsforslag 1 Nedarvning og polymorfi Hvad er polymorfi? Formel/aktuel type Lisskovs substitutionsprincip Eksempel: public class Manager extends Employee... Abstrakte klasser En slags class-interface hybrid Ingen instantiering, delvis implementation Eksempel: public abstract class Carnivore implements Animal... Refactoring Genbruge kode Fælles kode i abstrakte superklasser Mindre arbejde i underklasser Eksempel: Account-aflevering Template Method Pattern UML-diagram Eksempel: Animal-Carnivore-Cat fra review-opgaverne Eksempel: Applets og metoderne init(), start(), etc. 28

29 5.5 Dispositionsforslag 2 Nedarvning arve metoder fra superklassen visibility modifiers (super keyword) Kan kun nedarve fra én klasse Regler ved nedarvning is-a relationen (<subtype>is a <supertype>) Liskov substitution 6 (en subklasse kan altid indsættes i stedet for en superklasse) Eksempel der overholder Liskov substitution Både is-a og Liskov glæder (Crab extends Animal (fra dintprog) eller JonglerendeKlovn extends Klovn) Kun is-a gælder (Square extends Rectangle 7 ) Preconditions (maks lige så stærke) Postconditions (mindst lige så stærke) Centralisering af kode ved at flytte det op i supertype (referer til aflevering om BankAccount) Polymorfi Flere metoder med samme navn typesystemet sørger for korrekt kald dynamisk/statisk type Eksempel på polymorfi Artist a = new Klovn(); Abstrakte klasser Flere klasser har ens metoder Centralisering af kode tvinge subklasser til at implementere metoder TEMPLATE METHOD pattern Eks. Gå over vejen (menneske og hund) primitive metoder (kig() og gå()) Da hunden har 4 ben går den anderledes end mennesket Den kigger sig nok heller ikke så godt for 6 Husk at Barbara Liskov er en kvinde 7 Da square er mere restriktiv end rectangle 29

30 6 Exceptions & Files Exceptions er en smart måde at håndtere programfejl på. Brug af exceptions betyder, at man kan undgå situationer hvor return-values for metodekald skal valideres på alle mulige måder, fx if (value == -1) eller if (value!= null). Klienter kan samtidig tvinges til at tage handling, hvis der sker fejl. 6.1 Defensive programming Gå ud fra, at programmet bliver afviklet i et fjendtligt miljø med egentlige fjender, men også inkompetente brugere. Check gyldighed af inputs, return-values, etc. 6.2 Hvis man ikke har exceptions? Return-values som fungerer som fejl -values (fx -1, null) Kræver mange if-else-statements, som gør, at det bliver mere uoverskueligt og kompliceret at separere fejlhåndteringskode fra andet kode. Ingen måde at tvinge klienter til at checke om returværdier er gyldige eller ej, så der er en uheldig risiko for, at programmet dermed fortsætter afvikling med ugyldige værdier, som ødelægger andre resultater - eller at programmet crasher. 6.3 Throwable hierakiet Unchecked exceptions (Throwable Exception RuntimeException) Compileren kræver ikke, at unchecked exceptions håndteres, men man kan stadig håndtere dem (try-catch-blok) hvis man vil, på samme måde som med checked exceptions. Bruges til situationer hvor et program kan fejle som resultat af inkompetente programmører på den ene eller anden måde, fx hvis en metode bliver bedt om at hente data fra plads -1 i et array. Dette er en logisk fejl, som sikkert kunne undgås vha. nogle checks. Fx NullPointerException, IllegalArgumentException Checked exceptions (Throwable Exception) Compileren kræver håndtering af checked exceptions (try-catch-blok) Bruges til situationer hvor et program kan fejle som resultat af noget, som programmøren ikke har kontrol over - fx hvis man forsøger at skrive en fil til en disk som er fuld. Fx IOException, FileNotFoundException 6.4 Exception handling For at kaste exceptions bruges throw. Fx throw new IOException() Metoder, som kaster checked exceptions skal i metode-signaturen indeholde throws (bemærk s et) efterfulgt af hvilke typer exceptions som kastes. Fx public void addfile(string filename) throws IOException Metoder som kun kaster unchecked exceptions behøver ingen throws i signaturen, men der er ingen regler imod det. 30

31 Metoder kan kaste exceptions videre (propagate an exception). For checked exceptions skal metoderne have throws i deres signatur, også selvom det ikke er metoden selv som kaster en exception (det kunne være et kald til en anden metode, som netop kaster exceptions). For unchecked exceptions kan throws udelades. Exceptions håndteres ved at beskytte kode, som kan kaste exceptions, med en try-blok, efterfulgt af en catch-blok, som fanger den type exceptions der kan blive kastet fra try-blokken. try { writetofile(file); } catch (IOException e) { System.out.println("Unable to save to " + file); } Catch efterfølges af en parentes indeholdende den type af exception som der ønskes håndteret i den efterfølgende blok. Man kan have flere catch-blokke efter en try-blok, så man kan specificere hvilken type fejl programmet har lavet. catch (Exception e) vil fange ALLE exceptions, da alle exceptions er subtyper til Exception (polymorfi). Det kræves, at en catch-blok, som følger en anden catch-blok, ikke fanger exceptions, som er supertyper til dem der fanges i ovenstående catch-blokke. Fx må catch (Exception e) ikke komme før catch (IOException). try-catch-blokke kan følges af en valgfri finally blok. finally-blokken udføres uanset om der kastes en exception eller ej. Den er ofte udeladt, men kan bruges til oprydningsarbejde. Den er ikke redundant da den også køres selvom der fx er et return-statement i try-blokken. Desuden køres den også selvom en kastet exception ikke bliver fanget af catch-blokken. 6.5 Error recovery and avoidance Man kan indkapsle try-catch-blokken i et loop, hvor man laver en slags retry ved at modificere elementer i catch-blokken. Fx hvis man forsøger at læse en fil som ikke eksisterer, kan man i catch-blokken ændre på filnavnet eller prøve at kigge i nærliggende mapper, inkrementere en attempts integer MAX_ATTEMPTS gange, og så lade try-blokken køre igen. Man kan forsøge at undgå exceptions og errors ved at lave relevante checks på return-values, før man blindt benytter dem. Typisk check if (value!= null) 6.6 File handling Exceptions er meget relevante for filhåndtering, da der er mange tilfælde hvor programmøren ingen kontrol har over det miljø filerne befinder sig i. Typiske filhåndteringsproblemer: Åbne ikke-eksisterende filer. Åbne filer som er i brug. 31

32 Skrive filer til en fuld harddisk. java.io bibliotek til filhåndtering To typer filer Tekstfiler: filer bestående af læselige bogstaver. Håndteres med readers/writers: FileReader, BufferedReader, FileWriter Binary filer: filer bestående af byte-sekvenser. Håndteres med streams: FileInput- Stream, FileOutputStream Filen åbnes, data læses/skrives, filen lukkes. Til skrivning af tekstfiler benyttes FileWriter. FileWriter writer = new FileWriter(file); writer.write(text); writer.close(); Til læsning af tekstfiler wrappes FileReader objekter ofte i BufferedReaders, da FileReader ikke kan læse hele linjer ad gangen. FileReader fr = new FileReader(file); BufferedReader reader = new BufferedReader(fr); reader.readline(); reader.close(); Omringes af try-catch-blok, hvori bl.a. IOExceptions fanges. Scanner Serialization Kan læse input fra terminalen Kan også læse input fra tekstfiler og finde betydningsfulde dele af inputtet vha. dens parsing metoder, fx nextint(). Hvis en klasse implementerer interfacet Serializable kan et objekt af klassen gemmes som en binær fil i én write operation (ObjectOutputStream) Objektet kan ligeledes indlæses igen (ObjectInputStream) Hvis dele af klassens tilstand ikke er Serializable (fx hvis man har en feltvariabel som er et HashMap) kan de markeres så de skippes af processen vha. Javas transient keyword. Ellers kastes en exception. 32

33 6.7 Dispositionsforslag 1 Exceptions Hvad er exceptions? Hvis man ikke havde exceptions? Checked vs. unchecked UML-diagram, Throwable-hierarkiet Regler for checked exceptions (throws, try-catch) Exception handling Defensive programming Exceptions kastes med throw new Exception() Avoidance, unchecked exceptions kan ofte undgås vha. checks Recovery, for-løkke med attempts -tæller for checked exceptions Filhåndtering Hvorfor er exceptions relevante for filer? Tekstfiler: FileReader, BufferedReader, FileWriter Andre filer: InputStream, OutputStream 33

34 6.8 Dispositionsforslag 2 hvad er exceptions og hvad bruges de til hvad ville man gøre uden exceptions 8 (sproget C har ingen exceptions) 2 typer exceptions (checked og unchecked) Tegn exceptions klassehierarki (Throwable, Exception, RuntimeException, Error) Egne exceptions (Hvilken klasse skal nedarves fra) Try / catch / finally (husk finally køres ALTID, og bruges ofte til cleanup) Throws keyword Fil håndtering Meget kan gå galt Eksempler (Filen eksisterer ikke, ingen adgang til filen) Relater evt. til aflevering om filhåndtering Defensive programming Minimerer antallet af fejl Tager højde for alt (især brugerinput) Brugeren er ond Programmør fejl Sørg for at programmet ikke crasher 8 I sproget C returnerer de fleste metoder en værdi der fortæller om kaldet gik godt eller skidt. For systemkald repræsenterer en negativ returværdi oftest at noget er gået galt. 34

35 7 The Java Type System and Object Model 7.1 Typer og værdier Alle typer i Java er én af følgende: Primitive typer: int short long byte char float double boolean Klassetyper, fx String, Rectangle Interfacetyper, fx Comparable, Shape Arraytyper, fx String[], int[], char[]. En arraytypes elementer kaldes arrayets component type. Null-typen, null Alle values i Java er én af følgende: En værdi til en primitiv type, fx 13, 5.0, k En reference til et objekt af en klasse, fx new String( Hest ) En reference til et array, fx new int[] 2, 3, 5, 7, 11, 13 null Man kan ikke have værdier til interface-typer, da de ikke kan instantieres. 7.2 Subtype-forhold Subtype-forholdet i Java følger Liskov s substitutionsprincip om, at subtyper kan benyttes hvor supertyper forventes. Vi betragter to typer, S og T. S er en subtype til typen T, hvis én af følgende regler passer: S og T er samme type S og T er begge klassetyper, og S er en direkte eller indirekte subclass til T S og T er begge interface-typer, og S er direkte eller indirekte subinterface til T S er en klassetype, T er en interface-type, og S eller en superclass til S implementerer T eller et subinterface til T S og T er arraytyper, og component-typen til S er en subtype til component-typen til T S er ikke en primitiv type, og T er Object S er en arraytype, og T er Cloneable eller Serializable S er null og T er ikke en primitiv type Ved subtype-forhold mellem to arraytyper kan man trække array brackets fra begge arrays indtil én eller begge typer ingen brackets har. Object[] og int[], træk brackets fra på begge arrays, Object og int, og da int er en primitiv type er den ikke en subtype til Object, og dermed er int[] ikke en subtype til Object[] og omvendt. int[] er dog en subtype til Object, så int[][] er en subtype til Object[]. Compiler checker kun formelle typer, hvilket vil sige, at selv om man fodrer en subtype til en supertype (Manager i Employee variabel, Liskov substitution), kan man kun kalde supertypens metoder, fordi compileren altid kun kigger på formelle typer. Typecasting betyder at man omdanner et objekts statiske/formelle type til en anden type, fx 35

36 Employee e = new Manager(); e.getbonus() // COMPILE ERROR! ((Manager)e).getBonus() // OK! Primitive typer kan også typecastes, men der er nogle bestemte termer i den forbindelse: Widening, når man fx caster en int til en double. (2 -> 2.0) Sker automatisk! Fx double x = 2 -> x = 2.0 Narrowing, når man fx caster en double til en int. (2.5 -> 2) Kræver typecast! Fx int y = (int) 5.2 -> y = Wrappers (aka. Snoop Dogg) De 8 primitive typer har tilhørende wrappers (klassetyper): Integer, Short, Long, Byte, Character, Float, Double, Boolean. De har altså samme navne som deres primitive modstykker, pånær Integer (int) og Character (char). Wrapper-classes kan wrappe primitive typer i objekter, hvor det er nødvendigt. Fx hvis man skal have en ArrayList med ints. ArrayList kan ikke have primitive typer. Auto-boxing er den automatiske konvertering mellem primitive typer og wrapper objekter. Dette gør at man ganske enkelt kan tilføje int-værdier til ArrayLists af Integers, uden at skulle konvertere manuelt først. 7.4 Enum Enumerated types er typer med et endeligt sæt værdier. Eksempler på enum typer er Suit med fire værdier: SPADE, CLUB, HEART, DIAMOND, eller Size, som fx kunne have værdierne: SMALL, MEDIUM, LARGE. Keywordet enum definerer en class med en private constructor (nye objekter kan ikke laves fra den) med nogle fields tagged som public static final. Det er forsvarligt at lade dem være public, idét klassen ingen metoder har, og dens fields er alle final. 7.5 Type inquiry Man kan teste om et objekt eller en expression er en reference til et objekt af en bestemt type, eller én af dens subtyper med instanceof operatoren. if (e instanceof Shape) Man kan finde et objekts klasse med getclass() metoden. Den returnerer et Class objekt. Dette objekt indeholder en masse information om det objekt, metoden blev kaldt på. Fx navnet på den klasse objektet tilhører, eller klassens eventuelle superclass. Med getname() kaldt på et Class objekt kan man få det præcise klassenavn for et objekt. Class objekter kan beskrive enhver type, også primitive typer. Vil man teste om et objekt tilhører en bestemt class, kan man kalde getclass() på objektet og sammenligne med den bestemte class således: if (e.getclass() == Rectangle.class) Type inquiry bør ikke bruges som en erstatning for polymorfi. 36

37 7.6 The Object class - mother of all classes Alle Java-classes er subclasses til Object. Hvis en class ikke extender nogle andre classes er den en direkte subclass til Object. Derfor er alle metoder i Object tilgængelige for alle objekter. De fire vigtigste (som også altid bør overrides i custom classes) er: tostring() som returnerer en String-repræsentation af objektet. Bruges automatisk af forskellige standard-metoder. Fx hvis man prøver at printe et objekt vha. System.out.println(). equals() som sammenligner et objekt med et andet. Man kan nemt sammenligne to ints med hinanden som (x == y), men bruger man == operatoren på objekter sammenlignes objekternes referencer. Det ønskes ofte at to objekter betragtes som værende ens, hvis dele eller hele tilstande af objekter er ens. Fx kan to Beer-objekter betragtes som ens hvis deres name og percent fields er ens. Hvis to lister indeholder de samme elementer i forskellige rækkefølger kan de også i nogle situationer betragtes som ens. Den perfekte equals metode starter ifølge Horstmann således: if (this == otherobject) return true; if (otherobject == null) return false; if (getclass()!= otherobject.getclass()) return false; Metoden skal være reflexive (x.equals(x)) og symmetrisk (x.equals(y) <-> y.equals(x)) hashcode() som returnerer en hash code for objektet. Hash codes skal være konsistente med equals metoden, så to objekter som equals hinanden genererer samme hash codes. clone() som returnerer en kopi/klon af objektet. Cloneable interface skal implementeres Der skælnes mellem deep og shallow copies af objekter vha. clone metoden. En shallow copy er en kopi, som ganske enkelt bare kopierer alle værdierne i originalens fields (orig.x =? -> clone.x = orig.x). Hvis disse værdier er objektreferencer (hvilket de er, hvis de ikke er primitive værdier), vil kopien nu dele objektreferencer med originalen, hvilket betyder at en ændren i kopiens værdier også ændrer på originalens værdier! En deep copy er en kopi som er magen til originalen, men har sine egne field-værdier (orig.x =? -> clone.x = new x). Ændringer i kopien ændrer således ikke på originalen. En sufficiently deep copy er en kopi som kun opretter nye objektreferencer til objekter som er mutérbare. String er immutérbare, så typiske name fields er ikke kritiske. 7.7 Serialization Man kan gemme objekter som binære filer, hvis klassen objekterne tilhører implementerer Serializable interfacet. 7.8 Generic Types Generics er typer som har en eller flere type-variable, som betegnes med bogstavet E, fx ArrayList<E> som altså instantieres med en ikke-primitiv type. Det kunne være ArrayList<Integer> eller ArrayList<String>. Metoderne i generic types arbejder med dette E, som altså ved instantiering er en egentlig type. 37

38 7.9 Dispositionsforslag 1 Typer Hvad er typer? Hvilke findes der? Primitive typer, reference-typer null-pointers Subtype-forhold Keywords: extends og implements Casting af reference-typer Casting af primitive typer, widening/narrowing Generics og Wrappers Generics omgår IntArrayList, StringArrayList, etc. Tillader at benytte en generisk klasse med vilkårlige typer Wrapper-klasser nødvendige for primitive typer The Object Class Metoder: tostring(), equals(), hashcode() Forhold mellem equals() og hashcode() Evt. clone() Cloning Deep vs. shallow Java API en, ArrayList Pointer-diagram 38

39 7.10 Dispositionsforslag 2 Typer Primitive typer wrappers og auto boxing widening / narrowing type casts Reference typer klasse / interface / array statisk / dynamisk type (skriv kode og forklar) null (special case da null ikke er en type) Object klassen Alle referencetyper nedarver fra Object Implementerer generelle metoder Equals (overvej at skrive kode 9 ) x = x x = y = y = x x = yy = z = x = z Clone (deep og shallow) - overvej at komme ind på immutable klasser Generics Wildcards / extends / super Eksempel på brug Collections.sort() Kodeeksempel på generisk klasse 9 Det tager lang tid at skrive koden og det er vigtigt at det er helt korrekt. Overvej om det er det værd, eller om du hellere vil have mere tid til at tale om de andre emner. 39

40 8 Frameworks & Collections Frameworks er en samling af klasser som alle arbejder sammen og er relevante for et bestemt emne. Fx er Swing et framework, og dets klasser benyttes alle til at lave GUI er med. Et andet framework er Applet, som bruges til at lave Java applets med, så de kan køres i web browsers. 8.1 Frameworks og libraries Frameworks adskiller sig fra normale program libraries på forskellige måder Inversion of control - I modsætning til almindelige libraries fungerer det meste af execution flowet for et framework i selve framework klasserne. Dvs. frameworkets metoder kan overrides, men det er frameworket som sørger for at kalde dem. Dette fænomen kaldes også Hollywood-princippet: Don t call us, we call you. Extensibility - Brugere kan benytte frameworkets default behaviour eller override og specialisere dets metoder. Niks pille - Frameworkets kode må generelt ikke ændres. Brugere er nødt til at extende og override for at specialisere funktionalitet. Frameworks er ikke design patterns, og der er ingen egentlige design regler for hvordan frameworks skal se ud - de består udelukkende af et sæt klasser, som udgør en slags generel service for en bestemt type program, og de benytter typisk mange forskellige design patterns. 8.2 Applets Applets er programmer som afvikles i web browsers. java.applet er et framework, som bruges til lige netop det formål. I de fleste selvstændige programmer er der en main metode, som er det første der bliver kørt når programmet starter. I Applet-frameworket er denne metode allerede defineret, og programmer som extender Applet, skal bare override nogle eller alle af følgende metoder: init - Kaldes én gang, lige når appletten loades. start - Kaldes når appletten startes (efter init) stop - Kaldes når appletten eller browseren lukkes destroy - Kaldes når browseren lukkes for at frigive resourcer paint - Kaldes når appletten skal repaintes (ofte). Framework karakteristika for applets: Applet-programmøren extender Applet frameworket (inheritance) Applet-klassen sørger for alle de trivielle ting, som at parse parametre og checke hvornår appletten er synlig og sådan. Applet-programmøren overrider bare metoder som ønskes specialiseret. Inversion of control gør, at programmøren ikke bekymres med hvornår og hvordan metoderne skal afvikles. Det sørger frameworket for. 40

41 8.3 Collections Collections er både en samling af almene datastrukturer og et framework for nye collection klasser. Frameworket indeholder nogle forskellige interfaces, fx: Collection - Det mest generelle collection interface Set - En usorteret collection some ikke tillader duplicates SortedSet - En sorteret collection som ikke tillader duplicates. Elementerne sorteres vha. Comparable eller Comparator List - En ordnet collection der kan indeholde duplikater Frameworket tilbyder desuden konkrete klasser som implementerer disse interfaces. Nogle af de vigtigste er: HashSet - Et set som bruger hashing/hash codes til at finde dets elementer ArrayList - En liste som internt er baseret på arrays. ArrayLists er gode, hvis man ønsker hurtig random access i listen, da dens lookups fungerer som i arrays. Til gengæld er ArrayList langsom til at tilføje og fjerne elementer, da der ved disse operationer laves en kopi af det nuværende array, plus/minus ét element. LinkedList - En liste som ikke er baseret på arrays. LinkedLists er gode hvis man ønsker hurtige add/remove metoder, men deres lookups er meget langsomme sammenlignet med ArrayLists, da LinkedLists altid gennemløbes fra start til det index man søger. AbstractCollection er en abstrakt klasse, som implementerer Collection interfacet, og definerer alle metoderne, undtagen iterator()og size().metoder som toarray()bruger netop iterator()og size(),hvilket vidner om Template Method designmønstret. AbstractCollection efterlader kun følgende to metoder til subclasses: int size() Iterator<E> iterator() De fleste konkrete collection classes som extender AbstractCollection overrider dog add()metoden, da AbstractCollection s version er en dummy udgave som bare kaster en UnsupportedOperationException, hvilket giver mening for collections som skal være immutable. 41

42 8.4 Dispositionsforslag 1 Frameworks Frameworks vs. libraries Inversion of Control java.lang.math er et library, ingen IoC Java Applets hører til et framework Applets Simpelt framework Metoderne init(), start(), etc. IoC Collections Alle niveauer af et framework Interfaces, fx List Abstrakte klasser, fx AbstractCollection Færdige klasser, fx ArrayList Sammenligning af forskellige collections, ArrayList vs TreeSet Template Method Pattern UML-diagram MultiSet-aflevering 42

43 8.5 Dispositionsforslag 2 Framework vs program library Hollywood princippet Don t call us, we call you hot spots / frozen spots Eks. RPG spil eller applets 10 Extend applet med metoderne (init(), start(), stop() og paint()) frameworket kalder selv disse metoder. Appletklassen er altså et hot spot. Prototyper (PROTOTYPE pattern) Frameworket skal kunne kalde brugerens klasser Laver nye objekter ved at klone en prototype Collections framework sort / shuffle / min / max Collection interface (hot spot) (generisk) set (ingen dupletter) vs. list (elementers rækkefølge er bibeholdt) Benyt muligvis muligheden for at tale om generiske klasser AbstractCollection<E> Opret nye collections ud fra denne klasse der implementerer de fleste metoder TEMPLATE METHOD pattern (vær klar på at give specifikt ekesmpel) 10 Det vigtige her er at du har styr på dit eksempel og føler dig sikker på at tale om det. 43

44 9 Multithreading Tråde er er programstykker som kan eksekveres parallelt med hinanden, dvs. på samme tid. På single-core systemer skifter operativsystemet konstant mellem trådene, hvilket giver illusionen af, at de kører parallelt. På multi-core systemer kan operativsystemet derimod virkelig afvikle tråde parallelt - én på hver core. 9.1 Fordele Gør det muligt at separere program-kode fra kontrol-kode, fx kan lange rekursive beregninger udføres i én tråd, mens main-tråden fortsat reagerer på inputs fra brugeren. Kan således forhindre at programmer fryser mens lange beregninger finder sted. 9.2 Ulemper Der kan opstå problemer, fx race conditions ved synkronisering hvis flere tråde deler data. Deadlocks hvis alle aktive tråde venter på at nogle andre tråde gør noget 9.3 Runnable interfacet En class som implementerer Runnable interfacet skal override metoden run(), hvorefter et Thread-objekt kan laves med et objekt af denne Runnable class. Herefter kaldes start() på Thread-objektet, og så afvikles koden i Runnable objektets run() metode. Runnable r = new MyRunnable(); Thread t = new Thread(r); t.start(); UML diagram 9.4 Selfishness En tråd skal lade andre tråde komme til, ellers er den selfish. På nogle platforme kan en selfish tråd forhindre andre tråde i at blive afviklet, hvilket ødelægger formålet med tråde. Tråde kan sættes til at sove med sleep(). Når en tråd sættes til at sove betyder det, at andre tråde kan komme til. En tråds afviklingstid kaldes en time slice. main() metoden i ethvert Java program er sin egen tråd. Hvis man har startet flere tråde i sit program afsluttes det først når alle trådene er færdige, eller er blevet interrupted. 44

45 9.5 Tilstand Diagram Når der laves et nyt Thread objekt er den new. Når start()metoden kaldes bliver tråden runnable. Herfra er tråden klar til at blive kørt. Tråden kan blive blocked hvis der kaldes wait()eller sleep().dette sker som regel når tråden venter på en lås. Når tråden vækkes af enten notify()eller signal()bliver den igen runnable. Når run()metoden returnerer dør tråden. En tråd kan være blocked hvis den sover, venter på input/output, venter på en lock eller en condition. Når en tråd er blocked forbliver den blocked indtil den event den venter på sker. Fx, hvis en tråd sover bliver den først runnable igen når dens sovetid er gået. 9.6 interrupt() Tråde kan afbrydes/stoppes med interrupt() sleep() og wait() kaster en InterruptedException, hvis interupt() kaldes på en sovende tråd. Denne exception skal fanges, og man bør derfor omringe al koden i run() med en try-blok. Hvis tråden ikke er blocked vil interrupt() bare sætte trådens interrupted field til true. Dette field kan checkes med metoden isinterrupted(). I tilfælde af I/O eller andet beskidt arbejde bør tråde altid have noget oprydningskode efter try-blokken. 9.7 Race conditions Når flere tråde deler data, som kan korrupteres hvis trådene ikke afvikles i en bestemt rækkefølge. Hvis to tråde fx forsøger at lægge nyt indhold i en queue, og samtidig inkrementerer queuens tail, så kan race conditions gøre, at en tråd ikke når at inkrementere tailen før en ny tråd tager over. I så fald overskrives den første tråds data. Se evt. Horstmann s. 376 Locks kan bruges til at blokkere alle andre tråde, som forsøger at tilgå den samme data som den nuværende tråd, indtil denne er færdig med sin kode. Når den første tråd frigiver locken, bliver de andre tråde unblocked. 45

Objektorienteret design med arv og polymorfi:

Objektorienteret design med arv og polymorfi: Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Objektorienteret design med arv og polymorfi: Substitutionsprincippet Composite Design Pattern Finn Nordbjerg Side 1 Objektorienteret

Læs mere

4 Basal Objekt-orienteret Programmering I.

4 Basal Objekt-orienteret Programmering I. 4 Basal Objekt-orienteret Programmering I. Klasser i forhold til abstrakte datatyper og record-typer. Variable og operationer. Klasse-interfaces. Klasser og typer. Klasse-instantiering og initialisering.

Læs mere

Begreber om Godt Software

Begreber om Godt Software Begreber om Godt Software Maintainability (vedligeholdelse): Softwarens evne til at blive ændret (funktionalitet, rettet, forbedrelser, miljø, krav). - Analyserbart: Evnen til at blive fejldiagnosticeret,

Læs mere

Objektorienteret Programmering

Objektorienteret Programmering Objektorienteret Programmering Struktureret Systemudvikling Jan Bendtsen Automation and Control Indhold Lidt om programmeringssprog Klasser i Java Klasser i C++ Oversættelse og kørsel af kode Et eksempel:

Læs mere

SAX Simple API for XML.

SAX Simple API for XML. SAX Simple API for XML. En API (Application Programming Interface) et bibliotek eller et sæt af funktioner eller metoder. SAX er et sådant bibliotek af abstrakte metoder som f. eks. startdocument() eller

Læs mere

Objektorienterede metoder

Objektorienterede metoder Objektorienterede metoder Denne gang: Designmønstre Skabende designmønstre: Fabrikeringsmetode/Fabrik, Singleton, Abstrakt fabrik (Toolkit), Prototype, Objektpulje Singleton eksempel: Forskellige slags

Læs mere

Kontraktbaseret Design. Anker Mørk Thomsen

Kontraktbaseret Design. Anker Mørk Thomsen Kontraktbaseret Design Anker Mørk Thomsen 5. marts 2014 -2 Kontraktbaseret Design Anker Mørk Thomsen 1. udgave ISBN: 9788740491500 Forord Bogen er blevet til gennem undervisning i faget Kontraktbaseret

Læs mere

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

Jacob Nordfalk. Ingeniørhøjskolen i København. Nykøbing F itvisioncenter 24. februar 2004 Genbrugelige komponenter og designmønstre i Java Jacob Nordfalk Ingeniørhøjskolen i København Nykøbing F itvisioncenter 24. februar 2004 Program Om Jacob Nordfalk introduktion (ikke-teknisk del) Komponentbaseret

Læs mere

Rekursion C#-version

Rekursion C#-version Note til Programmeringsteknologi Akademiuddannn i Informationsteknologi Rekursion C#-version Finn Nordbjerg 1 Rekursion Rekursionsbegrebet bygger på, at man beskriver noget ved "sig selv". Fx. kan tallet

Læs mere

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte

Læs mere

Dag 10 Flertrådet programmering

Dag 10 Flertrådet programmering Videregående programmering i Java Dag 10 Flertrådet programmering Fremlæggelse af programmering/status for projekter Dokumentation med javadoc Flertrådede designmønstre: Arbejdstråd, Producent Konsument,

Læs mere

Om binære søgetræer i Java

Om binære søgetræer i Java Om binære søgetræer i Java Mads Rosendahl 7. november 2002 Resumé En fix måde at gemme data på er i en træstruktur. Måden er nyttig hvis man får noget data ind og man gerne vil have at det gemt i en sorteret

Læs mere

Projekt - Visual Basic for Applications N på stribe

Projekt - Visual Basic for Applications N på stribe Projekt - Visual Basic for Applications N på stribe Mikkel Kaas og Troels Henriksen - 03x 3. november 2005 1 Introduktion Spillet tager udgangspunkt i det gamle kendte 4 på stribe, dog med den ændring,

Læs mere

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

Hvad er et distribueret objekt? Plan 12.3. Objekter, objektreferencer, metoder, parameteroverførsel. Objekter: notation Plan 12.3. Oversigt over grundlæggende begreber Java: eksempel på applikation, programmering og oversættelse Uddybning af grundlæggende begreber Java RMI implementation Forklaring af øvelsen Hvad er et

Læs mere

Crash Course i Programmering. HumTek, RUC

Crash Course i Programmering. HumTek, RUC Crash Course i Programmering HumTek, RUC Kursus mål At give en basal introduktion til programmering i sproget Processing At give et overblik over sprogets potentiale At have det sjovt :-) Kursus form Meget

Læs mere

Introduktion til ActionScript, fortsat

Introduktion til ActionScript, fortsat Introduktion til ActionScript, fortsat Kaspar Rosengreen Nielsen kaspar@interactivespaces.net i n t e r a c t i v e s p a c e s. n e t Kaspar Nielsen, kaspar@interactivespaces.net 1 Dagens program Opsamling

Læs mere

Programmering 2. dprog2 E2012. http://www.cs.au.dk/dprog2/

Programmering 2. dprog2 E2012. http://www.cs.au.dk/dprog2/ Programmering 2 dprog2 E2012 http://www.cs.au.dk/dprog2/ Læringsmål Deltagerne skal ved afslutningen af kurset kunne: forklare og anvende både basale og videregående elementer af et moderne programmeringssprog,

Læs mere

Poly. - Javapakke til behandling af polynomier

Poly. - Javapakke til behandling af polynomier Poly - Javapakke til behandling af polynomier z 3 x y x 2 3 x -3 Skrevet af Susanne Nykjær Knudsen, John Thystrup Jensen, Jens Lykke Brandt, Troels C. Damgaard, Jacob W. Winther og Mikkel Bundgaard Vejleder:

Læs mere

DM502. Peter Schneider-Kamp (petersk@imada.sdu.dk) http://imada.sdu.dk/~petersk/dm502/

DM502. Peter Schneider-Kamp (petersk@imada.sdu.dk) http://imada.sdu.dk/~petersk/dm502/ DM502 Peter Schneider-Kamp (petersk@imada.sdu.dk) http://imada.sdu.dk/~petersk/dm502/ 1 DM502 Bog, ugesedler og noter De første øvelser Let for nogen, svært for andre Kom til øvelserne! Lav opgaverne!

Læs mere

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

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

02101: Indledende programmering. IMM, Danmarks Tekniske Universitet. Læg en studieplan. Dato: 7/12-2007. Gruppenummer: 20

02101: Indledende programmering. IMM, Danmarks Tekniske Universitet. Læg en studieplan. Dato: 7/12-2007. Gruppenummer: 20 Kursus 02101: Indledende programmering. Michael Holm & Mikael Andersen side 1 af 136 Kursus: Institut: 02101: Indledende programmering IMM, Danmarks Tekniske Universitet. Titel: Læg en studieplan Dato:

Læs mere

Klasser. Grundlæggende Programmering med Projekt. Peter Sestoft Tirsdag 2. september 2008. (Tak til Jakob Bardram for nogle slides) Dagens begreber

Klasser. Grundlæggende Programmering med Projekt. Peter Sestoft Tirsdag 2. september 2008. (Tak til Jakob Bardram for nogle slides) Dagens begreber Klasser Grundlæggende Programmering med Projekt Peter Sestoft Tirsdag 2. september 2008 (Tak til Jakob Bardram for nogle slides) Dagens begreber Felt (field) Metode (method) Parameter (parameter) Sætning,

Læs mere

Servlets, Tomcat & BlueJ

Servlets, Tomcat & BlueJ Servlets, Tomcat & BlueJ Tutorial lavet af Jákup W. Hansen TSU 2006 3.semester 05.october 2007 Hvad er Servlets: For at forstå det, må vi først få styr på to begreber, nemlig statiske og dynamiske hjemmesider

Læs mere

Design Systemkald. User-mode Linux, The Linux kernel/325-2004

Design Systemkald. User-mode Linux, The Linux kernel/325-2004 Tracing tråden afbryder systemkaldet via ptrace Systemkaldet til værten ændres til getpid Processens stak manipuleres til at kalde kernen Kernen returnerer til processen Design Systemkald Design Startup/shutdown

Læs mere

Miniprojekt2011. Formålet er at lære og indlære god objektorienteret programudvikling og programmering med Java, samt undervejs at opfylde studiekrav.

Miniprojekt2011. Formålet er at lære og indlære god objektorienteret programudvikling og programmering med Java, samt undervejs at opfylde studiekrav. Miniprojekt2011 Projektbeskrivelse Der skal fremstilles en lille java application på PC, hvor brugeren kan foretage interaktioner med en simpel database på disken via et grafisk brugerinterface. Formålet

Læs mere

Programmering i C Intro og grundlæggende C 5. marts 2007

Programmering i C Intro og grundlæggende C 5. marts 2007 Programmering i C Intro og grundlæggende C 5. marts 2007 Mads Pedersen, OZ6HR mads@oz6hr.dk Plan for kurset Ma. 5/3: Ma. 19/3: Ma. 2/4: To. 12/4: Formål, intro, grundlæggende Videre, sprogkonstruktioner

Læs mere

Udvikling af DOTNET applikationer til MicroStation i C#

Udvikling af DOTNET applikationer til MicroStation i C# Udvikling af DOTNET applikationer til MicroStation i C# Praktiske tips for at komme i gang. Gunnar Jul Jensen, Cowi Hvorfor nu det? Mdl og Vba kan det hele Fordelene er : udviklingsmiljøet er eksternt

Læs mere

Programmering. Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen

Programmering. Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen Programmering Det rent og skært nødvendige, det elementært nødvendige! Morten Dam Jørgensen Oversigt Undervisningen Hvad er programmering Hvordan er et program organiseret? Programmering og fysik Nobelprisen

Læs mere

Skriftlig opgave. Designtanker i database-nære systemer

Skriftlig opgave. Designtanker i database-nære systemer Skriftlig opgave til eksamen for faget»databaser«designtanker i database-nære systemer Martin Ancher Holm Juni 2010 1 Intro Denne skriftlige opgave indeholder kort de daglige tanker jeg har omkring design

Læs mere

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

Grundlæggende Programmering ITU, Efterår 1999. Skriftlig eksamen i Grundlæggende Programmering Skriftlig eksamen i Grundlæggende Programmering ITU, 20. januar 2000 Alle hjælpemidler tilladt, dog ikke datamat. Eksamen er skriftlig, fire timer, og bedømmes efter 13-skalaen. Opgavesættet består af

Læs mere

14.1 Internationale programmer

14.1 Internationale programmer 14.1 Internationale programmer Når et program skal anvendes af flere kulturer og sprog opstår behov for at programtekster, beløb og datoangivelser afhænger af landet og sproget, og man må i gang med at

Læs mere

Induktive og rekursive definitioner

Induktive og rekursive definitioner Induktive og rekursive definitioner Denne note omhandler matematiske objekter, som formelt er opbygget fra et antal basale byggesten, kaldet basistilfælde eller blot basis, ved gentagen brug af et antal

Læs mere

Objektorienterede metoder

Objektorienterede metoder Objektorienterede metoder Gang 13. Adrætte processer Ekstremprogrammering (XP) Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html projektopgaven i OOM Projektvejledning

Læs mere

Object-Relational Mapping

Object-Relational Mapping Databaser for udviklere () Datamatiker TietgenSkolen Underviser: Allan Helboe 06-06-2010 Problemformulering Denne opgave er et forsøg på at beskrive problemerne der opstår ved anvendelsen af en relationel

Læs mere

Kursusarbejde 2 Grundlæggende Programmering

Kursusarbejde 2 Grundlæggende Programmering Kursusarbejde 2 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 31. oktober 2003 Indhold 1. Kode 2 1.1. hotel.h.................................................... 2 1.2. hotel.cc...................................................

Læs mere

Løsningsforslag til Camp Let. Case Beskrivelse: Camp Let

Løsningsforslag til Camp Let. Case Beskrivelse: Camp Let Løsningsforslag til Camp Let Case Beskrivelse: Camp Let Firmaet Camp Let har til formål at udleje forskellige typer transportable ferieboliger. Det drejer sig i øjeblikket om campingbusser, campingvogne,

Læs mere

Indhold. Side 2 af 26

Indhold. Side 2 af 26 Tema Design Design, Programmering og test af Adressebog Fra d. 17 april til 20 april 2012 Vejledere: Gunhild Marie Andersen Kis Boisen Hansen Gruppe B Deltagere Side 1 af 26 Indhold Indledning.... 3 Kodestandard...

Læs mere

Videregående programmering i Java

Videregående programmering i Java Videregående programmering i Java Dag 3 Skabende designmønstre Skabende designmønstre: Fabrikeringsmetode/Fabrik, Singleton, Abstrakt fabrik (Toolkit), Prototype, Objektpulje Eksempel: Forskellige slags

Læs mere

JSR-335: λ-udtryk i Java

JSR-335: λ-udtryk i Java JSR-335: λ-udtryk i Java Morten Heine Sørensen mhs@formalit.dk λ-udtryk i Java Ny feature i Java SE 8. Elegant syntaks for anonyme funktioner. Funktionel stil supplerer objekt-orientering. Alternativ til

Læs mere

Introduktion til Flash, fortsat

Introduktion til Flash, fortsat Introduktion til Flash, fortsat Kaspar Rosengreen Nielsen kaspar@interactivespaces.net Dagens program Opsamling på sidste forelæsning. Vi vil beskæftige os med følgende emner i dagens forelæsning: Komponenter

Læs mere

Databaseadgang fra Java

Databaseadgang fra Java Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,

Læs mere

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int wmid, wmevent; programmering med

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int wmid, wmevent; programmering med LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) int wmid, wmevent; PAINTSTRUCT Introduktion ps; til HDC hdc; programmering med switch (message) case WM_COMMAND: wmid = LOWORD(wParam);

Læs mere

Arkitektur principper og design mønstre til realisering af enterprise applikationer baseret på rige domænemodeller (og.net)

Arkitektur principper og design mønstre til realisering af enterprise applikationer baseret på rige domænemodeller (og.net) Arkitektur principper og design mønstre til realisering af enterprise applikationer baseret på rige domænemodeller (og.net) Kim Harding Christensen EOS A/S Margrethepladsen 3 8000 Århus TLF: 8732 8787

Læs mere

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

PHP 3 UGERS FORLØB PHP, MYSQL & SQL PHP 3 UGERS FORLØB PHP, MYSQL & SQL Uge 1 & 2 Det basale: Det primære mål efter uge 1 og 2, er at få forståelse for hvordan AMP miljøet fungerer i praksis, og hvordan man bruger PHP kodesproget til at

Læs mere

Web- og serverprogrammering

Web- og serverprogrammering Web- og serverprogrammering Arkitekturer i webprogrammer - dag 6 Model-View-Controller-arkitukturen Flerlags-arkitekturer Læsning: WJSP 10 Dette materiale er under Åben Dokumentlicens, se http://www.sslug.dk/linuxbog/licens.html

Læs mere

Roskilde Tekniske Gymnasium. Eksamensprojekt. Programmering C niveau

Roskilde Tekniske Gymnasium. Eksamensprojekt. Programmering C niveau Roskilde Tekniske Gymnasium Eksamensprojekt Programmering C niveau Andreas Sode 09-05-2014 Indhold Eksamensprojekt Programmering C niveau... 2 Forord... 2 Indledning... 2 Problemformulering... 2 Krav til

Læs mere

Optimering af fraværsregistrering

Optimering af fraværsregistrering Journal Optimering af fraværsregistrering Eksamensprojekt i Programmering C, klasse 3.4, 2011 AFLEVERET 09-05-2014 Indhold Abstract... Fejl! Bogmærke er ikke defineret. Problemformulering... 2 Produktet...

Læs mere

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben

Google App Engine. Google App Engine som platform. Claus Myglegaard Vagner og Jacob von Eyben GoogleAppEngine GoogleAppEnginesomplatform ClausMyglegaardVagnerogJacobvonEyben Abstract CloudcomputingerenteknologidervinderfremidengenerelleITinfrastruktur. SocialemediersåsomLinkedIn,TwitterogFacebookharøgetbehovetfor

Læs mere

Noter og opgaver. Programmering A IMADA. Niels Kjeldsen & Jacob Aae Mikkelsen. Med grundig korrektur og rettelser af Edmund Christiansen

Noter og opgaver. Programmering A IMADA. Niels Kjeldsen & Jacob Aae Mikkelsen. Med grundig korrektur og rettelser af Edmund Christiansen Programmering A IMADA Noter og opgaver Niels Kjeldsen & Jacob Aae Mikkelsen Med grundig korrektur og rettelser af Edmund Christiansen Noter til Programmering A INDHOLD Indhold 1 Indledning 3 2 Kom i gang

Læs mere

Kursusarbejde 3 Grundlæggende Programmering

Kursusarbejde 3 Grundlæggende Programmering Kursusarbejde 3 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 21. november 2003 Indhold 1. Kode 2 1.1. forestillinger.h............................................. 2 1.2. forestillinger.cc.............................................

Læs mere

Software Design (SWD) Spørgsmål 1

Software Design (SWD) Spørgsmål 1 Spørgsmål 1 Unified Process Du skal give en beskrivelse af Unified Process. Beskrivelsen skal indeholde forklaring på følgende begreber: Phase Iteration Discipline Activity Milestone Artifact Spørgsmål

Læs mere

vil jeg blive mindet om det af VBA allerede mens jeg skriver koden, da der er tale om en såkaldt kompileringsfejl:

vil jeg blive mindet om det af VBA allerede mens jeg skriver koden, da der er tale om en såkaldt kompileringsfejl: Fejlhåndtering Selv de bedste programmører laver af og til fejl! Dette kommer sikkert som en overraskelse for de fleste, bortset fra de, der har arbejdet med et hvilket som helst større program. Fejl kan

Læs mere

Integer.parseInt(args[0]) konverterer tegnstreng (f.eks. "10") til heltal (10). if (udtryk) else

Integer.parseInt(args[0]) konverterer tegnstreng (f.eks. 10) til heltal (10). if (udtryk) else Programmering 1999 Forelæsning 2, fredag 3. september 1999 Betingede ordrer: if-, if Indlejrede betingede ordrer Løkker med begrænset iteration: for Løkker med ubegrænset iteration: while Betingede ordrer,

Læs mere

Bypassing the. Brian Marick

Bypassing the. Brian Marick Bypassing the GUI Brian Marick Problemer med GUI GUI er designet for mennesker, ikke automatisering Automatiseret test af GUI kræver specialiseret værktøjer Har tildens til at bryde ned når der sker ændringer

Læs mere

Dynamisk programmering

Dynamisk programmering Dynamisk programmering Dynamisk programmering Et algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer. Har en hvis lighed med divide-and-conquer: Begge opbygger løsninger til større problemer

Læs mere

Model Drevet Design i Praksis

Model Drevet Design i Praksis Model Drevet Design i Praksis Dansk IT - På Vej Hjem møde d. 8/9-2009 Jeppe Cramon - TigerTeam ApS Lidt om mig 15 års erfaring som software udvikler Partner i TigerTeam Første erfaring med model drevet

Læs mere

Fra idé til virkelig med Azure Mobile Services

Fra idé til virkelig med Azure Mobile Services Fra idé til virkelig med Azure Mobile Services Niels Ladegaard Beck Holion nlb@holion.dk @nielslbeck Windows Developers in Denmark Azure App Service Mobile App Introduktion til Azure Mobile Services Platform

Læs mere

2 Abstrakte datatyper.

2 Abstrakte datatyper. 2 Abstrakte datatyper. Motivere eksempel: top-down udvikling af program 'mini-bank' Strukturering af et program: efter data eller funktion? Definition af en abstrakt datatype og tilknyttede begreber. Fænomener,

Læs mere

Martin Geisler. Uge 49, 2001

Martin Geisler. Uge 49, 2001 Min dintprog-browser Martin Geisler Uge 49, 2001 Resumé Dette dokument beskriver tankerne bag min dintprog-browser, en browser skrevet i Java der skal kunne fortolke en mindre delmængde af HTML 4, kaldet

Læs mere

Brugervejledning til Design Manager Version 1.02

Brugervejledning til Design Manager Version 1.02 Brugervejledning til Design Manager Version 1.02 Indholdsfortegnelse 1. Introduktion... 3 1.1 Det kan du med HostedShop Design Manager... 3 1.2 Feature list... 3 2. Design... 4 3. Filer og CSS... 4 3.1

Læs mere

Advanced Sitecore Google Maps

Advanced Sitecore Google Maps Advanced Sitecore Google Maps WCAG Edition Version 2.2 Brugervejledning 1 / 49 1 Indholdsfortegnelse 1 Indholdsfortegnelse... 2 2 Forord... 4 2.1 Hvad er nyt?... 5 3 Oprettelse af kort... 6 3.1 Kort centrum

Læs mere

Kommentar fra KMS til Specifikation af Serviceinterface for Person

Kommentar fra KMS til Specifikation af Serviceinterface for Person Kommentar fra KMS til Specifikation af Serviceinterface for Person Organisation Side Kapitel Afsnit/figur/tabel /note Type af kommentar (generel (G), redaktionel (R), teknisk (T)) Kommentar KMS-1 G Godt

Læs mere

Grundlæggende OOA - OOD

Grundlæggende OOA - OOD Grundlæggende OOA - OOD Dette kursus henvender sig til personer, der har lille eller ingen erfaring med softwareudvikling. Med udgangspunkt i UML opbygges et solidt kendskab til softwareudviklingens kunst

Læs mere

Digital post Snitflader Bilag A5 - REST HTTP returkoder Version 6.3

Digital post Snitflader Bilag A5 - REST HTTP returkoder Version 6.3 Digital post Snitflader Bilag A5 - REST HTTP returkoder Version 6.3 1 Indholdsfortegnelse INDHOLDSFORTEGNELSE 2 A5.1 INTRODUKTION 4 A5.2 HTTP RETURKODER 4 A5.3 DIGITAL POST FEJLKODER 7 A5.3.1 DIGITAL POST

Læs mere

RMI med BlueJ. Tutorial lavet af Jákup W. Hansen TSU 2006 3.semester 11. desember 2007

RMI med BlueJ. Tutorial lavet af Jákup W. Hansen TSU 2006 3.semester 11. desember 2007 RMI med BlueJ Tutorial lavet af Jákup W. Hansen TSU 2006 3.semester 11. desember 2007 Hvad er RMI? Når man arbejder med Distribuerede Systemer, som igen vil sige at man ønsker at flere end én komputer

Læs mere

IT-Basecamp 2013. Real World Java EE Patterns Adam Bien. Real World Java EE Patterns, Adam Bien Copyright Lund&Bendsen A/S

IT-Basecamp 2013. Real World Java EE Patterns Adam Bien. Real World Java EE Patterns, Adam Bien Copyright Lund&Bendsen A/S IT-Basecamp 2013 Real World Java EE Patterns Adam Bien 1 Indhold Lidt om mig Baggrund for valg af emnet Bogens opbygning Fra J2EE til JEE 5/6 Overflødiggjorte patterns Fremhæve et par patterns 2 Kenneth

Læs mere

Noter. Indhold. Oktober 2009

Noter. Indhold. Oktober 2009 Noter Oktober 2009 Dette er en samling af noter skrevet til kurset Programmering 2 som supplement til den anvendte lærebog. Java-kildeteksten for de anvendte programeksempler kan nås via WWW: http://www.cs.au.dk/dprog2/eksempler/

Læs mere

Start på Arduino og programmering

Start på Arduino og programmering Programmering for begyndere Brug af Arduino Start på Arduino og programmering EDR Hillerød Knud Krogsgaard Jensen / OZ1QK 1 Start på Arduino og programmering Sidste gang (Introduktion) Programmeringssproget

Læs mere

Dokumentering af umbraco artikeleksport:

Dokumentering af umbraco artikeleksport: Dokumentering af umbraco artikeleksport: Lav en artikel side 2-3. Installationsguide side 3-5. Opsættelse af databasen og web.config side 5-8. Umbraco: templates side 8. Umbraco: borger.dk tab side 8.

Læs mere

Introduktion Til Konkurrenceprogrammering

Introduktion Til Konkurrenceprogrammering Introduktion Til Konkurrenceprogrammering Søren Dahlgaard og Mathias Bæk Tejs Knudsen {soerend,knudsen}@di.ku.dk Version 0.1 Indhold Indhold i Introduktion 1 1 Palindromer 3 1.1 Introduktion til Python...............

Læs mere

Rejsekort A/S idekonkurence Glemt check ud

Rejsekort A/S idekonkurence Glemt check ud Rejsekort A/S idekonkurence Glemt check ud 9. marts 2015 1 Indhold 1 Introduktion 4 1.1 Problembeskrivelse........................ 4 1.2 Rapportens opbygning...................... 4 2 Ordliste 5 3 Løsning

Læs mere

Objektorienteret programmering!

Objektorienteret programmering! Objektorienteret programmering! Introduktion! Plan!! Generelt om programmeludvikling!! Objekter og klasser (begreber)!! Objektorienteret programmeludvikling!! Programmering i Java! 1! 2! Aforisme! Programmeludvikling!

Læs mere

FESD-standardiseringsgruppen Att: Palle Aagaard IT- og Telestyrelsen IT-strategisk kontor Holsteinsgade 63 2100 København Ø

FESD-standardiseringsgruppen Att: Palle Aagaard IT- og Telestyrelsen IT-strategisk kontor Holsteinsgade 63 2100 København Ø FESD-standardiseringsgruppen Att: Palle Aagaard IT- og Telestyrelsen IT-strategisk kontor Holsteinsgade 63 2100 København Ø Høringssvar vedr. FESD GIS-integrationsmodel version 2.0 Geodata Danmark har

Læs mere

educasoft - en professionel samarbejdspartner med speciale i uddannelse!

educasoft - en professionel samarbejdspartner med speciale i uddannelse! Velkommen til educasoft's hjemmeside educasoft - en professionel samarbejdspartner med speciale i uddannelse! Professionelle undervisere Undervisning i virksomheden Undervisning dag/aften eller week-end

Læs mere

Start af nyt schematic projekt i Quartus II

Start af nyt schematic projekt i Quartus II Start af nyt schematic projekt i Quartus II Det følgende er ikke fremstillet som en brugsanvisning der gennemgår alle de muligheder der er omkring oprettelse af et Schematic projekt i Quartus II men kun

Læs mere

Brugervejledning for Microstation til OpenSceneGraph konverter

Brugervejledning for Microstation til OpenSceneGraph konverter Brugervejledning for Microstation til OpenSceneGraph konverter - sidste rettelse: 10/06/2005 side 1 Indholdsfortegnelse Kort oversigt over dgn2osg... 3 Systemkrav... 3 Funktionalitet...4 Geometri...4 Materialer...

Læs mere

Algoritmer og datastrukturer Course No. 02105 Cheat Sheet 2012. May 15, 2012

Algoritmer og datastrukturer Course No. 02105 Cheat Sheet 2012. May 15, 2012 Algoritmer og datastrukturer Course No. 02105 Cheat Sheet 2012 May 15, 2012 1 CONTENTS 2012 CONTENTS Contents 1 Kompleksitet 3 1.1 Køretid................................................ 3 1.2 Asymptotisk

Læs mere

Introduktion til MatLab Matematisk Modellering af Dynamiske Modeller ved Kasper Bjering Jensen, RUC, februar 2010

Introduktion til MatLab Matematisk Modellering af Dynamiske Modeller ved Kasper Bjering Jensen, RUC, februar 2010 Introduktion til MatLab Matematisk Modellering af Dynamiske Modeller ved Kasper Bjering Jensen, RUC, februar 2010 Computere er uvurderlige redskaber for personer der ønsker at arbejde med matematiske modeller

Læs mere

Introduktion til C programmering

Introduktion til C programmering Introduktion til C programmering Rasmus Erik Voel Jensen Uge 17 voel@math.ku.dk Dagens forelæsning Formalia Indledende programmering, main, include, printf, variable, scanf, if-else, statements, eksempler

Læs mere

Multiple Choice Prøver

Multiple Choice Prøver Teori og Praksis for Multiple Choice Prøver Michael I. Schwartzbach Multiple Choice ved Datalogi Anvendt i mange datalogikurser siden 2006: Oversættelse Databaser Webteknologi Programmingssprog Dynamiske

Læs mere

Komplekse tal og Kaos

Komplekse tal og Kaos Komplekse tal og Kaos Jon Sporring Datalogisk Institut ved Københavns Universitet Universitetsparken 1, 2100 København Ø August, 2006 1 Forord Denne opgave er tiltænkt gymnasiestuderende med matematik

Læs mere

Administration af subsites BRUGERVEJLEDNING FOR ADMINISTRATOREN

Administration af subsites BRUGERVEJLEDNING FOR ADMINISTRATOREN Administration af subsites BRUGERVEJLEDNING FOR ADMINISTRATOREN Indholdsfortegnelse Introduktion... 2 Definitioner... 2 Generelt... 3 Oprettelse af en skabelon... 4 Sidetypeskabeloner... 5 Globale displaymoduler...

Læs mere

Casper Fabricius http://casperfabricius.com. ActiveRecord. O/RM i Ruby on Rails

Casper Fabricius http://casperfabricius.com. ActiveRecord. O/RM i Ruby on Rails Casper Fabricius http://casperfabricius.com ActiveRecord O/RM i Ruby on Rails Casper Fabricius Freelance webudvikler - casperfabricius.com 9 års erfaring med webudvikling 6 år med ASP/ASP.NET/C# 3 år med

Læs mere

Model og Metode til Programudvikling. Jens Dalsgaard Nielsen

Model og Metode til Programudvikling. Jens Dalsgaard Nielsen Model og Metode til Programudvikling v/ Jens Dalsgaard Nielsen 1 Hvem er vi? Jens Dalsgaard Nielsen, Afd for Proceskontrol, I8 Distribuerede RT-Systems group Realtid, kerner, operativsystemer, netværk,..

Læs mere

Håndbog Til CPR services. Bilag 8 GCTP-standard m.m. CPR-kontoret

Håndbog Til CPR services. Bilag 8 GCTP-standard m.m. CPR-kontoret Håndbog Til CPR services Bilag 8 GCTP-standard m.m. CPR-kontoret Datavej 20, Postboks 269, 3460 Birkerød E-post: cpr@cpr.dk. Telefax 45 82 51 10. Hjemmeside: www.cpr.dk Side 2 af 14 Indholdsfortegnelse

Læs mere

Intelligent House Control System

Intelligent House Control System OOPJ-E-1 F2003 Side 1 af 38 Intelligent House Control System udført af Kim Damgaard Indholdsfortegnelse Intelligent House Control System... 1 Indholdsfortegnelse... 1 Indledning... 2 Problemformulering...

Læs mere

Programmering I Java/C#

Programmering I Java/C# Programmering I Java/C# Dit første projekt Datatekniker Intro to C# C# (C Sharp) Et enkelt, moderne, generelt anvendeligt, objektorienteret programmeringssprog Udviklet af Microsoft, ledet af danskeren

Læs mere

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13 1 Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Hvad er en makro... 10 Hvad kan du bruge en makro til... 10 Hvad en makro er (Visual Basic for Applications)... 11 Det hele sker

Læs mere

Lav dine egne hjemmesider/websider

Lav dine egne hjemmesider/websider Sider, der skal publiceres på World Wide Web, laves i et særligt format, html, som fortæller browseren, hvordan den skal vise tekst og billeder. Html (Hypertext markup language) er meget fleksibelt og

Læs mere

poedit og oversættelse af sprogfiler

poedit og oversættelse af sprogfiler poedit og oversættelse af sprogfiler af Georg S. Adamsen WordPress.Blogos.dk 2009 http://kortlink.dk/wordpressblogosdk/6g38 1 af 11 14-04-2009 14:55 Jeg får af og til spørgsmål om, hvordan man bruger poedit,

Læs mere

Introduktion Indtastning Funktioner Scripts Optimering. Matlab

Introduktion Indtastning Funktioner Scripts Optimering. Matlab - robert@math.aau.dk http://www.math.aau.dk/ robert/teaching/2010/matlab 9. august 2010 1/39 Disposition 1. Lidt om. 2. Basiskursus. 3. Opgaver. 4. Mere til basiskursus. 5. Opgaver. 2/39 MATLAB = MATrix

Læs mere

Indholdsfortegnelse PSpice modul 3. Forudsætninger. Forberedelse til øvelser

Indholdsfortegnelse PSpice modul 3. Forudsætninger. Forberedelse til øvelser Indholdsfortegnelse PSpice modul 3 Model Editor, opret diode ud fra model fundet på internettet.... 2 Parametrisk Analyse... 6 Ekstra - Parametrisk analyse på diode parameter... 9 Forudsætninger For at

Læs mere

Database for udviklere. Jan Lund Madsen PBS10107

Database for udviklere. Jan Lund Madsen PBS10107 Database for udviklere Jan Lund Madsen PBS10107 Indhold LINQ... 3 LINQ to SQL og Arkitektur... 3 O/R designere... 5 LINQ Den store introduktion med.net 3.5 er uden tvivl LINQ(udtales link): Language-INtegrated

Læs mere

Arbejd videre med statistik

Arbejd videre med statistik Danmarks Statistik databanker@dst.dk Arbejd videre med statistik Vejledning i PC-AXIS og Statistikbanken Danmarks Statistik juni 2003 1 www.dst.dk www.statistikbanken.dk Indholdsfortegnelse INDHOLDSFORTEGNELSE...2

Læs mere

Spil Master Mind. Indledning.

Spil Master Mind. Indledning. side 1 af 16 Indledning. Spillet som denne rapport beskriver, indgår i et større program, der er lavet som projekt i valgfaget programmering C på HTX i perioden 9/11-98 til 12/1-99. Spillet skal give de

Læs mere

Indhold. 1 Indledning... 3. 1.1 Kompatible browsere... 3. 2 Log ind i Umbraco... 3. 3 Content-delen... 4. 3.1 Indholdstræet... 4

Indhold. 1 Indledning... 3. 1.1 Kompatible browsere... 3. 2 Log ind i Umbraco... 3. 3 Content-delen... 4. 3.1 Indholdstræet... 4 Indhold 1 Indledning... 3 1.1 Kompatible browsere... 3 2 Log ind i Umbraco... 3 3 Content-delen... 4 3.1 Indholdstræet... 4 3.2 Ændring af indhold... 5 3.3 Tilføjelse af en side/sektion... 6 3.4. At arbejde

Læs mere

Åben uddannelse, Efterår 1996, Oversættere og køretidsomgivelser

Åben uddannelse, Efterår 1996, Oversættere og køretidsomgivelser 3/10/96 Seminaret den 26/10 vil omhandle den sidste fase af analysen og de første skridt i kodegenereringen. Det drejer sig om at finde betydningen af programmet, nu hvor leksikalsk og syntaktisk analyse

Læs mere

Programmering, algoritmik og matematik en nødvendig sammenblanding?

Programmering, algoritmik og matematik en nødvendig sammenblanding? Programmering, algoritmik og matematik en nødvendig sammenblanding? Oplæg til IDA møde, 29. november 2004 Martin Zachariasen DIKU 1 Egen baggrund B.Sc. i datalogi 1989; Kandidat i datalogi 1995; Ph.D.

Læs mere

DATALOGI 1F. Skriftlig eksamen tirsdag den 10. juni 2003 1 25 % 2 10 % 3 25 % 4 10 % 5 30 %

DATALOGI 1F. Skriftlig eksamen tirsdag den 10. juni 2003 1 25 % 2 10 % 3 25 % 4 10 % 5 30 % Københavns Universitet Naturvidenskabelig Embedseksamen DATALOGI 1F Skriftlig eksamen tirsdag den 10. juni 2003 Opgave Vægtning 1 25 % 2 10 % 3 25 % 4 10 % 5 30 % Alle de sædvanlige hjælpemidler må benyttes,

Læs mere